今日内容
多层语法糖
-
理解
多层语法糖的意思就是,有多层语法糖@函数名,一个函数就有多个功能。
-
举例说明
def outter1(func1):
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2):
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
@outter1
@outter2 # 双层语法糖
def index():
print('from index')
index()
执行结果:
加载了outter2
加载了outter1
执行了wrapper1
执行了wrapper2
from index
代码执行顺序
有参装饰器
有参装饰器目的仅仅是给装饰器传递额外的参数
装饰器最多就三层嵌套,但是基本上都一层就够了
满足多个数据值的传输切换
举例说明
eg:
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('使用列表作为数据来源 比对用户数据')
elif condition == '字典':
print('使用字典作为数据来源 比对用户数据')
elif condition == '文件':
print('使用文件作为数据来源 比对用户数据')
else:
print('去你妹的 我目前只有上面几种方式')
return inner
return login_auth
@outer('文件','jason')
def index():
print('from index')
index()
递归函数
-
概念
函数直接或者间接调用了自己
递归函数的特征
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
- 直接或间接的调用自身的函数,递归效率不高;
- 直接调用
eg:
def index():
print('from index')
index()
index()
这个看似不会报错,但是还是会有报错,因为当达到一个python中允许函数最大递归调用的次数时,就会报错停止。官方记录时1000次,但是也会有偏差。
- 间接调用
eg:
def index():
print('from index')
func()
def func():
print('from func')
index()
func()
两个函数之间相互调用,达到最大次数时,也会报错停止
算法之二分法
什么是算法?
算法其实就是解决问题的有效方法
了解
算法永远都在精进 但是很少有最完美的算法
算法很多时候可能没什么用
二分法原理
二分法主要是一种数据处理算法,主要的过程就是,拿到数据后将数据按照某种顺序分成两部分,再>判断某个数据在那部分,然后将另一个不包含该数据的部分丢掉,将剩下的部分继续按照之前方式处>理,直到找到该数据。
注意:二分法是要有顺序的(升序,降序)
举例说明
eg:
data = [1, 12, 33, 56, 76, 89, 110, 230, 440, 666, 987, 1232, 1389]
def count(data, sum):
# 要有一个结束条件,结束当列表没有值的时候,结束
if len(data) == 0:
print('没有找到')
return
# 对半取中间位
new_sum = len(data) // 2
# 找到中间位对应的值
old_sum = data[new_sum]
if old_sum < sum:
# 切片取值,根据上面的条件,看取哪边
new_data = data[new_sum + 1:]
print(new_data)
# 递归调用
count(new_data, sum)
elif old_sum > sum:
# # 切片取值,根据上面的条件,看取哪边
new_data_right = data[:new_sum]
print(new_data_right)
# 递归调用
count(new_data_right, sum)
else:
print('找到啦,%s' % sum)
count(data, 230)
今日作业
1.尝试编写有参函数将多种用户验证方式整合到其中
直接获取用户数据比对
数据来源于列表
数据来源于文件
代码:
def login(condition, l1, f3):
def outer(func_name):
def inner(*args, **kwargs):
username = input('please input yours username>>>:')
password = input('please input yours pwd>>>:')
if condition == '直接对比':
if username == 'lzq' and password == 123:
res = func_name(*args, **kwargs)
return res
else:
print('不好意思,认证失败')
if condition == '列表':
# 格式化判断
if {'name': username, 'pwd': password} in l1:
res = func_name(*args, **kwargs)
return res
else:
print('不好意思,认证失败')
if condition == '文件':
# 拼接后赋值
sum = '|'.join((username, password))
# 判断
if sum in f3:
res = func_name(*args, **kwargs)
return res
else:
print('不好意思,认证失败')
return inner
return outer
# 选择你要的方式
choice = input('请输入你想选择数据的方式:')
data = [
{'name': 'lzq', 'pwd': '123'},
{'name': 'gsy', 'pwd': '520'}
]
# 命令是文件的话,执行添加,传值
if choice == '文件':
name = input('你输入你的注册名:')
pwd = input('请输入你的密码:')
with open(r'a.txt', 'a', encoding='utf8') as f1:
f1.write(f'{name}|{pwd}\n')
with open(r'a.txt', 'r', encoding='utf8') as f2:
f1 = f2.read()
# 语法糖,有参装饰器
@login(f'{choice}', data, f1)
def index():
print('验证成功!')
i = input('是否想清理文件库(y/n):')
if i == 'y':
p = open(r'a.txt', 'r+', encoding='utf8')
p.truncate()
print('已经处理,拜拜!')
return
else:
print('拜拜了你嘞!')
return
index()
2.尝试编写递归函数
推导指定某个人的正确年龄
eg: A B C D E 已知E是18 求A是多少
代码:
# 将A,B,C,D,E看作是五个人,A=1,B=2,C=3 D=4, E=5
def guess(n):
if n == 5: # 结束条件
return 18
else:
# 其实这里就是利用递归用来加2,递归几次就加了几个2
A = guess(n + 1) + 2
return A
print(guess(1))