Python3_send和生成器函数的使用示例

主要知识点:
1、生成器和生成器函数
生成器的本质就是迭代器
生成器创建的三种方式:
1、通过生成器函数
2、通过生成器表达式创建生成器
3、通过数据转换
2、各种推导式和生成器表达式

# 生成器函数
def func():
    print("我是华山大弟子")
    yield "令狐冲"  # 函数中包含了yield,表示当前这个函数就不再是普通的函数了,是生成器函数
g = func() # 返回迭代器对象
print(g)  
<generator object func at 0x000002712B8BC0A0>
print(g.__next__()) # 读取迭代器对象
我是华山大弟子
令狐冲
print(g.__next__()) 
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-6-ceb60a9886dd> in <module>()
----> 1 print(g.__next__()) # 读取迭代器对象


StopIteration: 
# 生成器函数
def func():
    print("我是华山大弟子")
    yield "令狐冲"  # 函数中包含了yield,表示当前这个函数就不再是普通的函数了,是生成器函数
    print("我是二娃")
    yield "你是大娃"
g = func() # 返回迭代器对象
print(g.__next__())
print(g.__next__())
我是华山大弟子
令狐冲
我是二娃
你是大娃
def func():
    print("我是华山大弟子")
    return "令狐冲"  # 函数中包含了yield,表示当前这个函数就不再是普通的函数了,是生成器函数
    print("我是二娃")
    return "你是大娃"
g = func() # 返回迭代器对象
print(g.__next__())
print(g.__next__())
我是华山大弟子



---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-8-114f07ec0cec> in <module>()
      5     return "你是大娃"
      6 g = func() # 返回迭代器对象
----> 7 print(g.__next__())
      8 print(g.__next__())


AttributeError: 'str' object has no attribute '__next__'
小结:

return 直接返回结果,结束函数的调用
yield 返回结果,可以让函数分段执行

def func():
    print("小米粥")
    yield "1"
    print("大包子")
    yield "2"
    print("大师傅")
    yield "3"
g = func()
print(g.__next__())
print(g.send(1))
小米粥
1
大包子
2
def func():
    print("小米粥")
    a = yield "1"
    print("大包子")
    print(a)
    yield "2"
    print("大师傅")
    yield "3"
g = func()
print(g.__next__())
print(g.send(111111111111))
小米粥
1
大包子
111111111111
2
send 和 __next__小结:

next() 可以让生成器向下执行一次
send() 也可以让生成器向下执行一次,但是send可以给上一个yield传一个参数,不能给最后一个yield发送值,在第一次执行的时候必须用__next__

# 生成器可以使用for循环来魂环获取内部的元素
def func():
    print(111)
    yield 222
    print(333)
    yield 444
g = func()
for i in g:
    print(i)
111
222
333
444
# 将生成器转化成list
def func():
    print(111)
    yield 222
    print(333)
    yield 444
g = func()
lst = list(g)  # g是一个可迭代对象,list内部可以自动调动__next__()
print(lst)
111
333
[222, 444]

列表推导式小例子

# 传统写法
lst = []
for i in range(1,20):
    lst.append(i)
print(lst)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# 使用列表推导式
lst = [i for i in range(1,20)]
print(lst)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# 再来个小demo,求被3整除的数
lst = [i for i in range(1,1000) if i%3==0]
print(lst)
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, 282, 285, 288, 291, 294, 297, 300, 303, 306, 309, 312, 315, 318, 321, 324, 327, 330, 333, 336, 339, 342, 345, 348, 351, 354, 357, 360, 363, 366, 369, 372, 375, 378, 381, 384, 387, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, 423, 426, 429, 432, 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 516, 519, 522, 525, 528, 531, 534, 537, 540, 543, 546, 549, 552, 555, 558, 561, 564, 567, 570, 573, 576, 579, 582, 585, 588, 591, 594, 597, 600, 603, 606, 609, 612, 615, 618, 621, 624, 627, 630, 633, 636, 639, 642, 645, 648, 651, 654, 657, 660, 663, 666, 669, 672, 675, 678, 681, 684, 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, 717, 720, 723, 726, 729, 732, 735, 738, 741, 744, 747, 750, 753, 756, 759, 762, 765, 768, 771, 774, 777, 780, 783, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 819, 822, 825, 828, 831, 834, 837, 840, 843, 846, 849, 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, 921, 924, 927, 930, 933, 936, 939, 942, 945, 948, 951, 954, 957, 960, 963, 966, 969, 972, 975, 978, 981, 984, 987, 990, 993, 996, 999]

生成器表达式

生成器表达式和列表表达式的语法基本一致,不同点在于,列表表达式是[]而生成器表达式则是()

g = (i for i in range(10))
print(g)  # 生成器对象
<generator object <genexpr> at 0x000002712B92BD58>
# 取值
print(g.__next__())
0
# 取所有制
for i in g:  ## 方式1
    print(i)
g = (i for i in range(10))
print(list(g))  ## 方式2
1
2
3
4
5
6
7
8
9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成表达器和列表推导式比较

1、列表推导式比较占内存,一次性加载,生成器表达式则几乎不占用内存,使用的时候才分配和使用内存
2、得到的结果不同,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器。
生成器有惰性机制,需要的时候才给值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值