Python表达式与生成式
Python表达式与生成式
前言
本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作。其中涉及到一些性能问题(微乎其微)可以不做考虑。
三元表达式
三元表达式中有三个重要的元素:
1.条件是第一元素
2.条件成立返回的值是第二元素
3.条件不成立返回的值是第三元素
def func(x,y):
if x > y:
return "条件成立"
else:
return "条件不成立"
res1 = func(1,2)
print(res1)
# ==== 三元表达式 ====
x = 1
y = 2
# 条件成立后返回的值放在第一位,条件放在第二位,条件不成立后返回的值放在第三位
res2 = "条件成立" if x > y else "条件不成立"
print(res2)
# ==== 执行结果 ====
"""
条件不成立
条件不成立
"""
列表生成式
应用场景:
# 需求:提取出列表l中以 male 结尾的元素
l = ["Yunya-male", "Jack-male", "Cuihua-Female", "Mary-Female", "Laura-Female", "Tom-male"]
new_l = []
for name in l:
if name.endswith("-male"):
new_l.append(name)
print(new_l)
# ==== 列表生成式 ====
# 第一位放需要添加的元素。中间放迭代变量,最后放if条件。只有if条件成立后迭代变量才会被添加至新列表中
new_l2 = [name for name in l if name.endswith("-male")]
# new_l2 = [name for name in l if name.endswith("-male") else "x"] # 注意不能跟else,不符合条件的迭代变量将会被直接舍弃
print(new_l2)
# ==== 执行结果 ====
"""
['Yunya-male', 'Jack-male', 'Tom-male']
['Yunya-male', 'Jack-male', 'Tom-male']
"""
如何快速掌握列表生成式:
# 在列表生成式中,也可以将成功返回的结果做一些处理。
l = [str(i) for i in range(10) if i > 5]
print(l)
# 怎么样读懂列表生成式?
# 1:先看循环后面的代码 for i in range(10) if i > 5。看看要循环几次
# 2:再看前面代码 str(i) ,看看要生成什么值。
# ==== 执行结果 ====
"""
['6', '7', '8', '9']
"""
注意:列表生成式与range()的迭代变量没有任何关系:
# 需求:生成一个列表,里面包含8个值为15的元素
l = [15 for i in range(8)] # 可以看到迭代变量i与条件成立后添加值没有任何关系。
字典生成式
# 1.可以设定默认的value值
dic1 = {i:"value" for i in range(10) if i > 5}
print(dic1)
# 2.对于迭代一些特殊格式的容器。可以直接生成出字典
items = [("name","Yunya"),("age",18),("gender","male")]
dic2 = {k:v for k,v in items}
print(dic2)
# ==== 执行结果 ====
"""
{6: 'value', 7: 'value', 8: 'value', 9: 'value'}
{'name': 'Yunya', 'age': 18, 'gender': 'male'}
"""
集合生成式
# 1.字典生成式不要 :value 就是集合生成式
li = ["a","b","a","b","c","d","d","e"]
set1 = {i for i in li}
print(set1)
# ==== 执行结果 ====
"""
{'a', 'b', 'c', 'e', 'd'}
"""
生成器表达式
# 生成器表达式和列表生成式使用方式一样。只是符号不一样,一个是[],一个是()
g = (i for i in range(10) if i > 5)
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())
# ==== 执行结果 ====
"""
<generator object <genexpr> at 0x0000023A84B9E350>
6
7
8
"""
应用场景:
# 统计文件中的字符个数
# === 方式1 ===
with open(file="计算机硬件基础.text",mode="rt",encoding="utf-8") as f:
res1 = 0
for line in f:
res1 += len(line)
print(res1)
# === 方式2 ===
# sum()是内置函数,接收一个可迭代对象。将其中元素进行迭代以进行累加操作
with open(file="计算机硬件基础.text",mode="rt",encoding="utf-8") as f:
res2 = sum(len(line) for line in f) # 如果是将生成器表达式作为参数传递给另一个函数,可以不用套括号。
print(res2)
# ==== 执行结果 ====
"""
959
959
"""
扩展:为何没有元组生成式
元组本身就是不可变类型,对比列表生成式,它的工作原理其实就是迭代一个可迭代对象然后使用append()进行添加元素。由于元组是不可变类型故不能尝试改变其本身容器中元素的个数。
Python表达式与生成式的更多相关文章
- Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数
上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...
- python之三元表达式与生成式与匿名与内置函数(部分)
目录 三元表达式 各种生成式 列表生成式(可同样作用于集合) 字典生成式 匿名函数 重要内置函数 map() zip() filter() reduce() 常见内置函数(部分) 三元表达式 三元表达 ...
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- python基础——列表生成式
python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...
- 一、Python表达式基础
Python 能执行简单的计算器的功能: 如>>2+2 ==> 4,1/2==>0.5或者这样写1/2.0==>0.5(取浮点型) 1//2 ==>0 (" ...
- Python 表达式 i += x 与 i = i + x 等价吗?
Python 表达式 i += x 与 i = i + x 等价吗? 看个例子 a = [1, 2, 3] b = a # 写法一 b += [4] # 写法二 # b = b + [4] print ...
- python基础----列表生成式、生成器表达式
结论: 1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用 ...
- Python基础-列表生成式和生成器表达式
一.列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list ...
- python 之 列表生成式、生成器表达式、模块导入
5.16 列表生成式 l=[]for i in range(100): l.append('egg%s' %i)print(l)l=['egg%s' %i for i in range(100 ...
随机推荐
- Java实现 LeetCode 764 最大加号标志(暴力递推)
764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...
- Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
672. 灯泡开关 Ⅱ 现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮.在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态. 假设这 n 只灯泡被编号为 [1, 2 ...
- (Java实现)蓝桥杯Excel地址
历届试题 Excel地址 原题地址 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, ...
- Java实现 蓝桥杯 算法提高 01背包
算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...
- Java实现 LeetCode 500 键盘行
500. 键盘行 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", & ...
- Java实现 蓝桥杯 算法提高 快速排序
试题 算法提高 快速排序 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 用递归来实现快速排序(quick sort)算法.快速排序算法的基本思路是:假设要对一个数组a进行排序,且a ...
- 【Mysql】使用一条sql查询出库表结构信息
1.新建查询 将以下脚本粘贴进去 脚本如下: SELECT TABLE_SCHEMA 库名, TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA ...
- cocos2dx 实现遮罩
参考博文:http://blog.csdn.net/myarrow/article/details/19913653 参考博文:http://blog.csdn.net/song_hui_xiang/ ...
- 基于EntityFramework 6 Code First实现动态建库,分库,数据库自动迁移
一.前言 公司原本有一个"xx系统",ORM使用EntityFramework,Code First模式.该系统是针对某个客户企业的,现要求该系统支持多个企业使用,但是又不能给每个 ...
- redis的持久化(RDB与AOF)
1.为什么redis要实现持久化? 避免因宕机.断电等场景导致进程退出后数据丢失,如果redis的数据都只存放于内存,那么进程退出后数据就丢失了.持久化机制可以持久化内存数据到硬盘,重启redis后基 ...