第四周~迭代器和生成器

生成器;

def func():
    print("111")
    return 222
ret = func()
print(ret)
#结果:
#    111
#    222

#将return 换成 yield就是生成器
def func():
    print("111")
    yield 222
ret = func()
print(ret)

#结果:
#<generator object func at 0x0000025256283A40>

以上两段代码执行的结果不一样. 因为下面的代码有yield,所以这个函数就是一个生成器函数.这个时候再执行这个函数,就不在是函数的执行了.而是获取这个生成器.

  所以要想运行这个函数,就要执行__next__()函数来执行函数

生成器表达式和列表推导式的区别:

  1. 列表推导式比较耗内存. ⼀次性加载. 生成器表达式几乎不占用内存. 使用的时候才分配和使用内存

  2. 得到的值不⼀样. 列表推导式得到的是⼀个列表. 生成器表达式获取的是⼀个生成器. 

  生成器的惰性机制:生成器只有在访问的时候才取值. 说白了就是找他要他才给值,不要的话,他是不会执行的

生成器可以使用for循环来循环获取内部的元素:

def func():
    print(111)
    yield 222
    print(333)
    yield 444
    print(555)
    yield 666
gen = func()
for i in gen:
    print(i)

#结果:
#    111
#    222
#    333
#    444
#    555
#    666

2、列表推导式

列表推导式:最终给的是列表

  语法:  [最终结果(变量) for 变量 in 可迭代对象]

lst = []
for i in range(1,15):
    lst.append("python%s" % i)
print(lst)
#结果:
#['python1', 'python2', 'python3', 'python4', 'python5', 'python6', 'python7', 'python8', 'python9', 'python10', 'python11', 'python12', 'python13', 'python14']

  总结:

    推导式有列表推导式,字典推导式,集合推导式,没有元组推导式

    生成器表达式:(结果 for 变量 in 可迭代对象 if 条件筛选)

    生成器表达式可以直接获取到生成器对象,生成器可以直接进行for循环. 生成器具有惰性机制

猜你喜欢

转载自www.cnblogs.com/ilovelh/p/10255784.html