zoukankan      html  css  js  c++  java
  • 生成器 三元表达式 列表生成式 匿名函数 内置函数

    生成器

    1.什么是生成器?

    ​ -生成的工具

    ​ -生成器是一个自定义的迭代器,本质上是一个迭代器。

    2.如何实现生成器?

    	-但凡在函数内定义的yield
    

    ​ -调用函数时,函数体代码不会执行

    ​ 会返回一个结果,这个结果就是生成器。

    3.yield

    ​ -每一次的yield都会往生成器对象中添加一个值。

    ​ -yield只能在函数内定义

    ​ -yield可以保存函数的暂停状态

    yield和return的对比

    ​ -相同点:

    ​ 返回值的是不限制的;

    ​ -不同点

    ​ return一次只可以返回一次值,yield可以返回多个值juli

    自定义的迭代器
    def func():
        print('from func')
        yield 'tank'
    
    
    res = func()
    print(res)
    >>>>>>>
    <generator object func at 0x000001C66A88BA98>####生成器
    
    # 当我们通过__next__取值时,才会执行函数体代码。
    def func():
        print('from func')
        yield 'tank'
    
    
    res = func()
    print(res.__next__())
    >>>>>>>>>
    from func
    'tank'
    
    

    举例

    def func():
        print('开始准备下蛋')
        print('1---火鸡蛋1')
        yield '火鸡蛋1'######yield具有暂停函数的状态,打印一次,执行一次,最后一次打印完报错
        print('2---火鸡蛋2')
        yield '火鸡蛋2'
        print('3---火鸡蛋3')
        yield '火鸡蛋3'
        print('取最后一个蛋, 查看是否有')
    res = func()
    print(res.__next__())
    >>>>>>>>>>
    开始准备下蛋
    1---火鸡蛋1
    火鸡蛋1
    
    
    
    python2: range(1, 5) ---> [1, 2, 3, 4]
    python3: range(1, 5) ---> range对象 ---> 生成器 ---> 迭代器
    

    三元表达式

    可以将if....else.....的分支变成一行

    语法:

    ​ -条件成立返回左边的值 if 判断条件 else 条件不能成立 返回右边的值

    比较2个值的大小
    def max2(num1, num2):
        if num1 > num2:
            return num1
        else:
            return num2
    max2(2,3)
    print(max2(2,3))
    >>>>>>>>
    3
    可以用下面的方法代替
    三元表达式
    def max2(num1, num2):
        res = num1 if num1 > num2 else num2
    max2(2,3)
    >>>>>>>>
    3
    

    列表表达式

    -可以一行实现生成列表。

    ​ -语法:

     list = [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
             for的右边是循环次数,并且可以取出可迭代对象中每一个值
             for的左边可以为当前列表添加值
            list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]
            list = [值 for 可迭代对象中取出每一个值in 可迭代对象]
            list = [任意的值 for 可迭代对象中取出每一个值in 可迭代对象]
    
    l1 = [1,2,3,4,5]
    这个列表做成一个新的列表
    普通的方法
    l1 = [1,2,3,4,5]
    new_l1 = []
    for i in l1:
        new_l1.append(i)
    print(new_l1)
    >>>>>
    [1, 2, 3, 4, 5]
    
    列表的表达式
    l1 = [1,2,3,4,5]
    
    l2 = [i for i in l1]
    print(l2)
    >>>>>
    [1, 2, 3, 4, 5]
    
    
    
    #把一个列表的后缀都加上一个2
    l1 = [1,2,3,4,5]
    l2 = [i + 2 for i in l1 ]
    print(l2)
    >>>>>>
    [3, 4, 5, 6, 7]
    
    #把一个列表的后缀都加上'dsb'
    l1 = ['david','jacon','jackson']
    l2 = [name + 'dsb' for name in l1]
    print(l2)
    >>>>>>>
    ['daviddsb', 'jacondsb', 'jacksondsb']
    

    生成器的表达式

    -生成一个生成器的的对象---->生成一个迭代器对象

    语法:

    ​ (line for line in 可迭代对象)

    ​ -g = (任意值 for in line in 可迭代对象)

    ​ - print(g)#生成器对象

    生成器表达式(生成器生成式):
        - 列表生成式:  若数据量小时采用
            [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
            优点:
                可以依赖于索引取值,取值方便
    
            缺点:
                浪费资源
    
        - 生成器生成式:  若数据量过大时采用
            () ---> 返回生成器
            (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
    
            优点:
                节省资源
    
            缺点:
                取值不方便
                
     #生成一个新的列表
    l1 = [line for line in range(1,6)]
    print(l1)
    >>>>>>>
    [1, 2, 3, 4, 5]
    生成器的表达式
    
    l2 = (line for line in range(1,6))
    print(next(l2))
    print(next(l2))
    print(next(l2))
    print(next(l2))
    >>>>>>>>>>
    1
    2
    3
    4
    
    
    

    内置函数

    python内部提供的内置方法

    range() print() len()

    我们重点学习的是max min sorted map filter

    max求可迭代对象最大值   
    max内部会将list1中的通过for取出每一个值,并且进行判断
    min是求可迭代对象的最小值 
    
    
    #求一个列表专中的最大值和最小值
    l1 = [2,3,4,6,7]
    print(max(l1))
    print(min(l1))
    >>>>>>>>
    7
    2
    

    sorted 对可迭代对象中的数据进行排序,默认的是升序

    reverse = True :降序

    #把一个列表里面的值排序 升序和降序   reverse:反转 reverse默认是False
    l1 = [9,3,4,6,7]
    # print(max(l1))
    # print(min(l1))
    print(sorted(l1))
    print(sorted(l1,reverse = True))
    >>>>>>>>>>
    [3, 4, 6, 7, 9]
    [9, 7, 6, 4, 3]
    
    #求一个字典里面的key 和 value 的排序
    d1 = {
        'name': 'david',
        'age': 'twenty',
        'hobby': 'basketball'
    }
    new_dic = sorted(d1, key=lambda x: d1[x])
    print(new_dic)
    
    print(sorted(d1))
    >>>>>>>>>>
    ['hobby', 'name', 'age']  ####这个结果是value的大小比较后,升序排列的key的排序
    ['age', 'hobby', 'name']####这个结果是key的排序
    

    map:映射

    ​ -map(函数的地址,可迭代对象)——>map对象

    ​ -map会将可迭代对象中的每一个值进行修改,然后映射到一个map对象中,再将map对象转变成列表/元组

    name_list = ['egon', 'david', 'jackson', 'alex']
    map_obj = map(lambda name:name + '喜欢吃生蚝' if name == 'egon' else name + '喜欢打球',name_list)
    print(list(map_obj))
    >>>>>>>>>
    ['egon喜欢吃生蚝', 'david喜欢打球', 'jackson喜欢打球', 'alex喜欢打球']
    另外一种方法
    name_list = ['egon', 'david', 'jackson', 'alex']
    list_obj = [name + 'a'if name == 'david'else name +'打篮球' for name in name_list]
    print(list_obj)
    >>>>>>>>>>>>>
    ['egon打篮球', 'davida', 'jackson打篮球', 'alex打篮球']
    

    reduce:合并

    ​ reduce(函数的地址,可迭代对象,默认值为0)

    ​ reduce(函数地址,可迭代地址,初始值)

    ​ 不能单独使用

    ​ from functools import reduce

    ​ 每次从可迭代对象中获取2个值进行合并

    ​ 初始值:执行reduce 函数时,都是从初始值开始合并的

    求1到100的之和
    j = 0
    
    for i in range(1,101):
        j += i
    print(j)
    >>>>>>>>>
    5050
    
    
    用reduce的方法
    res = reduce(lambda x,y: x+y ,range(1,101),0) ###最后面的0可以改为													其他    x = 0  y执行的是for循环中的值跟x相加
    print(res)
    >>>>>>>>>
    5050
    
    
    res = reduce(lambda x,y: x+y ,range(1,101),2)##默认值改为2
    print(res)
    >>>>>>>>>
    5052
    
    

    filter:过滤

    ​ filter(函数地址,可迭代对象)----->filter 对象 将可迭代对象中的值遍历取出,然后通过判断,若条件成立,过滤获取对应值,并将获取的值 放到一个filter对象中。

    name_list = ['egon_dd', 'david_dd', 'jackson_dd', 'alex']
    l1 = filter(lambda name:name.endswith('_dd'),name_list)
    print(tuple(l1))
    >>>>>>>>
    ('egon_dd', 'david_dd', 'jackson_dd')
    

    匿名函数

    -定义:没有名字函数。

    -lambda x : x+x ——>内存地址
    

    ​ 第一个 x :是参数

    ​ 第二个x+x 是返回值

    ​ 都是以:为分界线

    ​ func = lambda : 这样的函数有名字了 就是有名函数了

    有名函数:

    ​ -def 名字(x):#名字——>内存地址

    ​ 函数名字+()调用,执行函数体代码

    ​ 匿名函数名字,不能单独使用,应该要配合内置函数使用

    d1 = {
        'name': 'david',
        'age': 'twenty',
        'hobby': 'basketball'
    }
    d2 = [max(d1, key=lambda x:d1[x])]  #z这个是max内部的原理  把di的key遍历 发给lambda 得到返回值的value 在进行比较,最后比较后,最大值的key返回出去
    print(d2)
    >>>>>>>>>
    ['age']
    
  • 相关阅读:
    解题报告:POJ1852 Ants
    解题报告:POJ2573 Bridge(分析建模)
    POJ 3321 Apple Tree(树状数组模板)
    PAT1139 First Contact
    POJ3259 SPFA判定负环
    HDOJ2586 最近公共祖先模板
    树的直径与最近公共祖先
    字符数组_随机存储
    青鸟资料下载
    软件测试(4)_LoadRunner使用
  • 原文地址:https://www.cnblogs.com/bs2019/p/11867794.html
Copyright © 2011-2022 走看看