Python高级特性
Python是很高级的语言。所以,很多操作都是可以简化的。因此,使用Python的高级特性可以省很多事。
切片
原则,用冒号,[起点:终点:步幅]
没有起点表示从第一个开始切,没有终点表示切到最后一个,没有步幅表示切一个。
起点终点是1,2,3,表示正数第一个正数第二个。
起点终点是-1,-2,-3,表示倒数第一个倒数第二个。
>>> vocabulary
('a', 'b', 'c', 'd', 'e', 'f', 'g')
>>> v=vocabulary[:]
>>> v
('a', 'b', 'c', 'd', 'e', 'f', 'g')
>>> v1=vocabulary[::] #步长为1从头取到尾
>>> v1
('a', 'b', 'c', 'd', 'e', 'f', 'g')
>>> v[1:3] #从第1个取到第3个前
('b', 'c')
>>> v[-3:-1] #从倒数第三个取到倒数第一个前
('e', 'f')
>>> v[-3:] #从倒数第三个取到最后一个
('e', 'f', 'g')
>>> v3=v[::2]#每两个取一个
>>> v3
('a', 'c', 'e', 'g')
迭代
Python中for不是通过下标来完成。因此,Python中for循环的抽象程度更高。
只可以通过collection.abc模块判断之后是Iterable的对象都可以进行迭代。
用法:
from collections.abc import Iterable
print(isinstance('abc', Iterable))
print(isinstance([1, 2, 3], Iterable))
输出:
True
True
dict可以通过key迭代,也可以通过value迭代
可以通过enumerate使list获得下标,这种情况可以获得一个变量值。
列表生成式,可以用来生成list
for 前面的部分就是一个表达式。for后面可以加任何筛选条件
>>> [x * x for x in range(1,10) if x % 2 == 0]
[4, 16, 36, 64]
可以通过range 和 if的筛选生成各种各样的list
还可以进行循环嵌套
>>> [A+B for A in 'ABC' for B in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
此时的第二重循环作为第一重循环的函数体存在
生成器
有点类似于递推,不断地算出数列的下一个。
情况1
利用列表生成式的格式创造生成式
>>> g=(A+B for A in 'ABC' for B in 'XYZ')
>>> next(g)
'AX'
>>> next(g)
'AY'
只有通过调用next()函数才会进行下一步的推算
情况2
通过yield来进行生成,函数在执行到yield处时中断并返回。当进行下一次执行时,从中断处继续向下执行。
def yanghui(max):
L = [1, ]
for i in range(1, max + 1):
if i == 1:
L = [1, ]
if i == 2:
L = [1, 1]
if i > 2:
t = 1
for j in range(1, i - 1):
L[j], t = t + L[j], L[j]
L.append(1)
yield L, i
y = yanghui(10)
for n in y:
print(n)
运行结果:
([1], 1)
([1, 1], 2)
([1, 2, 1], 3)
([1, 3, 3, 1], 4)
([1, 4, 6, 4, 1], 5)
([1, 5, 10, 10, 5, 1], 6)
([1, 6, 15, 20, 15, 6, 1], 7)
([1, 7, 21, 35, 35, 21, 7, 1], 8)
([1, 8, 28, 56, 70, 56, 28, 8, 1], 9)
([1, 9, 36, 84, 126, 126, 84, 36, 9, 1], 10)
迭代器
迭代器其实是一个序列,不过,不访问不计算下一个。,list、dict、str是可以遍历的,但是他们无法迭代,是非更新的。适用于next()函数的变量才是可迭代的。