Python 高级特性 1

切片

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素:

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
r = []

n = 3
for i in range(n):
    r.append(L[i])

print(r)

运行:

['Michael', 'Sarah', 'Tracy']

使用循环,书写的代码量较多,我们可以使用切片的方式:

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
r = L[0:3]

print(r)

运行:

['Michael', 'Sarah', 'Tracy']

L[0:3]表示:从索引0开始取,直到索引3为止,但不包括索引3

如果第一个索引是0,可以省略不写:r = L[:3]


注意:L[-1]取的是L列表中的最后一个元素。

在来一个例子

先创建一个0-99的数列L = list(range(100))

我们在L前10个元素中,每2个元素取一个:

>>> L[:10:2]
[0, 2, 4, 6, 8]

L中所有数,每5个取一个:

>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

复制一个L

>>> L[:]
[0, 1, 2, 3, ..., 99]

tuple也是一种list,唯一区别是tuple不可变。所以tuple也可以进行切片操作。
同样的,字符串也可以切片。

>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

注意:
Python没有针对字符串截取函数,只需要切片一个操作就可以完成,非常简单。

迭代

迭代就是:通过for循环来遍历这个listtuple

d = {'a': 1, 'b': 2, 'c': 3}

for key in d:
    print(key, d[key])

运行输出:

b 2
c 3
a 1

注意:因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样

迭代dict中的keyvalue,还可以这样写:for k, v in d.items()
迭代dict中的value,还可以这样写程序:for value in d.values()

迭代字符串,也是一样的:

>>> for ch in 'ABC':
...     print(ch)
...
A
B
C

只要作用于一个可迭代对象for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。

问题就是如何判断一个对象是否是可迭代对象

>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

使用collections模块的Iterable类型判断。

介绍一个小技巧Python里有一个函数,它可以将一个list变成索引-元素对的形式,这个函数就是enumerate函数:

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C

参考网站:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000