本章内容概要
1. 三元表达式
2. 各种生成式
3. 匿名函数
4. 重要内置函数
本章内容详解
1. 三元表达式
1.1 语法结构
数据值1 if 条件 else 数据值3
1. 如果if 后面的条件成立 则使用if前面的值
2. 如果if 后面的条件不成立 则使用else后面的值
3. 三元表达式:仅限于二选一的情况并且不建议嵌套使用,三元表达式一般情况下两个值都是具体的数据值不是函数
1.2 代码详解
1. 编写一个函数 比较两个数的大小 返回大的那个
2. 初解
def my_max(a, b): if a > b: return a else: return b res = my_max(1, 10) print(res)
3. 三元表达式
def my_max(a, b): # if a > b: # return a # else: # return b return a if a> b else b res = my_max(1, 10) print(res)
4. 在python中代码不是精简的越少越好 在精简的过程中还要保证代码的可读性,如以下代码
res = 23 if 10 > 5 else (22 if 0 else (66 if 1 == 2 else 66))
2. 各种生成式
2.1 列表生成式
1. 列表生成式中只能出现for和if
2. 讲解:有列表name_list = [‘jason’, ‘kevin’, ‘oscar’, ‘jerry’, ‘tony’] 给列表所以的数据值加上_NB的后缀
for 循环添加
name_list = ['jason', 'kevin', 'oscar', 'jerry', 'tony'] # 1.定义一个新的列表 new_list = [] # 2.循环原列表中所有的数据值 for name in name_list: # 3.拼接_NB后缀 new_name = name + '_NB' # 4.追加到新列表中 new_list.append(new_name) print(new_list)
用列表生成式 一行代码解决,先执行for 循环 然后将一个个的数据值交给for循环前面处理
# 语法结构 变量名相关处理 for 变量名 in 数据集
# 先执行for 循环 然后将一个个的数据值交给for循环前面处理 new_list = [name + '_NB' for name in name_list] print(new_list)
还支持if判断 先执行for循环 然后将一个个的数据值交给if判断 结果为True则最后交给for循环前面处理
# 语法结构 变量名相关处理 for 变量名 in 数据集 if 条件
# 还支持if判断 先执行for循环 然后将一个个的数据值交给if判断 结果为True则最后交给for循环前面处理 new_list = [name + '_NB' for name in name_list if name != 'jason'] print(new_list)
# 语法结构 {v:k for 变量名 in 数据集}
new_dict = {i: 'jason' for i in range(10)} print(new_dict)
2.3 集合生成式
集合生成和列表 ,字典差不多
1. 代码讲解
# 语法结构 变量名 for 变量名 in 数据集 if 条件 new_set = {i for i in range(10) if i == 6}
print(new_set)
3. 匿名函数
3.1 定义
匿名函数就是没有函数名的函数,一种使用lambda定义的匿名函数。这种函数可以用在任何普通函数可以使用的地方,但在定义时被严格限定为单一表达式。从语义上讲,它只是普通函数的语法糖
3.2 语法结构
lambda 形参:返回值
3.3 具体案例
(lambda x: x + 1)(123) # 直接调用 res = lambda x: x + 1 # 命名调用 print(res(123))
3.4 应用场景
匿名函数通常都需要配合其他函数一起使用 用于减少代码
4. 重要内置函数
4.1 max() 求最大值 min() 求最小值
1. max() 求最大值
l1 = [223, 3423, 123, 24, 34, 35, 435, 3, 24, 3534, 53, 24, 234, 132, 4234, 456, 456, 5345, 4, 234, 345, 23, 2123432] res = max(l1) print(res) # 2123432
2. max 字典使用 匿名集合内置函数使用
dic = { 'jason': 100, 'aj': 123, 'Bason': 9999, 'zero': 888 } print(max(dic))
运行代码返回的 zero ,而字典中Bason 的数据才是最大,什么原因?
字典参于for 循环只能获取k ,运行图中代码 ,只是对k值进行比较 ,字符串比较,比较首字母 ,而数值是ASCII码
A-Z 为 65-90 a-z 为 97-122
由代码看出可知 z > j > a >B 所有运行结果返回zero, 怎么比较字典的值?
运用匿名函数数
dic = { 'jason': 100, 'aj': 123, 'Bason': 9999, 'zero': 888 } def index(k): return dic.get(k) res = max(dic, key=index) print(res) # Bason
# 代码精简 res = max(dic, key=lambda k: dic.get(k))
3. min() 最小值 和max() 用法一样
4.2 map() 映射
l1 = [11, 22, 33, 44, 55, 66] # 需求:将列表中所有的数据值自增20
1. 方式1 :for循环
l2 = [] for i in l1: l2.append(i+20) print(l2) # [31, 42, 53, 64, 75, 86]
2. 方式2 :列表生成
l2 = [ i + 20 for i in l1] print(l2)
3. 方式3 :map函数
res = map(lambda x: x + 20, l1) print(res) # <map object at 0x000001E5F99B0130>
运行结果返回 <map object at 0x000001E5F99B0130>?还得需要定义列表
print(list(res))
4. 方式4:函数
def index(a): return a + 20 res = map(index, l1) print(list(res))
4.3 filter() 过滤
l1 = ['jason', 'kevin', 'oscar', 'tony'] # 需求:移除数据值里面的jason
1. 方式1:for 循环
l2 = [] for i in l1: if i != 'jason': l2.append(i) print(l2)
2. 方式2:列表生成式
l2 = [i for i in l1 if i != 'jason'] print(l2)
3. 方式3:filter
res = filter(lambda a: a != 'jason', l1) print(res) # <filter object at 0x00000195F21E6C70> print(list(res)) # ['kevin', 'oscar', 'tony'] 需要定义
4. 方式4:函数
def index(a): return a != 'jason' res = filter(index, l1) print(list(res))
4.4 reduce() 累加和
l2 = [1, 2, 3] # 需求:求列表中所有数据值的和
1. 方式1:for 循环
count = 0 for i in l2: count += i print(count)
2. 方式2:sum()
res = sum(l2) print(res)
3. 方式3:reduce()
from functools import reduce res = reduce(lambda x, y: x + y, l2) print(res)
4.5 zip() 拉链(连接)
# 结合成小元组
n1 = [1, 2, 3] n2 = ['jason', 'kevin', 'oscar']
1. zip() 方法
res = zip(n1, n2) print(res) # <zip object at 0x000002A9E38C7F40> print(list(res))
2. 扩展 1一一对应
n1 = [1, 2, 3, 4] n2 = [5, 6, 7, 8] n3 = 'jack' res = zip(n1, n2, n3) print(list(res))
3. 扩展2 不一一对应 返回最小的个数
n1 = [1, 2, 3, 4, 5, 6, 7] n2 = [5, 6, 7, 8] n3 = 'jason' res = zip(n1, n2, n3) print(list(res))
作业
1. 多层装饰器
装饰器是修改其他函数功能的函数吗,有助于代码更简洁,不不改变被装饰对象原有的 ‘调用方式’ 和 ‘内部代码’的情况下给被装饰对象添加新的功能
多层装饰器 就是有多个装饰器,而且多层装饰器是从下往上依次执行,被装饰的函数名所指代的函数一直被装饰器中的内层函数所指代的,而多层装饰器中就有多层语法糖,多层语法糖的解读顺序时先看语法糖有几个,然后再由下往上看,遇到最后一个才会使用相同的变量名传给装饰器函数使用,也就是说运行了多个装饰器,也运行了变量名的更换,之后才会调用函数体内部代码
2. 有参装饰器
有参装饰器是为装饰器提供多样功能的选择,而由于语法糖的限制,outter函数只能有一个参数,该参数只能被用来接收被装饰对象的地址,而需要多个形参,就只能再加个装饰器,可以传多个参数,就是有参装饰器
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/272818.html