17、Python之表达式

Python函数 / 2020-11-29

一、三元表达式

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
世间微尘里 独爱茶酒中