zoukankan      html  css  js  c++  java
  • 生成器与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
  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10566864.html
Copyright © 2011-2022 走看看