列表生成式、生成器、迭代
一、列表生成式
1、range()可以生成整数序列
range(a,b)生成a-b的整数序列,包括a,但不包括b
range(n)生成0-n的整数序列,包括0,但不包括n
将整数序列转成list,可以使用list(range(n))
2、可以在列表中加计算式生成特定规律的列表
[x*x for x in range(1,11)]就生成了[1x1,2x2,3x3,...,10x10]的列表
3、还可以使用多层循环生成列表
[m+n for m in 'ABC' for n in 'XYZ']
[变量的计算式 变量1的for循环 变量2的for循环 变量n的for循环]
4、dict的items()可以同时迭代key和value
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
5、计算式还可以使用变量的方法
例如[s.lower() for s in L]
二、生成器
1、第一种生成器的创建方式
列表生成式一旦赋值,那么所使用的存储空间就确定下来了,如果只访问前部的部分元素,那么后面的空间就浪费了,因此提出了生成器的概念,给生成器赋予某种算法规律,不需要创建完整的list,而只需要创建一个生成器,一边循环一边计算,值在未被计算出来前不占用存储,节省存储空间。
生成器创建如下:
g = (x * x for x in range(10))
一般使用for循环迭代生成器
for n in g:
print(n)
2、第二种生成器的创建方式
用函数定义推算规则,如果一个函数定义中包含yield关键字,那么这个函数就是一个generator
例如斐波那契数列的generator创建如下:
def fib(n):
a,b=0,1
for i in range(n):
yield b
a,b=b,a+b
调用时如下:
for k in fib(6):
print(k)
调用时,当函数中遇到yield时,返回打印yield 后面的值,然后继续执行yield之后的语句
generator到结束时有StopIteration错误,如果捕获到该错误就知道到结尾了
3、杨辉三角的打印list
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
def YH():
L=[1]
while True:
yield L
L=[L[i]+L[i+1] for i in range(len(L)-1)]
L.insert(0,1)
L.append(1)
n=0
for i in YH():
print(i)
n+=1
if n>=10:
break
三、迭代器
1、凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
2、可以通过isinstance(a,Iterator)和isinstance(a,Iterable)来判断类型