day12{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9}

生成器

生成器的本质就是迭代器

def func ():
    print(1)
    print(9)
    yield 2   #我的函数走到这了
    print(5)
    yield 6   #我的函数走到这了

p=func()#生成一个生成器
print(p.__iter__())    #生成器内存地址
print(p.__next__())    #调用生成器
print(p.__next__())

  range

print([list(range(12))])   #[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]

错误示范

def func():
    print(4)
    yield 2
    print(6)
    print(9)
    yield 5print(q.__iter__())#这样生成一个生成器
print(q.__next__())#这样生成一个生成器
print(q.__next__())#这样生成一个生成器

大批量数据的时候首先要想到生成器

def func():
    print(9)
    print(7)
    yield 1
    print(5)
    yield 2
o=func()   #生成一个生成器
print(o.__next__())   #调用
print(o.__next__())   #调用

碰到return就结束函数

碰到yield不结束就挂起

生成器的好处就是非常省内存

第一次调用生成器的时候使用send里边的值必须是None

def func():
    print(3)
    print(7)
    yield 2
    print(9)
    yield 6
p=func()
print(p.send(None))   #send后面必须写None
print(p.__next__())

附加

def func():
    yield 6
    yield 9
o=func()
ret=o.__next__()
print(ret+8)    #可在print里面直接添加
print(o.__next__())
# ret = func()  # 把生成器的地址给了ret
# print('is ret',ret.__next__())
# # 执行ret这个变量的指向的生成器地址
# print('is ret',ret)
# # 在全局空间找到一个变量叫做ret的,打印它的值 值就是生成器的地址

用生成器读文件

格式如下:

def func():
    with open('xxx文件名','r',encoding='utf-8')as f:
        for i in f:
            i=i.strip('\r\n')
            yield i
o=func()
for i in range(输入想要读取多少行文件):
    print(o.__next__())

推导式

列表推导式:

print([i for i in (range)(12)])
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

集合推导式:

print({i for i in range(10)})
结果:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

字典推导式:

print({i:i+1 for i in range(9)})
结果:
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9}

生成器推导式:

创建生成器

o=(i for i in range(10)) print(o)
结果:
<generator object <genexpr> at 0x000002B5C6B02ED0>

生成器的取值

o=(i for i in range(10))
print(o.__next__()) #0
print(o.__next__()) #1
print(o.__next__()) #2
print(o.__next__()) #3
print(o.__next__()) #4
结果:

0
1
2
3
4

猜你喜欢

转载自www.cnblogs.com/yhq123/p/10543623.html