• 7.生成器,列表推导式


    19.1 生成器初识
    • 生成器本质就是迭代器。python社区生成器与迭代器是一种。生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的。
    19.2 生成器函数
    def func():
    	print(111)
    	return 2
    ret=func()
    print(ret)
    #执行此函数,遇到return结束函数。
    将数字2返回给ret.
    
    def func():
    	print(111)
    	yield 2
    ret=func()#生成器对象
    print(ret)#<generator object func at 0x0000005D8A538468>
    '''
    类比
    l1 = [2,]  [2,3,4,5]
    obj = iter(l1)
    
    '''
    只要函数中出现了yield那么他就不是函数,它是生成器函数。
    一个next对应一个yield
    print(next(ret))
    '''
    111
    2
    '''
    

    yield 直接就可以构建成生成器函数,迭代器需要把一个可迭代对象转化成迭代器,占用内存。

    19.3 return yield对比:

    return 结束函数,函数的执行者返回值(多个值通过元组的形式返回)

    yield 暂停函数,对应着给next返回值(多个值通过元组的形式返回)

    举例说明:

    yield

    def eat_baozi():
        list1 = []
        for i in range(1,2001):
            list1.append(f'{i}号包子')
        return list1
    
    print(eat_baozi())
    
    def eat_baozi_gen():
        for i in range(1,2001):
            # print(11)
            yield f'{i}号包子'
    ret = eat_baozi_gen()
    
    for i in range(200):
        print(next(ret))
    
    for i in range(200):
        print(next(ret))
    '''
    1号包子
    2号包子
    3号包子
    4号包子
    5号包子
    6号包子
    7号包子
    8号包子
    9号包子
    10号包子
    11号包子
    '''
    400号包子
    
    '''
    def func():
        l1 = [1, 2, 3]
        yield l1
    ret = func()
    '''
    [1, 2, 3]
    
    '''
    
    19.4 yield from
    def func():
        l1 = [1, 2, 3]
        yield from l1
    
        '''
        yield 1
        yield 2
        yield 3
        '''
    ret = func()
    print(next(ret))
    print(next(ret))
    print(next(ret))
    '''
    1
    2
    3
    '''
    yield : 对应next给next返回值
    yield from 将一个可迭代对象的每一个元素返回给next
    yield from 节省代码,提升效率(代替了for循环)
    

    20.列表推导式

    l1 = [1,2,3......100]
    l1 = []
    for i in range(1,101):
        l1.append(i)
    print(l1)
    列表推导式:
    l1=[i for i in range(1,101)]
    print(l1)
    两种构建方式:
    1.循环模式:[变量(加工后的变量) for 变量 in interable]
    2.筛选模式:[变量(加工后的变量) for 变量 in interable if 条件] 
    

    例题:

    循环模式:
    将10以内所有整数的平方写入列表。
    print([i**2 for i in range(1, 11)])
    100以内所有的偶数写入列表.
    print([i for i in range(2, 101, 2)])
    从python1期到python100期写入列表list
    print([f'python{i}期' for i in range(1, 101)])
    2.筛选模式:
    print([i for i in range(1, 101) if i > 49])
    三十以内可以被三整除的数。
    print([i for i in range(1, 31) if i % 3 == 0])
    过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
    print([i.upper() for i in l1 if len(i) > 3])
    
    找到嵌套列表中名字含有两个‘e’的所有名字(有难度)
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    l1 = []
    for i in names:
        for j in i:
            if j.count('e') > 1:
                l1.append(j)
    print(l1)
    print([j for i in names for j in i if j.count('e') > 1])
    
    列表推导式的优缺点:
    优点:    
    1, 简单,快捷,装b。
    缺点:  
    2. 可读性不高,不好排错。慎用,不要入迷。
    

    21.生成器表达式。

    与列表推导式几乎一模一样。
    循环模式,筛选模式。

    obj = (i for i in range(1, 11))
    print(obj)
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    如何触发生成器(迭代器)取值?
    1. next(obj)
    2. for 循环
    for i in obj:
        print(i)
    3. 数据转化
    print(list(obj))
    生成器表达式:生成器 节省内存
  • 相关阅读:
    爱奇艺首页导航轮播特效
    闭包的应用
    时间日期Date类型
    php连接数据库
    封装cookie.js、EventUtil.js、
    时间日期格式
    mysql数据库修改密码
    jquery选择器的使用
    用js完成blog项目
    Hibternate框架笔记
  • 原文地址:https://www.cnblogs.com/pythonblogs/p/11085016.html
Copyright © 2020-2023  润新知