• 各种器


    列表生成式:

    lis1 = list(range(10))
    lis2 = [i+1 for i in lis1]
    print(lis2)
    lis3 = [i if i<5 else i*i for i in lis1]
    print(lis3)

    生成器:

    lis2 = (i+1 for i in range(15))  # 生成器的语法
    print(lis2)
    print(next(lis2)) # 每次取一个值,取完还取就会报错
    lis3 = (i if i<5 else i*i for i in range(10))
    for i in lis3:
    print(i)



    def fib(max):
    n,a,b = 0,0,1
    while n < max:
    yield b # 把函数的执行过程冻结在这一步,并且把b的值返回给外面的next()
    a,b = b,a+b
    n = n + 1
    return 'done'
    s = fib(10)
    print(s)
    print('s:',s.__next__())
    for i in s:
    print(i)


    def range2(n):
    count = 0
    while count < n:
    print('count',count)
    count += 1
    yield count
    new_range = range2(10)
    next(new_range)
    next(new_range)
     

    生成器创建方式:

      1.列表生成式

      2.函数生成

    yield vs return:

      return:返回并终止函数,若为生成器则终止生成器并且报错

      yield:返回数据,并冻结当前的执行过程。。。

    函数有了yield后:

      1.函数加()就得到了一个生成器,

      2.return 在生成器里,代表生成器的终止,直接报错

    def range2(n):
    count = 0
    while count < n:
    # print('count',count)
    count += 1
    yield count
    print('----')
    return 222
    new_range = range2(3)
    n1 = next(new_range)
    print(n1)
    n2 = next(new_range)
    print(n2)
    n3 = next(new_range)
    print(n3)
    n4 = next(new_range)
    print(n4)

      3.动态结束生成器

    def range2(n):
    count = 0
    while count < n:
    print('count',count)
    count += 1
    sign = yield count
    print('----', sign)
    if sign == 'stop':
    break
    return 222
    new_range = range2(3)
    n1 = next(new_range)
    print(n1)
    new_range.send("stop") # 唤醒的同时发送信息给生成器,起始值必须为None

    迭代器:

    可用于for循环的数据类型:
    一类:list,tuple,dict,set,str等
    二类:generator,包括生成器和带yield的generator function;
    这些可以直接作用于for循环的对象统称为可迭代对象:iterable;
    可以使用 isinstance() 判断是否为iterable对象:
    from collections import Iterable
    print(isinstance([],Iterable))
    print(isinstance({},Iterable))
    生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出Stoplteration错误表示无法继续返回下一个值了。
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:iterator
    可以使用 isinstance() 判断是否为iterator对象:
    from collections import Iterable,Iterator
    print(isinstance([],Iterator))
    print(isinstance({},Iterable))

    生成器都是iterator对象,但list,dict,str虽然是iterable,却不是iterator
    把list、dict、str等iterable变成iterator可以使用iter()函数:
    from collections import Iterator
    print(isinstance(iter([]),Iterator))
    print(isinstance(iter('asdf'),Iterator))

    因为python的iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前直到序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
    iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    小结:
    凡是可作用于for循环的对象都是iterable类型
    凡是可作用于next()函数的对象都是iterator类型,它们表示一个惰性计算的序列;
    集合数据类型如list、dict、str、等是iterable但不是iterator,不过可以通过iter()函数获得一个iterator对象。
    
    
  • 相关阅读:
    密码学复习
    Kafka Stream 高级应用
    Kafka Stream 流和状态
    Kafka Stream 处理器API
    SSM工作流程与原理详解
    Seata AT和XA模式
    分布式锁结合SpringCache
    使用RabbitMQ最终一致性库存解锁
    使用Springboot+SpringCloud+Seata1.3.0+Nacos1.2.1进行全局事务管理
    在微服务环境下,远程调用feign和异步线程存在请求数据丢失问题
  • 原文地址:https://www.cnblogs.com/jt925/p/10203300.html
Copyright © 2020-2023  润新知