博客
关于我
python之三元表达式、生成式、生成器表达式
阅读量:263 次
发布时间:2019-03-01

本文共 3382 字,大约阅读时间需要 11 分钟。

python之三元表达式、生成式、生成器表达式

文章目录

一、三元表达式

什么是三元表达式

三元表达式是python为我们提供的一种简化代码的解决方案

基本语法如下:

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值

三元表达式适用于

  • 条件成立返回一个值
  • 条件不成立返回一个值

需求:定义一个比较两个值的大小的函数

  1. 基本实现

    def max2(x,y):    if x > y:        return x    else:        return yres=max2(10,20)print(res) #20
  2. 优化:使用三元表达式

    def max2(x, y):    return x if x > y else yres = max2(10, 20)print(res)  # 20

二、生成式

生成式是python为我们提供的一种简化代码的解决方案,用来快速生成集合、字典、列表

  • **注意:**生成式只有集合生成式,字典生成式,列表生成式

列表生成式

基本语法如下:

英文伪代码示例:[expression     for item1 in iterable1 if codition1    for item2 in iterable2 if codition2    ...    for itemn in iterablen if coditionn]中文伪代码示例:[表达式     for 元素1 in 可迭代对象1 if 条件1    for 元素2 in 可迭代对象1 if 条件2    ...    for 元素n in 可迭代对象1 if 条件n]

示例

  • 需求:快速生成一个列表 鸡蛋1 到 鸡蛋10, 且排除鸡蛋7
# 1. 使用for循环egg_list = []for i in range(1, 11):    if i == 7:        continue    egg_list.append(f'鸡蛋:{i}')print(egg_list)  # ['鸡蛋:1', '鸡蛋:2', '鸡蛋:3', '鸡蛋:4', '鸡蛋:5', '鸡蛋:6', '鸡蛋:8', '鸡蛋:9', '鸡蛋:10']# 2. 优化: 使用列表生成式egg_list = [f'鸡蛋:{i}' for i in range(1, 11) if i != 7]print(egg_list)  # ['鸡蛋:1', '鸡蛋:2', '鸡蛋:3', '鸡蛋:4', '鸡蛋:5', '鸡蛋:6', '鸡蛋:8', '鸡蛋:9', '鸡蛋:10']
  • 示例二

    li = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'ooo', "xxq_dsb", 'egon_xxx']# 把后缀_dsb取出生成一个新的列表res = [item for item in li if item.endswith('_dsb')]print(res)  # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb']# 把所有小写字母全变成大写res = [item.upper() for item in li]print(res)  # ['ALEX_DSB', 'LXX_DSB', 'WXX_DSB', 'OOO', 'XXQ_DSB', 'EGON_XXX']# 把所有的名字去掉后缀_dsb# 方式一: 使用replace# res = [item.replace('_dsb', '') for item in li]# 方式二: 使用split+索引取值res = [item.split("_")[0] for item in li]print(res)  # ['alex', 'lxx', 'wxx', 'ooo', 'xxq', 'egon']
  • 示例三

    # 打印文件中字符的最长长度with open(r"a.txt","rt",enconding="utf-8")as f:    nums = [len(i) for i in f]    print(max(nums))

集合生成式

# 需求: 根据li中的内容, 排除末尾有'x'的, 快速生成一个集合li = ['alex', 'lxx', 'wxx', 'ooo', 'xxq', 'egon']set1 = {   item for item in li if not item.endswith('x')}print(set1)  # {'xxq', 'egon', 'ooo'}

字典生成式

# 需求: 更具li, 快速生成一个字典, 字典value默认为Noneli = ['name', 'age', 'gender']dic = {   key: None for key in li}print(dic)  # {'name': None, 'age': None, 'gender': None}# 需求: 根据items, 排除某一项二元组中含有'gender'的二元组. 二元组第一个值作为字典的key, 第二个值作为字典的valueitems = [('name', 'egon'), ('age', 18), ('gender', 'male')]dic = {   key: value for key, value in items if key != 'gender'}print(dic)  # {'name': 'egon', 'age': 18}

三、生成器表达式

创建一个生成器对象有两种方式

  • 调用带yield关键字的函数,
  • 使用生成器表达式,

基本语法格式:

  • 与列表生成式的语法格式相同,只需要将[]换成(),即:
(expression for item in iterable if condition)

生成器表达式与列表表达式比较

  • 语法: 语法类似, 生成器表达式使用 ( ), 列表生成式使用 [ ]
  • 返回值:
    • 列表生成式返回的是一个列表
    • 生成器表达式返回的是一个生成器对象
  • 内存占用:
    • 列表生成式中的元素值, 直接保存在内存
    • 生成器表达式在内存中一次只产生一个值,比列表生成式更加节省内存空间

示例:

# 需求: 生成一个含有4~9之间的生成器对象g = (i for i in range(4, 10))print(g)  # 
at 0x00000151FFBF43C0>print(next(g)) # 4print(next(g)) # 5print(next(g)) # 6print(next(g)) # 7print(next(g)) # 8print(next(g)) # 9print(next(g)) # 生成器取值完毕, 抛出异常: StopIteration# 应用场景: 读取大文件的字节数with open('db.txt', 'rb') as f: total_bytes = (len(line) for line in f) total_size = sum(total_bytes) # 需求: 读取打文件的字符串的个数with open("db.txt", 'rt', encoding='utf-8') as f: # 方式一: 定义初始值 + 累加 init_str = 0 for line in f: init_str += len(line) # 方式二: 使用生成式表达式 + sum total_str = sum([len(line) for line in f]) # 方式二优化一: 使用生成器表达式 + sum total_str1 = sum((len(line) for line in f)) # 方式二优化二: 使用生成器表达式 + sum使用生成器表达式不加括号 total_str2 = sum(len(line) for line in f)

转载地址:http://reto.baihongyu.com/

你可能感兴趣的文章
对曲线的坐标的积分的斯托克斯公式+参数定积分法
查看>>
SAR图像超分辨技术
查看>>
fpga工程师笔试题
查看>>
神经网络遗传算法函数极值寻优-非线性函数极值
查看>>
201604-4 游戏 ccf
查看>>
1144. The Missing Number (20)
查看>>
为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接
查看>>
【Spring Boot 26】分别在SpringBoot和Vue中解决跨域问题
查看>>
Class.forName(),classloader.loadclass用法详解
查看>>
tp5.1 页面错误!请稍后再试~ 安装好后,提示错误
查看>>
阿里云 安全组规则 设置某个IP不能访问服务器(出站)
查看>>
系统打了补丁后,IIS装不了的解决…
查看>>
禁止重复提交(JavaScript控制表单…
查看>>
php js 通过sotitle(id,arr)函数输入ID取得返回值
查看>>
删除外键约束
查看>>
c++ 预处理命令 #error 用法
查看>>
OpenGL fragmentlist片段列表的实例
查看>>
OpenGL hdrb和loom的实例
查看>>
OpenGL packetbuffer分组缓冲器的实例
查看>>
OpenGL shader class自定义着色器的实例
查看>>