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

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

一、三元表达式

什么是三元表达式

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

基本语法如下:
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
三元表达式适用于
  • 条件成立返回一个值
  • 条件不成立返回一个值

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

1.基本实现

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

2.优化:使用三元表达式

def max2(x, y):
    return x if x > y else y
res = 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默认为None

li = ['name', 'age', 'gender']
dic = {key: None for key in li}
print(dic)  # {'name': None, 'age': None, 'gender': None}

# 需求: 根据items, 排除某一项二元组中含有'gender'的二元组. 二元组第一个值作为字典的key, 第二个值作为字典的value

items = [('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)  # <generator object <genexpr> at 0x00000151FFBF43C0>

print(next(g))  # 4
print(next(g))  # 5
print(next(g))  # 6
print(next(g))  # 7
print(next(g))  # 8
print(next(g))  # 9
print(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值