python数据类型,专栏总目录:
1、迭代(Iteration)
1.1、迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
d = {'a': 1, 'b': 2, 'c': 3}
for key in d: #按key迭代
for value in d.values(): #按values迭代
for k, v in d.items(): #按key、value迭代
1.2、判断一个对象是否可迭代
通过collections模块的Iterable类型判断:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
1.3、对list下标循环
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
=> 0 A
1 B
2 C
for循环里,同时引用了两个变量很常见,比如下面的代码:
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... print(x, y)
设置enumerate的index迭代起始值:
strides = [4, 8, 16, 32]
for i, stride in enumerate(strides[1:], 2):
print(i, stride)
=>
2 8
3 16
4 32
1.4、zip封装迭代参数
a = [1, 3, 5]
b = ["a", "b", "c"]
for v in zip(a, b):
print(v)
2、列表生成式
2.1、list(range())
生成序列list(range(m, n)),生成m~n-1的序列。
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2.2、使用列表推推导
1)使用列表推导用一行语句代替循环生成list:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2)for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
3)还可以使用两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
3、生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。要创建一个generator,有多种方法,如下:
3.1、把一个列表生成式的[]改成(),即创建了一个generator
>>> g = (x * x for x in range(10))
g是一个generator,可以通过next()函数获得generator的下一个返回值:
>>> next(g)
0
>>> next(g)
1
...
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,并且不需要关心StopIteration的错误,因为generator也是可迭代对象:
>>> for n in g:
... print(n)
0
...
81
3.2、用函数来实现generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done' # 异常时,抛出值。
如果一个函数定义中包含yield关键字,那么这个函数就是一个generator:
>>> f = fib(6)
<generator object fib at 0x104feaaa0>
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
3.3、捕获StopIteration错误
>>> g = fib(6)
>>> while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
4、迭代器
可以直接作用于for循环的数据类型称为可迭代对象:Iterable。有以下几种:
1)集合数据类型,如list、tuple、dict、set、str等;
2)generator,包括生成器和带yield的generator function。
4.1、isinstance()判断对象是否是Iterable
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
4.2、可以被next()函数调用的对象称为迭代器Iterator
使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
Iterator可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据。