• 生成器与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
  • 相关阅读:
    [Asp.net]站点地图SiteMap
    [Asp.Net]最近一个项目的总结
    [Asp.net]说说密码框和只读框
    [工具]推荐一款查看dll依赖工具
    [工具]Serv-U配置教程
    [NHibernate]Nullables
    [NHibernate]NHibernate.Tool.hbm2net
    [NHibernate]使用AttributeNHibernate.Mapping.Attributes
    delphi跨平台SOCKET--System.Net.Socket
    INDY9发送tstream
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10566864.html
Copyright © 2020-2023  润新知