• 生成器


    1、什么是生成器?

    在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,该转让称之为生成器,生成器的本质就是迭代器

    2、为什么要 有生成器?

    生成器是一种自定义迭代器的方式

    3、怎么用

    def func():
    print('first1')
    print('first2')
    print('first3')
    yield 1 #暂停
    print('second1')
    print('second2')
    print('second3')
    yield 2 #暂停
    print('third')
    yield 3 #暂停
    print('fourth')

    g=func()
    print(g) #生成器地址
    # print(g.__iter__().__iter__().__iter__() is g)
    # res1=next(g) #使用next方法,返回相应值
    # print('第一次的返回值:',res1)

    # for item in g: #g=iter(g) #item=next(g)
    # print(item)


    例题:
    与range 功能相同的生成器

    def my_name(start,stop,sleep=1):
    while True :
    if start<stop:
    yield start 暂停
    start +=sleep
    res = my_name(2,15)
    print(res)
    # print(next(res)) #迭代器对象挨个取值,节省内存
    b =next(res)
    print(b)
    # for item in my_name(2,8) : #调用my_name函数
    # print(item )

    4、总结yield的功能
    (1)提供了一种自定义迭代器的方式
    (2)yield 可以暂停住函数,返回值

    yield VS return
    相同点:都是在函数内,都可以返回值,没有类型,个数限制
    不同点:return只能返回一次值,yield可以返回多次值

    5、三元表达式
    条件成立时的返回值 if条件 else条件不成立时的返回值
    a = 10
    b = 20
    res = b if b>a else b

    6、列表生成式
    # a = [b*2 for b in range(1,12)]
    # print(a)

    names=['egon','alex','wupeiqi','yuanhao']
    names = [x+'hb' for x in names] #在列表的元素中加入hb
    print(names)

    names=['egon','alex_sb','wupeiqi','yuanhao']
    # 以sb结尾的名字过滤掉,然后保存剩下的名字长度
    names =[len(name) for name in names if not name.endswith('sb') ]
    print(names)

    names=['egon','alex_sb','wupeiqi','yuanhao']
    names =[ name.upper() for name in names]  #列表元素大写
    print(names)
    7、字典生成式
    s1=('h','e','l','l','o')
    l1=[1,2,3,4,5]
    res=zip(s1,l1) #函数zip 使两个数据类型内的值想对应,用元组储存
    print(res)
    print(list(res))

    keys=['name','age','sex']
    values=['egon',18,'male']
    # d = {}
    # for k,v in zip(keys,values):
    # d[k] =v
    # print(d)

    d = { k:v for k,v in zip(keys,values)}
    print(d)

    8、生成器表达式
    g=(i for i in range(10))
    print(g) #加小括号,生成器表达式,打印内存地址
    print(next(g)) #取值
    print(next(g))

    with open('cct.txt','rt',encoding= 'utf-8')as f:
    # nums=[ len(line) for line in f]
    # print(nums) #用[len(line) for line in f]取全部的长度信息 占内存
    # print(max(nums))

    # nums = (len(line) for line in f)
    # print(nums) #打印内存地址
    # print(next(nums)) #取值
    # print(max(nums))















  • 相关阅读:
    DownloadManager
    Android(蓝牙)
    Android下集成Paypal支付
    java 网络(socket)
    java 泛型的几点备忘
    设计模式(模板方法)
    STM32F4_引领入门
    如何查找STM32开发资料
    Keil(MDK-ARM)使用教程(三)_在线调试
    Keil(MDK-ARM)使用教程(二)_菜单
  • 原文地址:https://www.cnblogs.com/quqinchao/p/9179032.html
Copyright © 2020-2023  润新知