美文网首页
python 生成器

python 生成器

作者: Noza_ea8f | 来源:发表于2020-03-20 20:05 被阅读0次

实例

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')这个生成器函数,所以有值被输出了;

生成器是程序员写的迭代器

相关文章

网友评论

      本文标题:python 生成器

      本文链接:https://www.haomeiwen.com/subject/alssyhtx.html