Python高级特性
切片
对于取制定索引范围的操作,Python提供了切片(Slice)操作符。
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
L[0:3]
表示,从索引0
开始取,直到索引3
为止,但是不包括3
,即0
,1
,2
,正好是三个元素。
如果第一个索引是0
,还可以省略: L[:3]
也可以从索引1
开始,取出2个元素: L[1:3]
Python支持L[-1]
取倒数第一个元素,它同样支持倒数切片。倒数的第一个元素索引是-1
。
#创建一个0-99的数列:
>>> L = list(range(100))
>>> L
[0,1,2,3,...,99]
#前10个数:
>>> L[:10]
[0,1,2,3,4,5,6,7,8,9]
#后10个数:
>>> L[-10:]
[90,91,92,93,94,95,96,97,98,99]
#11-20个数:
>>> L[10:20]
[10,11,12,13,14,15,16,17,18,19]
#前10个数,每两个取一个:
>>> L[:10:2]
[0,2,4,6,8]
#所有数,每5个取一个:
>>> L[::5]
[0,5,10,15,...,90,95]
#只写[:]就可以原样复制一个list:
>>> L[:]
[0,1,2,...,99]
tuple也是一种list,唯一的区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
>>> (0,1,2,3,4,5)[:3]
(0,1,2)
字符串xxx
也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
>>> 'ABCDEFG'[:3]
'ABC'
迭代
可以通过for
循环来遍历list或tuple,这种遍历称为迭代(Iteration)。
在Python中,迭代是通过for...in
来完成的。
dict的存储不是按照list的方式顺序排列,所以迭代出的结果顺序很可能不一样。默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values()
,如果要同时迭代key和value,可以用for k,v in d.item()
。
字符串也是可迭代对象,因此,也可以作用于for
循环。
collections
模块的Iterable
类型可以判断一个对象是否为可迭代对象:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
Python内置的enumerate
函数可以把一个list变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身:
>>> for i, value in enmerate(['A','B','C']):
... print(i, value)
...
0 A
1 B
2 C
列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。比如要生成list[1,2,3,4,5,6,7,8,9,10]
可以用list(range(1,11))
。但是如果要生成[1x1,2x2,3x3,...,10x10]
,方法1:
>>> L = []
>>> for x in range(1, 11)
... L.append(x * x)
...
>>> L
[1,4,9,...,100]
循环太繁琐,用列表生成式可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1,11)]
[1,4,9,...,100]
写列表生成式时,把要生成的元素x * x
放到前面,后面跟for
循环,就可以把list创建出来。
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',...,'CZ']
三层和三层以上的循环就很少用到了。
运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
>>> import os # 导入os模块
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
for
循环可以同时使用两个甚至多个变量,比如dict
的items()
可以同时迭代key和value
>>> d = {'x':'A', 'y':'B','z':'C'}
>>> for k, v in d.items():
... print(k, '=', v)
...
y = B
x = A
z = C
因此,列表生成式也可以使用两个变量来生成list:
>>> d = {'x':'A', 'y':'B','z':'C'}
>>> [k + '=' + v for k,v in d.item()]
['y=B','x=A','z=C']
把一个list中的所有字符串变成小写:
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']