7.7内容回顾
三元表达式
-
基本语法结构
值1 if 条件 else 值2
如果条件成立则使用值1也就是if前面的数据
如果条件不成立则使用值2也就是else后面的数据
适用于场景为二选一的情况下。
name = input("请输入你的账号:") res = "成功!" if name == 'jason' else "失败!" print(res)
列表生成式
-
需求将下列列表中每个数据值后面在多加一个字母o
list1 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']
-
首先我们的以前学过的for循环也能实现
list1 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg'] list2 = [] # 先定义一个空列表 for data in list1: # # 使用for将列表每个值取出来 new_data = data+'o' # # 将每个取出来的值拼接个字母o,并将产生的新值赋值给新的变量名 list2.append(new_data) # # 将新的值使用列表的内置方法追加到新列表里 print(list2) # ['aaao', 'bbbo', 'ccco', 'dddo', 'eeeo', 'fffo', 'gggo']
-
那么列表生成式的也是利用for的原理但其比第一个更加的简洁方便
ist1 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg'] # # 2.再将每个数据值进行一个拼接 1. 先循环取出每个数据值 list2 = [data+'o'for data in list1] print(list2) # ['aaao', 'bbbo', 'ccco', 'dddo', 'eeeo', 'fffo', 'gggo']
-
列表生成式复杂版本,加上if判断还可以增加啊筛选功能
# 示例1: list1 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg'] # 3. 将判断好的数据拿来拼接。1.循环获取每个数据值。 2.判断取出的是否是'aaa'如果不是将其舍去如果是将其拼接字母o list2 = [data+'o'for data in list1 if data =='aaa'] print(list2) # ['aaao'] # 示例2: list1 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg'] # 3. 将判断好的数据拿来拼接。1.循环获取每个数据值。 2.判断取出的是否是'aaa'如果是将其舍去如果不是将其拼接字母o list2 = [data+'o'for data in list1 if data !='aaa'] print(list2) # ['bbbo', 'ccco', 'dddo', 'eeeo', 'fffo', 'gggo']
如果是for循环加if判断同时出现的列表生成式是不能出现else的因为会产生歧义(for和if是都能使用else的)
字典成式
-
示例1
""" 1. for循环依次取出range里面的定义好数量的数据 2. 每次取出的数据当作字典的k,jason默认为字典的v组织成一个k:v键值对 3.依次循环组织成一个新的字典dict1 """ dict1 = {i: 'jason' for i in range(10)} print(dict1) """ {0: 'jason', 1: 'jason', 2: 'jason', 3: 'jason', 4: 'jason',5: 'jason', 6: 'jason', 7: 'jason', 8: 'jason', 9: 'jason'} """
-
示例2:
""" 1. for循环依次取出range里面的定义好数量的数据 2. 判断取出来的值是否不等于1如果不成立那么说明这个数据是1将直接丢弃 3.如果成立则将取出的数据当作字典的k,jason默认为字典的v组织成一个k:v键值对 3.依次循环组织成一个新的字典dict2 """ dict2 = {i: 'jason' for i in range(10) if i != 1} print(dict2) """ {0: 'jason', 2: 'jason', 3: 'jason', 4: 'jason', 5: 'jason', 6: 'jason', 7: 'jason', 8: 'jason', 9: 'jason'} """
集合生成式
-
示例:
""" 1. for循环依次取出range里面的定义好数量的数据 2.将每次取出的数据赋值给i 3.将i的数据值添加进集合里依次循环得到一个新的合集 """ set1 = {i for i in range(10)} print(set1) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
匿名函数
匿名函数可以简单的理解为就是一个没有函数名的函数
不同于正常函数的是它可以不需要定义函数名直接写入格式调用
-
语法结构
关键字lambda 参数:返回值
# 1.直接调用 print((lambda x: x + 100)(3)) # 103 # 2.间接调用 res = (lambda x: x + 100)(30) print(res) # 130 """ 匿名函数通常都需要配合其它函数一起使用,用于减少代码 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁 """
匿名函数的应用场景
匿名函数可以配合一些内置函数来使用。
-
示例1.
内置函数max,
作用:求出数据的最大值
# 1.需求将下列列表中的数据求出最大值 list1 = [1,6,8,7,6,55,98,55,146,88] print(max(list1)) # 146 # 求出下列字典中每个人对应工资的最大值 dict1 = {'jason': 100, 'tony': 6000, 'tom': 200, 'zero': 36, } print(max(dict1)) # zero """ max的底层原理相当于用个for循环来比较这个字典的中数据的大小 而for循环再针对字典做运算的时候是只针对字典的K做运算V不参与 那么得出的结论就是这个字典的k, 字符串在做比较字符串做比较的时候是根据字符编码中的ACSSI码表来比较 ASCCI码表中 A-Z 对应的是65-90 a-z对应的是97-122 而这个时候想要得出字典k对应的v的最大值可以运用函数 """ # 方式1 自定义函数 def statistics(data): return dict1.get(data) print(max(dict1, key=statistics)) # tony # 方式2 匿名函数 print(max(dict1,key=lambda x:dict1.get(x))) # tony """ 1.循环这个字典依次取出每个k将拿到的k交给函数statistics 2.函数statistics拿到k后将它的V取出交给max来比较 3.依次循环比较得到结果 tony的工资最高 """
-
示例2
内置函数min,
作用:求出数据中的最小值
dict1 = {'jason': 100, 'tony': 6000, 'tom': 200, 'zero': 36, } print(min(dict1,key=lambda x:dict1.get(x))) # zero
-
示例3
内置函数map
作用:(映射)将处理好的数据以之前的位置放入一个新的列表中 。
# 1. 需求将下列列表中的数据值都自增30 list1 = [1, 6, 7, 8, 55, 55, 88, 98, 146] # 方式1 for循环可以实现 list2 = [] for i in list1: i += 30 list2.append(i) print(list2) # [31, 36, 37, 38, 85, 85, 118, 128, 176] # 方式2 列表生成式 list2 = [i + 30 for i in list1] print(list2) # [31, 36, 37, 38, 85, 85, 118, 128, 176] # 方式3 map+自定义函数、map+匿名函数。 # 自定义函数 def add_to(x): return x+30 new_list = map(add_to,list1) print(list(new_list)) # [31, 36, 37, 38, 85, 85, 118, 128, 176] # 匿名函数 new_list = map(lambda x: x + 30, list1) print(list(new_list)) # [31, 36, 37, 38, 85, 85, 118, 128, 176] """ """
-
示例4
内置函数filter
作用:将某个指定的数据值移除
# 1.将字符串a从列表中那个移除 # 列表的内置方法也能实现,如remove、pop,不过过于繁琐。 list1 = ['a', 'b', 'v', 'a', 'u', 'p', 'i', 'l', 'a', 't', 'n'] # 方式1 for循环 list2 = [] for i in list1: if i != 'a': list2.append(i) print(list2) # ['b', 'v', 'u', 'p', 'i', 'l', 't', 'n'] # 方式2列表生成式 list2 = [i for i in list1 if i != 'a'] print(list2) # ['b', 'v', 'u', 'p', 'i', 'l', 't', 'n'] # 方式3 filter+自定义函数、 filter+匿名函数。 # filter+自定义函数 def my_remove(x): return x != 'a' list2 = filter(my_remove, list1) print(list(list2)) # ['b', 'v', 'u', 'p', 'i', 'l', 't', 'n'] # filter+匿名函数 list2 = filter(lambda x: x != 'a', list1) print(list(list2)) # ['b', 'v', 'u', 'p', 'i', 'l', 't', 'n'] """ """
-
示例5
内置函数
作用:将单个数据整合成一个整体
# 1. 需求将下列列表中的字符串整合到一起 list1 = ['n', 'a', 'm', 'e', '.', 't', 'x', 't', ] # u = '' # # 方式1 for循环 for i in list1: u += i print(u) # name.txt # 方式2.reduce+匿名函数 from functools import reduce list2 = reduce(lambda x, y: x + y, list1) print(list2) # name.txt """ """
-
示例6
内置函数zip
作用:可以将多个装有不同类型的整体按照位置拼接到元组里
l1 = 'abcdefg' l2 = [11, 22, 66, 88, 44, 666, 444] l3 = {'kk': 11, 'qq': 22, 'ii': 33, 'rr': 44, 'hh': 55, } l4 = (1, 2, 3, 4, 5, 6, 7, 9) l5 = dict(zip(l1, l2, )) #如果想要做成字典类型可以根据字典的类型转换 print(l5) # {'a': 11, 'b': 22, 'c': 66, 'd': 88, 'e': 44, 'f': 666, 'g': 444} """ 将不同数据类型的数据根据位置拼接组成多个元组的形式 元组的数量取决于你想要拼接的多个数据长度的最小值来决定 zip的底层原理也是基于for循环的原理 将所放入的数据根据位置一一对应循环取出组成元组依次循环 """
作业
将多层装饰器及有参装饰器的执行流程用文字具体描述出来
1.多层装饰器
def outer1(func1):
print('我是outter1号')
def wrapper1(*args, **kwargs):
print('我是wrapper1号')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outer2(func2):
print('我是outter2号')
def wrapper2(*args, **kwargs):
print('我是wrapper2号')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outer3(func3):
print('我是outter3号')
def wrapper3(*args, **kwargs):
print('我是wrapper3号')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
# 多层语法糖
@outer1
@outer2
@outer3
def index():
print('from index')
index()
1.func3=index 先调用outer3(index)加括号,括号内填入紧跟它下面的函数名index,将outter3的返回值赋值给变量名index。
2.打印我是outer3号
3.此时outer3的返回值是wrapper3,那么顶上还有一个语法糖@outter2
4.func2 = wrapper3 先调用outer2(wrapper3)加括号,括号内填入它下面的函数名,此时它下面是@outer3 @outer的结果是wrapper3
5. 打印我是outer2号
6.此时outer2的返回值是wrapper2,他的顶上还有一个语法糖@outter1
7.func1= wrapper2 先调用outer1(wrapper2)加括号,括号内填入它下面的函数名,此时它下面是@outer2,@outter2的结果是wrapper2
8.打印我是outer1号
9. 此时outer1的返回值是wrapper1,然后它上面没有语法糖了将用index来接收它的返回值。
10.调用index相当于调用wrapper1 执行wrapper1
11 打印我是wrapper1号
12.调用func1 此时的func1就是outer1里面的形参绑定的是outer2的返回值wrapper2 那么开始调用wrapper2
13.根据上面第11步的代码调用wrapper2,执行wrapper2
14. 打印我是wrapper2号
15.调用func2 此时的func2就是outter2里面的形参绑定的是outer3的返回值wrapper3 那么开始调用wrapper3
16.根据上面第14步开始调用wrpper3,执行wrpper3。
17. 打印我是wrapper3号
18.调用func3 此时的func3就是outer3里面的形参绑定的是真正的index 那么等于调用index
19.调用 执行index
20. 打印from index
2.有参装饰器
def outer(condition,type_user):
def login_auth(func_name):
def inner(*args, **kwargs):
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 应该根据用户的需求执行不同的代码
if type_user =='jason':print('VIP')
if condition == '列表':
print('使用列表作为数据来源 比对用户数据')
res=func_name(*args, **kwargs)
return res
elif condition == '字典':
print('使用字典作为数据来源 比对用户数据')
res=func_name(*args, **kwargs)
return res
elif condition == '文件':
print('使用文件作为数据来源 比对用户数据')
res=func_name(*args, **kwargs)
return res
else:
print('去你妹的 我目前只有上面几种方式')
return inner
return login_auth
@outer('文件','jason')
def index():
print('from index')
index()
1.先执行outer()优先级最高 将里面的实参绑定给它的形参
2.然后看outer的返回值它的返回值是login_auth
3.调用login_auth此时语法糖会将紧挨着它下面的真正函数index当作调用login_auth时的实参传入login_auth的形参中
func_name与真正的函数名index临时绑定
4.接收它的返回值inner
5.调用inner继续执行它打子代码
6.获取用户输入的账号
7.获取用户输入的密码
8.获取outer形参临时绑定的数据跟已有的数据做判断成立则执行它的子代码不成立则按照顺序下一步
9.当判断到文件的位置 条件成立执行它的子代码
10.函数名加括号调用func_name此时绑定的是index等于调用index
11.执行index的子代码
12.打印from index 结束!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)