Skip to content

Latest commit

 

History

History
146 lines (93 loc) · 4.06 KB

Python进阶.md

File metadata and controls

146 lines (93 loc) · 4.06 KB

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循环可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代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']