1.列表推导式
1.range()函数
range()函数可以创建一个整数列表range(start,stop[,step])
参数介绍:
-
start
表示开始的数值,默认为0 -
stop
表示结束的数值,但不包括该值 -
step
表示步长,默认为1
即从start开始,以step为步长,到stop结束。
2.列表推导式
若我们想要生成一个有规律的列表,普通的方法是使用for循环进行赋值
i=0
for x in range(5):
a[i]=x
i+=1
这样会显得非常繁琐,为了简化这个操作,我们可以使用列表推导式来实现
a=[x for x in range(5)]
# a=[0,1,2,3,4]
a=[x for x in range(5,0,-1)]
# a=[5, 4, 3, 2, 1]
这样极大简化了生成过程,并且若需要筛选一部分,可以在range后加入if判定,从而实现筛选赋值
a=[x for x in range(5) if x%2==0]
# a=[0,2,4]
也可以不使用range,比如设置成字符串
a=[x for x in "abc"]
# a=['a', 'b', 'c']
当我们需要设置(x,y)元组时,也可以使用列表推导式
a=[(x,y) for x in range(3) for y in "abc"]
# a=[(0, 'a'), (0, 'b'), (0, 'c'), (1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c')]
当需要设置嵌套列表时,同样如此
a=[[x for x in range(y-2,y)]for y in range(5)]
# a=[[-2, -1], [-1, 0], [0, 1], [1, 2], [2, 3]]
另外,字典和集合也可以用推导式来实现
# 字典
a={key:value for key in ('name','age') for value in range(3)}
# a={'name': 2, 'age': 2}
# 集合
a={x for x in range(3)}
# a={0, 1, 2}
2.生成器的创建方式
1.定义
生成器是一次生成一个值的特殊类型函数。生成器是根据算法生成数据的一种机制,每次调用生成器只生成一个值,可以节省大量内存。
2.创建生成器
(1)生成器推导式
与列表推导式**“用[]”类似,只不过生成器推导式使用“小括号()”**
# 列表推导式:
data=[x for x in range(5)]
print(data)
# 生成器推导式:
data=(x for x in range(5))
print(next(data))# 0 获取第一个数据
print(next(data))# 1 获取下一个数据
print(next(data))# 2 获取下一个数据
# 生成器输出时也可以:
for i in data:
print(i)
(2)yield关键字(使用频繁)
只要在函数体里面看到有 yield 关键字那么这个函数就是生成器
- 代码执行到 yield 会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
- 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个
StopIteration
异常,表示停止迭代异常- while 循环内部没有处理异常操作,需要手动添加处理异常操作
- for 循环内部自动处理了停止迭代异常,使用起来更加方便,推荐大家使用。
def p(n):
for x in range(n):
print("action")
yield x # 每次都从上次结束的地方继续运行
print("ending")
n=p(2)
for x in n:
print(x)
'''
执行结果:
action
0
ending
action
1
ending
'''
(3)使用生成器实现斐波那契数列
# 打印num个斐波那契数列
def fib(num):
a = 0
b = 1
# 记录生成个数
count = 0
while count < num:
result = a
# 相当于每次都向后移动
a, b = b, a + b
count += 1
# 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
yield result
f = fib(5)
# 遍历生成的数据
for value in f:
print(value)
'''
执行结果:
0
1
1
2
3
'''