zoukankan      html  css  js  c++  java
  • python学习Day13--生成函数

    【主要内容】

    1. 生成器和生成器函数
    生成器的本质就是迭代器
    生成器的三种创建办法:
    1.通过生成器函数
    2.通过生成器表达式创建生成器
    3.通过数据转换
    生成器函数:
    函数中包含了yield的就是生成器函数
    注意:生成器函数被执行. 获取到的是生成器. 而不是函数的执行
    生成器表达式:
    (结果 for 变量 in 可迭代对象 if 筛选)
    取值:
    1. __next__()
    2. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值
    3. 可以for循环
    4. list(g)
    2. 各种推倒式和生成器表达式
    1. 列表推倒式 [结果 for 变量 in 可迭代对象 if 筛选]
    2. 字典推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
    3. 集合推倒式 {结果 for 变量 in 可迭代对象 if 筛选} 结果=>key

    【代码】

    1、生成器函数

     1 # def func():
     2 #     print("我是周杰伦")
     3 #     yield "昆凌"  # 函数中包含了yield, 当前这个函数就不再是普通的函数了. 是生成器函数
     4 #     print("我是王力宏")
     5 #     yield "李云迪???"
     6 #     print("我是笛卡尔积")
     7 #     yield "笛卡尔积是谁"
     8     # print("你好啊") # 最后一个yield之后如果再进行__next__() 会报错
     9 # g = func()
    10 # print(g.__next__())
    11 # print(func().__next__())
    12 #
    13 # g1 = func()
    14 # g2 = func()
    15 # print(g1.__next__())
    16 # print(g1.__next__())
    17 #
    18 # print("==============")
    19 # print(g2.__next__())
    20 
    21 #
    22 # g = func()  # 通过函数func()来创建一个生成器
    23 # print(g.__next__()) # 周杰伦
    24 # print(g.__next__()) # 王力宏
    25 # print(g.__next__()) # 笛卡尔积
    26 # print(g.__next__())
    27 
    28 # return 直接返回结果. 结束函数的调用
    29 # yield 返回结果.可以让函数分段执行
    30 #
    31 # def func():
    32 #     lst = []
    33 #     for i in range(1,100001):
    34 #         lst.append("衣服%s" % i)
    35 #     return lst
    36 #
    37 # def gen():
    38 #     i = 1
    39 #     while i < 100001:
    40 #         yield "衣服%s" % i
    41 #         i = i + 1
    42 # g = gen()
    43 # print(g.__next__())
    44 # print(g.__next__())
    45 # print(g.__next__())
    46 # print(g.__next__())
    47 # print(g.__next__())
    48 # print(g.__next__())
    49 
    50 #
    51 # def func():
    52 #     yield 11
    53 #     yield 22
    54 #     yield 33
    55 #     yield 44
    56 #
    57 #
    58 # g = func()  # 拿到的是生成器. 生成器的本质是迭代器. 迭代器可以被迭代 生成器可以直接for循环
    59 #
    60 # for i in g:
    61 #     print(i)    # 本质上执行的是__next__()
    62 #
    63 # it = g.__iter__()
    64 # while True:
    65 #     try:
    66 #         print(it.__next__())
    67 #     except StopIteration:
    68 #         break

    2、send

     1 # def func():
     2 #     print("大碴粥")
     3 #     a = yield "11"
     4 #     print(a)
     5 #     print("狗不理")
     6 #     b = yield "22"
     7 #     print(b)
     8 #     print("大麻花")
     9 #     c = yield "33"
    10 #     print(c)
    11 #
    12 # g = func()
    13 # print(g.__next__())
    14 # print(g.send(1))
    15 # print(g.send(2))
    16 # print(g.send(3))
    17 
    18 # __next__() 可以让生成器向下执行一次
    19 # send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(). 最后一个也不要传值
    20 
    21 
    22 def eat():
    23     print("我吃什么啊")
    24     a =  yield  "馒头"
    25     print("a=",a)
    26     b =  yield  "大饼"
    27     print("b=",b)
    28     c =  yield  "韭菜盒子"
    29     print("c=",c)
    30     yield  "GAME OVER"
    31 
    32 gen = eat()      # 获取⽣成器
    33 
    34 ret1 = gen. __next__ ()
    35 print(ret1)
    36 ret2 = gen.send("胡辣汤")
    37 print(ret2)
    38 ret3 = gen.send("狗粮")
    39 print(ret3)
    40 ret4 = gen.send("猫粮")
    41 print(ret4)
    42 
    43 
    44 def func():
    45     yield 11
    46     yield 22
    47     yield 33
    48     yield 44
    49 g = func()
    50 lst = list(g)   # 可迭代对象
    51 print(lst)

    3、推导式

     1 # 生成列表 里面装1-14的数据
     2 # lst = []
     3 # for i in range(1,15):
     4 #     lst.append("python%s" % i)
     5 # print(lst)
     6 
     7 # 列表推倒式; 最终给你的是列表
     8 # 语法 [最终结果(变量) for 变量 in 可迭代对象]
     9 
    10 # lst = [i for i in range(1,15)]
    11 # print(lst)
    12 
    13 # [最终结果 for 变量 in 可迭代对象 if 条件]
    14 lst = [i for i in range(1,101) if i%2==0]
    15 print(lst)
    16 
    17 # 1. 获取1-100内能被3整除的数
    18 # lst = [i for i in range(1,101) if i % 3 == 0]
    19 # 2. 100以内能被3整除的数的平方
    20 # lst = [i*i for i in range(1,101) if i % 3 == 0]
    21 # 3. 寻找名字中带有两个e的⼈的名字
    22 # names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,
    23 # 'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']]
    24 # lst = [name for first in names for name in first if name.count("e") == 2]
    25 # print(lst)
    26 #
    27 # lst = ["衣服%s" % i for i in range(10000)]

    4、生成器表达式

     1 # g = (i for i in range(10))
     2 # print(list(g))
     3 
     4 # gen = ("麻花藤我第%s次爱你" % i for i in  range(10))
     5 # for i in  gen:
     6 #     print(i)
     7 
     8 # 生成器的惰性机制
     9 # def func():
    10 #     print(111)
    11 #     yield  222
    12 # g = func()
    13 # g1 = (i  for i in  g)
    14 # g2 = (i  for i in  g1)
    15 #
    16 # print(list(g))
    17 # print(list(g1))
    18 # print(list(g2))

    5、字典推导式+集合推导式

    #字典推导式
    # dic = {"a":"b", "c":"d"}
    # # 把字典中的key:value互换 .{"b":"a", "d":"c"}
    # new_dic = {dic[key]:key for key in dic}
    # print(new_dic)
    
    # lst1 = ["alex", "wusir", "taibai", "ritian"]
    # lst2 = ['sb', "很色", "很白", "很牛"]
    # # {"alex":"sb", "wusir":"很色"}
    #
    # dic = { lst1[i]:lst2[i] for i in range(len(lst1))}
    # print(dic)
    
    #集合推导式
    lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"]
    
    s = {i for i in lst}    # 集合推倒式
    print(s)

    5、难度很大的题

    # 一个面试题,难度很大
    def add(a,b):
        return a + b
    def test():
        for r_i in range(4):
            yield r_i
        #[0,1,2,3]
    g = test()     #g是生成器
    for n in [2, 10]:    # n=2,10
        g = (add(n, i) for i in g)
    # 上面for循环等同于:(循环两次)  所有的n都是10(惰性机制)
    #     g=(add(n,i) for i in (add(n,i) for i in test())
    print(list(g))
  • 相关阅读:
    离线缓存之RNCachingURLProtocol解析
    Element demo解析
    GHUnit+OCMock
    XCTest+XCTool
    day1`4整理
    day4 笔记
    day3
    day1
    day2
    Python学习(二)——Python基础
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12290827.html
Copyright © 2011-2022 走看看