生成器与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