python之生成式与生成器

一、生成式

列表生成式

列表生成式就是一个用来生成列表的特定语法形式的表达式。
是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。

列表生成式实例

  1. 生成一个2n+1的数字列表,n为从3到11的数字。具体实现如下:
nums_list = [2 * n + 1 for n in range(3, 12)]
print(nums_list)

在这里插入图片描述
2. 求以r为半径的圆的面积和周长(r的范围从1到10)。具体实现如下:

import math

circle = [(math.pi * (r ** 2), 2 * math.pi * r) for r in range(1, 11)]
print(circle)

在这里插入图片描述
3. 求1-50所有数的平方

square = [(i + 1) ** 2 for i in range(50)]
print(square)

在这里插入图片描述
4. 找出1~100之间所有奇数, 并且返回一个列表。如果能被3整除, 返回返回该数的平方,
否则返回该数的三次方 。

nums = [num ** 2 if num % 3 == 0 else num ** 3 for num in range(1, 101, 2)]
print(nums)

在这里插入图片描述

集合生成式和字典生成式

用来快速生成集合和字典

字典生成式应用实例

1). 将字典的key值和value值调换。

d= {'a':'dog','b':'cat','c':'boy'}
print({value:key for key,value in d.items() })

在这里插入图片描述
2). 大小写计数合并 : 已知字典{‘A’:2, ‘a’:5,‘b’:10, ‘c’:4,‘c’:6}, 合并后为{‘a’:7, ‘b’:10,‘c’:10}
key值最终全部为小写.

d= {
    'A':2,'a':5,'b':10,'c':4,'C':6
}
# 合并字典; d.get(key.lower(), 0), 如果key'值不存在,默认返回0;
dict_result = {key.lower():d.get(key.lower(), 0) + d.get(key.upper(), 0)for key, value in d.items()}
print(dict_result)

在这里插入图片描述
3). 假设有20个学生,学生分数在60-100之间,筛选出成绩在90分以上的学生。

import  random
stuInfo = {'student'+str(i):random.randint(60,100) for i in range(20)}
print({name:score for name,score in stuInfo.items() if score >90})

在这里插入图片描述

二、生成器

在Python中,一边循环一边计算的机制,称为生成器:Generator。
如何创建生成器?
第一种方法: 列表生成式的改写以及生成器的for循环查看。 []改成()
在这里插入图片描述
第二种方法: yield关键字。
如果函数里面有yield关键字, 这个函数的返回值是生成器
如果遇到yield, 函数停止执行, 当再次调用next方法时, 从停止的地方继续执行;

这里我们测试一下yield的工作机制:

def fun():
    print('1')
    yield  2  # 图国函数里面遇到return, 函数就执行结束;
    print('3')
    yield  4

result = fun()
# # 默认next方法会发yield后面的值返回回来;
print(next(result))
print("函数停止位置")
print(next(result))

在这里插入图片描述

生成器的查看有两种方式。一种实上边提到的for遍历查看。另一种就是使用next方法查看,next方法可以一个一个打印出来。
在这里插入图片描述

生成器的特点是什么?

  1. 节约内存
  2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是
    说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新
    创建的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值