一、切片
Python提供了一种方便的机制来切割list、tuple、str等对象中的元素:
>>> L = [1,2,3,4,5,6,7,8,9,10]
>>> L[0:3] #取前三个数
[1, 2, 3]
>>> L[-2:-1] #取到数两个数
[9, 10]
>>> L[::2] #每隔两个数取一个
[1, 3, 5, 7, 9]
>>>
>>> 'ABCDEFG'[:3] #取前三个字符
'ABC'
>>> 'ABCDEFG'[::2] #每隔两个字符取一个
'ACEG'
二、迭代
1.迭代dict
>>> d = {'a':1, 'b':2, 'c':3}
>>> for key in d: #dict不是安装list的方式顺序排序,所以迭代的结果顺序可能不同
... print(key)
...
a
c
b
>>> for value in d.values(): #迭代dict的values
... print(key)
...
1
3
2
>>> for k,v in d.items(): #同时迭代key和value
... print(k,v)
...
a 1
c 3
b 2
2.迭代str
>>> for ch in 'ABC':
... print(ch)
...
A
B
C
3.判断迭代对象
>>> from collections import Iterable
>>> isinstance('abc', Iterable) #str是否可迭代
True
>>> isinstance([1,2,3], Iterable) #list是否迭代
True
>>> isinstance(123, Iterable) #整数是否可迭代
False
4.把list编程索引-元素对
>>> for i,value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
4.引用两个变量
>>> for x,y in [(1,1), (2,4), (3,9)]:
... print(x,y)
...
1 1
2 4
3 9
三、列表生成式
列表生成式即List Comprehensions,是Python内置的可以用来创建list的生成式。
举个例子,要生成[1*1, 2*2, 3*3, ..., 10*10]可以直接通过列表生成式生成:
>>> [x * x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循环后面还可以加上if判断,从而筛选出仅偶数的平方:
>>> [x * x for x in range(1,11) if x % 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']
四、生成器
通过列表生成式创建的列表受到内存限制,其容量肯定是有限的。如果创建一个包含100万个元素的列表,而我们只使用了其中的前几个元素,这就会造成空间的浪费。Python提供了一种循环推算的机制来获得元素,这样就不必创建完整的list,从而节省大量的空间——这种机制称为生成器:generator
生成器的创建有两种方法:
(1)第一种方法:与列表生成式的区别在于[ ]改为( ),通过for循环调用
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
>>>
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
(2)第二种方法:yield关键字
普通函数 | generator |
---|---|
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done' | def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' |
generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行语句就返回。而变成gennerator的函数,在每次调用next()的时候执行, 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。实例如下:
>>> def odd():
... print('step 1')
... yield 1
... print('step 2')
... yield 3
... print('step 3')
... yield 5
...
>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
五、迭代器
1.可迭代对象(两类):可以直接作用于for循环
类型 | 对象 |
---|---|
集合数据类型 | list、tuple、dict、set、str等 |
generator | 包括生成器和带yield的generator function |
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
2.迭代器:不仅可以作用于for循环,还可以被next()函数不断调用并返回下一个值
可以使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
把list、dict、str等Iterable可迭代对象变成Iterator迭代器可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True