1.生成器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 一边循环一边计算的机制,称为生成器:generator; # 创建generator方法: # 1.把一个列表生成式的[]改成() numsList = [num * num for num in range ( 10 )] print ( "列表生成式生成numsList:" ,numsList) numsGenerator = (num * num for num in range ( 10 )) print ( "生成器生成numsGenerator:" ,numsGenerator) # 使用next()函数获得generator的下一个返回值 print ( "打印numsGenerator第一个元素:" , next (numsGenerator)) print ( "打印numsGenerator第二个元素:" , next (numsGenerator)) print ( "--------------------------------------------------------" ) # 使用for循环打印generator元素 print ( "使用循环打印生成器中的元素!" ) for num in numsGenerator: print (num,end = " " ) print ( "\n" ) print ( "--------------------------------------------------------" ) # 斐波拉契数列(Fibonacci):除第一个和第二个数外,任意一个数均可由前两个数相加得到 # 1,1,2,3,5,8,13,21,34 def fibonacci(num): n, a, b = 0 , 0 , 1 while n < num: print (b,end = " " ) a, b = b, a + b n = n + 1 return "Done" print ( "Fibonacci前10项为:" ) fibonacci( 10 ) print ( "\n" ) print ( "--------------------------------------------------------" ) # 2.把fibonacci()函数变成generator函数 def fibonacci(num): n, a, b = 0 , 0 , 1 while n < num: yield b a, b = b, a + b n = n + 1 return "Done" # Tips: # 1.如果一个函数定义中包含yield关键字,则这个函数是一个generator函数; # 2.调用一个generator函数将返回一个generator; fib = fibonacci( 10 ) print ( "fib的值:" ,fib) |
# 结果输出:
列表生成式生成numsList: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器生成numsGenerator: <generator object <genexpr> at 0x0000028F0E6ACB88>
打印numsGenerator第一个元素: 0
打印numsGenerator第二个元素: 1
--------------------------------------------------------
使用循环打印生成器中的元素!
4 9 16 25 36 49 64 81--------------------------------------------------------
Fibonacci前10项为:
1 1 2 3 5 8 13 21 34 55--------------------------------------------------------
fib的值: <generator object fibonacci at 0x0000028F0E7839A8>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 普通函数和generator函数的执行流程: # 1.普通函数:顺序执行,遇到return语句或最后一行函数语句就返回; # 2.generator函数:在每次调用next()的时候执行,遇到yield语句返回; # 3.再次执行时从上次返回的yield语句处继续执行; # 实例:定义一个generator函数,依次返回"Willard",18,"Engineer" def willardInfo(): print ( "STEP1" ) yield "Willard" print ( "--------" ) print ( "STEP2" ) yield 18 print ( "--------" ) print ( "STEP3" ) yield "Engineer" # 调用willardInfo()这个generator函数,先生成一个generator对象 # 然后用next()函数不断获得下一个返回值,即可用循环直接打印 willardInfoObject = willardInfo() for willard in willardInfoObject: print (willard) |
# 结果输出:
STEP1
Willard
--------
STEP2
18
--------
STEP3
Engineer
2.迭代器
1
2
3
4
5
6
7
8
9
10
11
|
# 可直接用于for循环的数据类型: # 1.list、tuple、dict、set、str等; # 2.generator,包括:生成器和带yield的generator function; # 3.可以直接作用于for循环的对象称为可迭代对象:Iterable; # 4.使用isinstance()判断一个对象是否为Iterable对象; from collections.abc import Iterable print ( "判断list是否为可迭代对象!" , isinstance ([],Iterable)) print ( "判断dict是否为可迭代对象!" , isinstance ({},Iterable)) print ( "判断str是否为可迭代对象!" , isinstance ( "Willard" ,Iterable)) print ( "判断生成式是否为可迭代对象!" , isinstance ((num for num in range ( 10 )),Iterable)) print ( "判断number是否为可迭代对象!" , isinstance ( 99 ,Iterable)) |
# 结果输出:
判断list是否为可迭代对象! True
判断dict是否为可迭代对象! True
判断str是否为可迭代对象! True
判断生成式是否为可迭代对象! True
判断number是否为可迭代对象! False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator # 使用isinstance()判断一个对象是否为Iterator对象; from collections.abc import Iterator print ( "判断生成器是否为迭代器!" , isinstance ((num for num in range ( 10 )),Iterator)) print ( "判断list是否为迭代器!" , isinstance ([],Iterator)) print ( "判断dict是否为迭代器!" , isinstance ({},Iterator)) print ( "判断str是否为迭代器!" , isinstance ( "Willard" ,Iterator)) print ( "----------------------------------------------------------" ) # Tips: # 1.生成器都是Iterator对象,但list、dict、str是Iterable但不是Iterator; # 2.Iterator对象表示数据流,Iterator对象可以被next()函数调用并不断返回下一个数据, # 直到没有数据时抛出StopIteration错误;这个数据流可以看作一个有序序列, # 但不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据, # Iterator的计算是惰性的,只有在需要返回下一个数据时才计算; # 3.使用iter()函数把list、dict、str变成Iterator; print ( "使用iter()函数把list、dict、str变成Iterator." ) print ( "判断list是否为迭代器!" , isinstance ( iter ([]),Iterator)) print ( "判断dict是否为迭代器!" , isinstance ( iter ({}),Iterator)) print ( "判断str是否为迭代器!" , isinstance ( iter ( "Willard" ),Iterator)) |
# 结果输出:
判断生成器是否为迭代器! True
判断list是否为迭代器! False
判断dict是否为迭代器! False
判断str是否为迭代器! False
----------------------------------------------------------
使用iter()函数把list、dict、str变成Iterator.
判断list是否为迭代器! True
判断dict是否为迭代器! True
判断str是否为迭代器! True
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://fuxi-willard.blog.csdn.net/article/details/122673716