附篇文章:
http://python.jobbole.com/87805/
一、列表生成器:
a = [x for x in range(10)] print(a)
输出结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = [x*x for x in range(10)] print(a)
输出结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
def f(n): return n**2 a = [f(x) for x in range(10)] print(a)
输出结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
for前面要操作的变量必须跟in前面要遍历的变量一样
二、一个额外的知识点:
t = [1,2] a,b = t print(a) print(b)
t = [1,2,3] a,b,c = t print(a) print(b) print(c)
这里要复制的变量个数 必须跟等号后面提供的元素个数相同
三、可迭代对象:
给定一个list或者tuple,通过for循环来遍历这个list或者tuple、这种遍历就是迭代(iteration)。只要是可迭代的对象都可以进行迭代,
即可迭代对象都可以用for循环遍历
有_iter()_方法的对象都是可迭代对象,该方法会返回一个对象,这个对象就是迭代器,迭代器会记录其所属可迭代对象的状态,就是迭代到哪了
看例子
t = [1,2] a = t.__iter__()
print(next(a))
next()方法是Python内置方法,用于操作迭代器,该句执行后打印1
如果再执行一次
t = [1,2] a = t.__iter__() print(next(a)) print(next(a))
会返回1和2
四、生成器:
可以这样做个类比,可迭代对象就是十盘菜,已经做好了,随时可以拿来吃,即数据全体已经保存在内存中
生成器就是一个厨师,你要吃那道菜,他给你现场做
a = (x for x in range(10)) print(a)
<generator object <genexpr> at 0x00000000009FCBA0>
a就是生成器,生成器操作跟迭代器一样,通过调用next内置方法
a = (x for x in range(10)) print(next(a)) print(next(a))
打印结果
0
1
生成器也是一个可迭代对象,可以调用for进行遍历
a = (x for x in range(10)) for i in a: print(i)
还有一种生成器对象是函数形式
def foo(): print("ok1") yield 1 print("ok2") yield 2 g = foo() print(g)
<generator object foo at 0x000000000067CBA0>
此时g就是一个生成器对象,只要函数内部有yield,这个函数名+括号就是生成器对象
def foo(): print("ok1") yield 1 print("ok2") yield 2 g = foo() print(next(g))
输出结果:
ok1
1
def foo(): print("ok1") yield 1 print("ok2") yield 2 g = foo() print(next(g)) print(next(g))
输出结果:
ok1
1
ok2
2
六、再插入一个小知识点:
a = 1 b = 2 a,b = b,a+b print(a) print(b)
a,b = b,a+b
这句右边是同时执行的
所以输出结果是
2
3