实例
def get_userinfo(filepath):
'''
用于从文件中取值,每次读取一行
:param filepath:
:return:
'''
with open(filepath, mode='r', encoding='utf-8') as f:
for line in f:
username, password = line.strip().split('|')
yield username, password
def login():
user = input('请输入用户名:')
pwd = input('请输入密码:')
# 由于yield每次只返回一个结果,所以节省了内存,其实yield的主要功能就是节省内存
for username, password in get_userinfo(filepath='userinfo'):
if user == username and pwd == password:
print('登录成功!')
break
else:
print('登录失败!')
break
login()
函数get_userinfo()实现了一行一行返回数据;
最好把所有读文件的操作都写成生成器!
生成器中的数据只能从头到尾取一次
data = get_userinfo('userinfo')
for i in data:
print('第一次')
print(i)
for i in data:
print('第二次')
print(i)
我循环并打印了两次,但是只有一次输出
output
第一次
('a', '123')
第一次
('b', '456')
这里主意data = get_userinfo('userinfo')只调用了一次生成器,所以第二次循环时data的值已经被取空了,因此没有输出
如果修改一下程序
data = get_userinfo('userinfo')
for i in data:
print('第一次')
print(i)
for i in data:
print('第二次')
print(i)
for i in get_userinfo('userinfo'):
print('第三次')
print(i)
output
第一次
('a', '123')
第一次
('b', '456')
第三次
('a', '123')
第三次
('b', '456')
第三次相当于重新调用get_userinfo('userinfo')这个生成器函数,所以有值被输出了;
网友评论