zoukankan      html  css  js  c++  java
  • python基础之生成器

    生成器:本质是迭代器, 写法和迭代器不一样. 用法和迭代器一样
    生成器函数: 函数中带有yield, 执行生成器函数的时候返回生成器。而不是执行这个函数。
    def func():
        print("你好啊, 我叫赛利亚,")
        yield "西岚的武士刀"     # return 和yield都可以返回数据
    
    ret = func() # generator ret是一个生成器
    print(ret)
    s = ret.__next__() # 当执行到__next__()的时候, 函数才真正的开始执行
    print("接受到的是", s)
    特点:
      1. 节省内存, 几乎不占用内存
      2. 惰性机制
      3. 只能往前走

    send() 也可以实现类似__next__()的效果, send()可以给上一个yield传值,但send()不能在第一个yield使用,因为没有前一个yield可以让它传值。
    def func():
        print("韭菜盒子")
        a = yield "哇哈哈"
        print("肉包子", a)
        b = yield "脉动"
        print("锅包肉", b)
        yield "冰红茶"
    
    gen = func()
    # ret = gen.send("胡辣汤")
    ret = gen.__next__()
    print(ret)
    
    ret = gen.send("刘伟") # 给上一个yield传值
    print(ret)
    
    ret = gen.send("刘德华") # 给上一个yield传值
    print(ret)
    会报错,因为send()不能用在开头,解决:改用'__next__()'
    send()可以给上一个yield传值, 不能给最后一个yield传值
    生成器可以直接使用for循环
    def fun():
        yield '花花'
        yield '草草'
        yield '青青'
        yield '绿绿'
    gen = fun()    #创建一个生成器
    for el in gen:
        print(el)
    >>:
    花花 草草 青青 绿绿
    列表、字典、集合推导式(元组没有)
    # 列表推导式 : [结果 for循环 if筛选]
    lst = ["python%s" % i for i in range(1, 17)]
    print(lst)
     <==>  节省代码
    lst = []
    for i in range(1,17):
        lst.append('python%s',%i)
    print(lst)
    # 字典推导式, {key: value for循环 if 筛选}
    dic = {"张无忌":"九阳神功", "乔峰":"降龙十八掌", "楚留香":""}
    d = {dic[k]: k for k in dic}
    print(d)

    功能:将key和value的值对换过来
    #集合推导式 无序不重复 可哈希
    #{key for if}
    
    lst = ["周杰伦","周伯通","周润发","周伯通","周笔畅","周伯通","周星驰","周伯通"]
    s = {el for el in lst}
    print(s)

    ==> {'周笔畅', '周星驰', '周杰伦', '周伯通', '周润发'}
    生成器表达式:(结果 for if)
    用法:使用生成器表达式直接创建生成器
    gen = (i for i in range(10))
    生成器表达式: 记录一下代码。 然后每次需要的时候去生成器中执行一次这个代码。
    生成器记录的是代码,并不执行代码。
  • 相关阅读:
    mysql 5.6
    mysql5.7 二进制包安装
    centos 6 编译安装httpd-2.4
    mysql 5.5源码包安装
    BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
    BZOJ4943 & 洛谷3823 & UOJ315:[NOI2017]蚯蚓排队——题解
    BZOJ3435 & 洛谷3920 & UOJ55:[WC2014]紫荆花之恋
    BZOJ5343 & 洛谷4602 & LOJ2555:[CTSC2018]混合果汁——题解
    真·APIO2018滚粗记
    BZOJ4518:[SDOI2016]征途——题解
  • 原文地址:https://www.cnblogs.com/doit9825/p/13081376.html
Copyright © 2011-2022 走看看