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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
1 、迭代工具包括: for 循环,列表解析, in 成员关系测试,及( map 内置函数, sorted , zip , enumerate , filter 返回可迭代对象)
2 、文件迭代器
里面有一个__next__方法,每次调用时会返回文件中的下一行,当遇到文件末尾时,会引发StopIteration异常,而不是返回空字符串
f =
open (‘script1.py)
f.__next()__
3 、手动迭代: iter 和 next
python3. 0 提供了一个内置函数 next ,他会自动调用__next__方法。
例如:
X. next () 等价于 X.__next__()
iter (X) 内置函 iter 会把X转化为可迭代对象,也就是带有 next 的方法。
4 、列表和很多其他内置对象,不是自身的迭代器,他们支持多次打开迭代器。
例如:
L =
[ 1 , 2 , 3 ]
print ( iter (L) is
L) #输出:False
#print(L.__next__()) #会抱错
I =
iter (L)
print (I.__next__()) #输出:1
print ( next (L)) #输出:2
5 、列表解析
[表达式 for
变量 in
目标 if
条件]
例如:
L =
[ 1 , 2 , 3 , 4 , 5 ]
temp =
[x * 2
for x in
L if
x % 2 = = 0 ]
print (temp) #输出:[4, 8]
或者
L1 =
[ ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ ]
L2 =
[ 1 , 2 , 3 , 4 , 5 ]
temp =
[(a,b) for
a in
L1 for
b in
L2]
print (temp) #输出:[(‘a‘, 1), (‘a‘, 2), (‘a‘, 3), (‘a‘, 4), (‘a‘, 5), (‘b‘, 1), (‘b‘, 2), (‘b‘, 3), (‘b‘, 4), (‘b‘, 5), (‘c‘, 1), (‘c‘, 2), (‘c‘, 3), (‘c‘, 4), (‘c‘, 5), (‘d‘, 1), (‘d‘, 2), (‘d‘, 3), (‘d‘, 4), (‘d‘, 5)]
6 、 sum , any , all , max , min 这些函数用于任何可迭代对象
print ( sum ([ 1 , 2 , 3 , 4 , 5 ])) #计算和
print ( any ([ 1 , 2 , 3 , 4 , 5 ])) #只要所给对象是不是空,就返回True
print ( all ([ 1 , 2 , 3 , 4 , 5 ])) #所有对象为真时,返回True,否则返回False
print ( max ([ 1 , 2 , 3 , 4 , 5 ])) #计算最大值
print ( min ([ 1 , 2 , 3 , 4 , 5 ])) #计算最小值
7 、解包:
def
f(a,b,c,d): print (a,b,c,d,sep = ‘&‘ )
f( 1 , 2 , 3 , 4 ) #输出:1&2&3&4
f( * [ 1 , 2 , 3 , 4 ]) #输出:1&2&3&4
unzip
x =
( 1 , 2 )
y =
( 3 , 4 )
print ( list ( zip (x,y))) #输出:[(1,3),(2,4)]
print ( * zip (x,y))
a,b =
zip ( * zip (x,y))
print (a,b,sep = ‘ ‘ )
8 、 range 返回的并不是迭代器,但是可以通过 iter 函数产生多个迭代器, zip , map , filter 则不支持多个迭代器
例如:
L =
range ( 5 )
#print(next(L)) 报错
t =
iter (L)
print ( next (t)) #输出:0
print ( next (t)) #输出:1
print ( next (t)) #输出:2
print ( ‘*‘ * 8 ) #输出:3
k =
iter (L)
print ( next (k)) #输出:0
print ( next (k)) #输出:1
print ( next (k)) #输出:2
9 、字典迭代器
D =
{ ‘a‘ : 1 , ‘b‘ : 2 , ‘c‘ : 3 }
t =
iter (D)
for
i in
t:
print (i,end = ‘,‘ )
#输出:
a,b,c
10 、其他迭代器
使用 yield 语句,用户定义的函数可以转化为可迭代的生成器函数
当编写圆括号时候,列表解析转化为可迭代生成器函数
用户定义的类通过__iter__或者__getitem__运算符重载变得可迭代
|