切片
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
yield b
a, b = b, a+b
n = n+1
return 'done'
该generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行从上次返回的yield语句继续执行。