多层语法糖,有参装饰器,递归函数,算法之二分法

今日内容

多层语法糖

  • 理解

    多层语法糖的意思就是,有多层语法糖@函数名,一个函数就有多个功能。
    
  • 举例说明

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值