列表推导式和生成器

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
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PCGuo999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值