• 生成器和推导式


    生成器定义:

    函数中带yield的就是生成器

     1 def foo():
     2     print(1)
     3     yield 4
     4     print(2)
     5     yield 5
     6     print(3)
     7     yield 6               # 每次执行到yield,没有则报错
     8 g=foo()             # 产生一个生成器
     9 print(g.__next__())
    10 print(g.__next__())
    11 print(g.__next__())

    eg:

    1 def gen():
    2     for i in range(200):
    3         yield i
    4 g=gen()
    5 for i in range(10):
    6     print(g.__next__())

    生成器本质就是迭代器,拥有惰性机制,每执行__next__()或者next()才会向下执行取值

    eg:

    1 def foo():
    2     lst=[1,2,3,5]
    3     yield from lst
    4 g=foo()
    5 print(next(g))
    6 print(next(g))
    7 print(next(g))
    8 print(next(g))
    大坑: 生成器函数运行之后. 产生一个生成器. 而不是运行函数
    1 def func():
    2     print("我叫周润发")
    3     yield "林志玲"   # yield表示返回. 不会终止函数的执行
    4     print("宝宝干嘛去了??")
    5     yield "宝宝回来了"
    6     print("宝宝你在干嘛?")
    7     # yield "没了"
    8 
    9 ret = func() # 执行函数, 此时没有运行函数.
    此时拿到的是生成器
    print("返回值是", ret) # <generator生成器 object func at 0x0000000009E573B8>

    send() -> __next__()
    send()可以给上一个yield位置传值
     1 def func():
     2     print("韭菜盒子")
     3     a = yield "韭菜鸡蛋"
     4     print("a", a)
     5     b = yield "韭菜西红柿"
     6     print("b", b)
     7     c = yield "火烧"
     8     print("c", c)
     9 
    10 gen = func()
    11 print(gen.__next__()) # 第一个位置用send没有任何意义,报错,除非 gen.send(None)
    12 print(gen.send("篮球")) # 给上一个yield位置传值
    13 print(gen.send("足球"))

    eg:

     1 def eat():
     2      print("我吃什么啊")
     3      a = yield "馒头"
     4      print("a=",a)
     5      b = yield "⼤饼"
     6      print("b=",b)
     7      c = yield "⾲菜盒⼦"
     8      print("c=",c)
     9      yield "GAME OVER"
    10 
    11 gen = eat() # 获取⽣成器
    12 
    13 ret1 = gen.__next__()
    14 print(ret1)
    15 ret2 = gen.send("胡辣汤")
    16 print(ret2)
    17 ret3 = gen.send("狗粮")
    18 print(ret3)
    19 ret4 = gen.send("猫粮")
    20 print(ret4)

    列表推导式:

    语法:

    [结果 语句 条件]
    eg:打印1-100偶数的平方
    1 lst=[ i**2 for i in range(1,101) if i%2==0]
    2 print(lst)

     eg:打印名字中带两个e的名字

    1 names=[['tom','meiko','jeffer','wesley'],['alice','jill','anee','haeeae']]
    2 lst=[name for el in names for name in el if name.count("e")==2]
    3 print(lst)

    字典推导式:

    语法:{结果(key:value)for循环 if条件}
    1 lst=[11,22,33] # {0:11,1:22,2:33}
    2 dic={i:lst[i] for i in range(len(lst))}
    3 print(dic)

    集合推导式:

    语法:{k for 循环 if 条件}

    1 dic={'1':2,'2':'6'}
    2 d={i for i in dic.items()}
    3 print(d)

    生成器表达式:

     1 g=(i for i in range(10))    
     2 print(g)                      #<generator object <genexpr> at 0x0000024294CAF4C0>
     3 print(g.__next__()) #0
     4 print(g.__next__())
     5 print(g.__next__())
     6 print(g.__next__())
     7 print(g.__next__())
     8 print(g.__next__())
     9 print(g.__next__())
    10 print(g.__next__())
    11 print(g.__next__())
    12 print(g.__next__())#9
  • 相关阅读:
    左划删除
    UILabel 添加图片
    Swift-11-委托模式
    Swift-11-协议(Protocols)
    Swift-10--错误处理
    Swift-09-可空链式调用(Optional Chaining)
    Swift-08-闭包引起的循环强引用
    Swift-07-析构器deinit
    Swift-06-闭包
    【转】HTML5标签使用的常见误区
  • 原文地址:https://www.cnblogs.com/53Dawns/p/10273505.html
Copyright © 2020-2023  润新知