一、三元表达式
1.1、何为三元表达式?
三元表达式是if判断语句的一种简写语法!所谓三元则分别是:
- 条件
- 条件成立时的返回值
- 条件不成立时的返回值
1.2、为何用它?
是为了在某种场景下可以对if语句进行简写,使其看起来更为简洁明了!
1.3、如何用?
语法格式本地化(不要在意细节,看得懂就行):
return 条件成立时的返回值 if 条件 else 条件不成立时返回的值
举个比较大小的例子,如下所示是普通if判断语句:
# 可以直接把结果赋予给一个变量名
def compare(a, b):
if a > b:
return a
else:
return b
print(compare(66, 55))
使用三元表达式则可以简洁为:
def compare(a, b):
return a if a > b else b
print(compare(66, 55))
二、生成式
即容器数据类型的一种简洁写法
2.1、列表生成式
2.1.1、列表内用for + if
语法格式:for 变量名 in 可迭代对象 if 条件
如下所示为普通的for + if
student_list = []
for i in range(1, 5):
if i == 3:
continue
student_list.append(f'student:{i}')
print(student_list)
# 执行得到结果
['student:1', 'student:2', 'student:4']
生成式可简写为:
student_list = []
student_list = [f'student:{i}' for i in range(1, 5) if i != 3]
print(student_list)
# 执行得到结果
['student:1', 'student:2', 'student:4']
2.1.2、筛选列表元素
变量名1 for 变量名1 in 列表1 if 变量名.endswith(筛选条件)
# start为开头,end为结尾
student = ['sanxi_gz', 'andy_gz', 'others']
student_new = [i for i in student if i.endswith('_gz')]
print(student_new)
# 执行得到结果
['sanxi_gz', 'andy_gz']
2.1.3、元素大小写转换
student = ['sanxi_gz', 'andy_gz', 'others']
student_upper = [i.upper() for i in student]
print(student_upper)
# 执行得到结果
['SANXI_GZ', 'ANDY_GZ', 'OTHERS']
2.1.4、去除元素字符
2.1.4.1、replace替换
# 去除元素的后缀_gz
student = ['sanxi_gz', 'andy_gz', 'others']
student_new = [i.replace('_gz', '') for i in student]
print(student_new)
# 执行得到结果
['sanxi_bj', 'andy_bj', 'others']
2.1.4.2、split切片 + 索引
student = ['sanxi_gz', 'andy_gz', 'others']
student_new = [i.split('_')[0] for i in student]
print(student_new)
# 执行得到结果
['sanxi', 'andy', 'others']
2.2、字典生成式
2.2.1、列表初始化为字典
student = ['sanxi', 'andy', 'others']
student_new = {key: 'gz' for key in student}
print(student_new)
# 执行得到结果
{'sanxi': 'gz', 'andy': 'gz', 'others': 'gz'}
2.2.2、拆分列表转换为字典
# 筛选others,转换为字典前提是列表内元素含有两个值
student = [('sanxi', 'gz'), ('andy', 'gz'), ('others', 'bj')]
student_new = {key:value for key,value in student if key != 'others'}
print(student_new)
# 执行得到结果
{'sanxi': 'gz', 'andy': 'gz'}
2.3、集合生成式
2.3.1、列表筛选转换集合
student = [('sanxi_gz'), ('andy_gz'), ('others_bj')]
student_new = {item for item in student if not item.endswith('_gz')}
print(student_new)
# 执行得到结果
{'others_bj'}
三、生成器表达式
注意事项:
- 生成器表达式语法与生成器基本一样,只是[]要换成()
与列表生成式区别
- 列表生成式返回的是一个列表,而生成器表达式返回的是一个生成器对象
- 列表生成式中的每个元素均保存在内存中,生成器表达式一次调用仅产生一个值,较前者节省内存
3.1、指定数值范围的生成器
list1 = (i for i in range(1,5))
print(list1)
# 执行得到结果
<generator object <genexpr> at 0x7f3764128660>
3.2、大文件处理
3.2.1、统计大文件字符串个数
不用生成式时,如下所示:
with open('haha', 'rt', encoding='utf-8') as file_haha:
total_char = 0
for i in file_haha:
total_char += len(i)
print(total_char)
用生成式可简写为:
with open('haha', 'rt', encoding='utf-8') as file_haha:
total_char = (len(i) for i in file_haha)
print(total_char.__next__())
3.2.2、统计大文件字节数
# 文件内容是“三溪666”,需要先
with open('haha', 'rt', encoding='utf-8') as file_haha:
total_char = (len(i.encode('utf-8')) for i in file_haha)
print(total_char.__next__())
# 执行得到结果
9