生成器与for循环的纠葛

生成器这个东西,当你做了个生成器:

什么样子是生成器呢

1.生成器函数

2.推导式里面含个生成器

什么时候开始用呢?

1. list方法

2. 列表生成式

 

 

我先放例题了

v = [lambda :x for x in range(10)]
print(v)
print(v[0])
print(v[0]())

lambda   参数  :返回值

拆解:

f = lambda   :x for x in range(10)   

现在我们称 f 这个函数  参数为零  返回值是 x for  x in  range(10)

print(lambda :x for x in range(10))
#结果 <generator object <genexpr> at 0x037B6900>

上面这个是一个已经循环完了的生成器

 

 

例题

登陆注册 

在读取文件内容时,可以用生成器

# import hashlib
# import os
# def open_file():
#     with open('info',encoding='utf-8') as f1:
#         for line in f1:
#             v1,v2 = line.split(' ')
#             yield v1,v2  这里
# def md5(password):
#     md5 = hashlib.md5('*'.encode('utf-8'))
#     md5.update(password.encode('utf-8'))
#     return md5.hexdigest()
# def register():
#     user = input('user')
#     psw = input('password')
#     for username,password in open_file(): 这里
#         if user == username:
#             print('用户名已经存在')
#             break
#     else:
#         with open('info','a',encoding='utf-8') as f2:
#             f2.write(user+' ')
#             f2.write(md5(psw))
#     print('注册成功')
# def login():
#     user = input('user')
#     psw = input('password')
#     for username,password in open_file():   这里
#         if user == username and md5(psw) == password:
#             print('登陆成功')
#             break
#     else:
#         print('登陆错误,没有找到用户名')
# register()
# login()

 补充两面试题

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

 第一道 代码从上往下执行,g1,g2 都是生成器, 两个生成器到了print 位置才执行,第一次 g1执行,结果已经执行完,第二个g2,就收不到任何结果

def add(n,i):   #加法运算的函数
    return n+i
def test():      #生成器函数
    for i in range(4):
        yield i
g=test()      #获取这个生成器 
for n in [1,10]:
    g=(add(n,i) for i in g)   # 将上面那个生成器给了g 因为这是个推导式 ,
                  #所以这个变成了一个内嵌上面这个g的新的生成器,但是生成器都没被调用所以没执行,
                  但是n在两次循环的时候变为10
print(list(g))           #开始调用生成器,此时 n已经变成10了 调用方法此时 i+n 再次加了一个n,所以你懂得,变成 20 21 22 23
posted @ 2019-03-25 20:05  帅气的小神气  阅读(558)  评论(0编辑  收藏  举报