切片(从列表中取出元素)
循环:
for i in range(n):
r.append(L[i])
相比之下使用Python的Slice操作符可以大大简化。类似于MATLAB的向量切片。
迭代
如果给定一个list或者tuple,用for循环的方式遍历这个list或tuple就叫做iteration。
当使用for循环时,只要作用于一个可以迭代的对象,for循环就可以正常运行。
判断一个对象是否可以被迭代:
from collections import Iterable
isinstance('abc',Iterable)
Python实现类似于Java的下标循环:
#Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
0 A
1 B
2 C
列表生成式(List Comprehensions)
#生成list [1,2,3,4,5,6,7,8,9,10]
list(range(1,11))
#生成[1×1,2×2,3*3,4*4,...,10×10]
[x * x for x in range(1,11)]
#还可以在for循环后面加上if做判断
[x * x for x in range(1, 11) if x % 2 == 0]
#使用两层循环生成全排列
[m + n for m in 'ABC' for n in 'XYZ']
由于for循环可以同时使用几个变量:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
for k, v in d.items():
print(k, '=', v)
y = B
x = A
z = C
生成器
一边循环一遍计算。
#将列表生成式的[]改成(),就创建了一个generator
L = [x * x for x in range(10)]
g = (x * x for x in range(10))
使用next()获得generator的下一个返回值(generator是保存算法,所以每次调用next(g)的话就可以计算出g的下一个返回值,直到没有下一个值的时候程序就会抛出一个StopIteration的错误)
一般都用不上next(),一般用的是for循环的方式:
g = (x * x for x in range(10))
for i in g
print(i)
另一种定义generator的方法就是在一个函数的内部定义中包含yield关键字,那么这个函数就是一个generator。变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。注意generator函数实际返回的是一个generator对象。
Python实现杨辉三角:
#[1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
# -*- coding: utf-8 -*-
def triangles():
L = [1]
while True:
yield L
L.append(0);
L = [L[i-1] + L[i] for i in range(len(L))]
n = 0
for t in triangles():
print (t)
n = n+1
if n==10:
break
迭代器
可以直接用for循环的数据类型有以下几种:
1.集合数据类型,如list、tuple、dict、set、str等
2.generator,包括生成器和带yield的generator function
它们是可以直接作用于for循环的对象,所以被称为可迭代对象。
#使用isinstance()判断一个对象是否是可迭代对象
from collections import Iterable
isinstance([], Iterable)
值得注意的是上面说的第二种类型generator,它们不但可以使用for循环,还可以被next()函数不断的调用并不断的返回下一个值,直到最后返回StopIteration。
可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator,生成器都是Iterator对象,但是list、dict、str虽然是Iterable但是不是Iterator。这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
#使用isinstance()判断一个函数是否是Iterator对象
from collections import Iteraotr
isinstance((x for x in range(10)), Iterator)
#使用Iter()函数将Iterable变为Iterator
isinstance(iter('abc'), Iterator)
这里补充一个有趣的说法,Python的for循环的本质就是通过不断地调用next()来实现的。
for x in [1, 2, 3, 4, 5]:
pass
#等价于
it = iter([1,2,3,4])
while True:
try:
x = next(it)
except StopIteration:
break