• 4-3迭代器和生成器


    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    #列表 有限列表 用不时占用内存
    a=[1,2,3]
    print(a)
    #列表生成式 无限列表 边生成边计算 省内存空间
    b=[i*2 for i in range(3)]
    print(b)
    #c=[ 函数(i) for i in range(20) ]
    print('+ + + + + + +')

    #列表生成式
    # 生成器 只有在调用时才会生成相应的数据
    # 只能往前生成,生成下个时,上个就扔。不能退后
    # for调用 用的多 c.__next__()调用 用的少,只能调一个
    c=(i*2 for i in range(7))
    print(c) #值还没有生成 调用才生成
    print(c.__next__()) #取第一个
    print(c.__next__()) #取第二个
    print('+_+')
    for i in c: print('调用:',i); #调用就生成

    print('+ + +')
    # 函数做生成器
    # 斐波拉契数列 除第一个和第二个数外,任意数是前两个数之和
    # 1,1,2,3,5,8,13,21
    def fib(max): #程序
    n,a,b=0,0,1 #n循环数 a和b
    while n < max: #max循环次数
    #print(b) #循环显示
    yield b #变成生成器
    a,b=b,a + b
    n = n + 1
    return '程序异常时返回此:H级错误' #循环结束 返回值
    g=fib(6)
    while True:
    try:
    x = next(g)
    print('g: ', x)
    except StopIteration as e:
    print('查到此问题: ', e.value)
    break
    print('* * * * * * *')
    #print(f.__next__())

    #生成器并行 单线程下的并行效果 协程
    import time
    def aaa(x):
    print('[%s]开始上班了'%x)
    while True:
    ccc=yield
    print('[%s]坑爹逗比,被[%s]送到天上了' %(ccc,x))

    # zzz=aaa('阎王')
    # zzz.__next__()
    # b1='最强王者之'
    # zzz.send(b1) #.send()给传值
    # zzz.__next__()

    def sss():
    q1=aaa('黑无常')
    q2=aaa('白无常')
    q1.__next__()
    q2.__next__()
    print('本帅拉了一车逗比')
    for i in range(3):
    time.sleep(1)
    print('+++有俩逗比刚下车+++')
    q1.send(i)
    q2.send(i)

    print(sss())
    print('- - - - - - - - -')
    #迭代器
    #直接作用于for循环的对象统称,被迭代的对象

    print('#判断是否可迭代#')
    from collections import Iterable
    print('列表可迭代吗?',isinstance([],Iterable))
    print('字符串可迭代吗?',isinstance('abc',Iterable))
    print('字典可迭代吗?',isinstance({},Iterable))
    print('数字可迭代吗?',isinstance(10,Iterable))
    #用于for循环,可被next()函数调用返回下一个=迭代器
    #查看调用方法 dir()
    a=[7,8,9]
    print('没有next,所以不是迭代器',dir(a)) #没有next 不是迭代器
    #把列表list 字典dict 字符串str 变成迭代器用 iter()函数
    b=iter(a) #a就是迭代器
    print('迭代器第一个',b.__next__())
    print('迭代器第二个',b.__next__())
    print('迭代器第三个',b.__next__())

    print('#迭代器表示数据流 是流')
    print('#+++迭代器只有在返回下一个数据时才会计算 可以无限大的数据流+++')
    print('range(10) 就是迭代器 0到9')
    print('- - - - - - - - -')
    s=[1,3,5]
    a=iter(s) #把列表变成迭代器
    while True:
    for i in range(len(s)):
    try:
    x=next(a) #取迭代器的值给x
    print('迭代器第%s个值:'%i,x) #显示取到的内容
    except StopIteration: #迭代器值取完了 则:
    break

  • 相关阅读:
    linux文件锁flock【转】
    无尽的悲伤
    go的临时对象池--sync.Pool
    golang 小知识-持续更新中
    【转】Go Channels
    Golang文件名命名规则
    Parquet存储格式
    预装的Office2016,文件图标表显示以及新建失败问题解决 方法
    Gamma编码及Delta编码概述
    java web开发环境配置系列(二)安装tomcat
  • 原文地址:https://www.cnblogs.com/pojue/p/7912753.html
Copyright © 2020-2023  润新知