迭代
迭代可以对list,tuple和str等类型的数据进行操作,如何判断一个数据是否可以迭代:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
list中如何实现如Java一样的下标:使用Python中的内置enumerate函数:
a = [1,2,3]
b = ['a','b','c']
c = 'ABC'
for i , value in enumerate(a):
print(i,value)
>>>0 1
>>>1 2
>>>2 3
列表生成式
带if的列表生成式,在生成list时候,进行筛选:
>>>[x*x for i in range(1,11) if i%2 == 0]
[4,16,36,64,100]
对字符串进行全排列:
>>>[m +n for m in 'ABC' for n in 'XYZ']
['AX','AY','AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器
为了不占用很大的内存空间,在Python中,有种一边循环一边计算的机制,称为生成器:generator
创建generator,只需把列表生成器的[]改为()即可:
g = ( x*x for x in range(10))
next(g)
>>>0
next(g)
>>>1
...
使用for循环也可以将g全部输出:
for n in g:
print(n)
>>>0
1
4
9
16
25
36
49
64
81
另一种定义生成器的方法就是:函数中的yield关键字,该函数为一个generator。则在运行过程中遇到yield就进行返回。
def test():
print("step1:")
yield 'a'
print("step2:")
yield 'b'
print("step3:")
yield 'c'
print("step4:")
yield 'd'
return 'over'
for x in test():
print(x)
>>>step1:
a
step2:
b
step3:
c
step4:
d
但是不能输出返回语句,
如果想要拿到返回值,必须捕获
StopIteration
错误,返回值包含在
StopIteration
的
value
中,需进行改写:
x = test()
while 1:
try:
print(next(x))
except StopIteration as e:
print(e.value)
break
>>>
step1:
a
step2:
b
step3:
c
step4:
d
over
【注】最后的break如果忘记的话会形成死循环!!!