python高级特性(list、generator、zip、iterable)

python数据类型,专栏总目录

1.python基本数据类型和变量

2.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()函数实现按需计算下一个数据。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值