切片
list和tuple、字符串。
L[:]
L[1:4]
L[-1]
str[::2]
迭代
python的迭代:只要是可迭代对象都可以,和下标没关系。
判断一个对象是否是可迭代的,通过collections模块中的Iterable类型判断。
from collections import Iterable isinstance('abc', Iterable) isinstance([1,2,3], Iterable) isinstance(123, Iterable) -- false
对list实现下标循环,使用python的enumerate函数把list变成索引-元素对。
for i, value in enumerate(['a', 'b', 'c']): print(i, value) 0 a 1 b 2 c # 同时引用两个变量 for x, y in [(1, 1), (2, 4), (3, 9)]: print(x, y) 1 1 2 4 3 9
列表生成式 -- List Comprehensions
用来创建list的生成式
list(range(1,11)) [1,2,3,4,5,6,7,8,9,10] [x * x for x in range(1, 11)] [1, 4, 9, ...] # 列表生成式中的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', 'bx', 'by', 'bz', 'cx', 'cy', 'cz'] # 使用列表生成式,列出目录下的所有文件和目录 import os [d for d in os.listdir('.')] # 列表生成式使用dict生成list d = {'x':'a', 'y':'b', 'z':'c'} [k + '=' + v for k, v in d.items()] ['y=b', 'x=a', 'z=c']
生成器 -- 解决列表生成式的内存溢出问题。
在循环过程中不断推算后续的元素,不必创建完整的list,节省内存。一边循环一边计算 -- 生成器 -- generator
正常的做法是:在创建了一个generator后,使用for来迭代。
定义generator的另一种方法:在函数定义中包含yield关键字。
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a+b n = n+1 return 'done'
该generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行从上次返回的yield语句继续执行。