迭代器
只要是可迭代的对象,无论有没有下标,都是可以迭代的
# 迭代字符串
for x in 'hello world!':
print(x)
h
e
l
l
o
w
o
r
l
d
!
# 迭代list
sum = 0
for x in [1,3,4,6,7,8]:
sum+=x
print(sum)
29
# 迭代字典
dict = {'图书馆':3,'机场':11,'教研室':23}
for key in dict:
print('key is : {}, value is {}'.format(key,dict[key]))
key is : 图书馆, value is 3
key is : 机场, value is 11
key is : 教研室, value is 23
列表生成式
list1 = list(range(1,10))
list1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表生成式的语法:
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]
# 生成一个n^2的列表
list1 = [x * x for x in range(1,10)]
list1
[1, 4, 9, 16, 25, 36, 49, 64, 81]
我们可以添加条件限制,只收集偶数的二次方
list1 = [x * x for x in range(1,10) if x %2 ==0]
list1
[4, 16, 36, 64]
同时变量也可以变为两个或者以上
list1 = [(x*y,x/y) for x in range(1,5) for y in range(3,7)]
list1
[(3, 0.3333333333333333),
(4, 0.25),
(5, 0.2),
(6, 0.16666666666666666),
(6, 0.6666666666666666),
(8, 0.5),
(10, 0.4),
(12, 0.3333333333333333),
(9, 1.0),
(12, 0.75),
(15, 0.6),
(18, 0.5),
(12, 1.3333333333333333),
(16, 1.0),
(20, 0.8),
(24, 0.6666666666666666)]
生成器
我们利用之前的生成式,可以创建出符合某种规律的列表,但是,假如我们创建一个非常大的列表,而只需要前几个和后几个的值,那么我们就会造成空间浪费。为了避免这种浪费,我们可以在需要用到的时候再把对象创建出来,这种方法就叫生成器
生成器的创建
创建一个列表生成器的简单方法是把列表生成式的[]换成()
g1 = (x * x for x in range(1,10))
g1
<generator object <genexpr> at 0x7fb28bbfe660>
生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来
遍历生成器
# 方法1:直接使用for循环
for x in g1:
print(x)
1
4
9
16
25
36
49
64
81
# 方法2:使用next()函数
g1 = (x * x for x in range(1,10))
next(g1)
1
next(g1)
4
使用函数的方法创建生成器
#普通产生列表的函数
def my_function():
for i in range(1,10):
print(i*i)
my_function()
1
4
9
16
25
36
49
64
81
我们把函数里面的print替换成yield,就可以变成一个生成生成器的函数
#普通产生列表的函数
def my_function():
for i in range(1,10):
yield i*i
g1 = my_function()
next(g1)
1
next(g1)
4