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获得下标,这种情况可以获得一个变量值。
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']
此时的第二重循环作为第一重循环的函数体存在
有点类似于递推,不断地算出数列的下一个。
利用列表生成式的格式创造生成式
>>> g=(A+B for A in 'ABC' for B in 'XYZ') >>> next(g) 'AX' >>> next(g) 'AY'
只有通过调用next()函数才会进行下一步的推算
通过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()函数的变量才是可迭代的。