day23

闭包函数

定义

闭包函数把 闭包函数内部的变量+闭包函数内部的函数包在一起 然后通过返回值得形式返回出来

def f1():
    def f2():
        pritn('from f2')
        
    return f2
f2 = f1()
f2()

闭包函数嵌套

闭包函数也符合函数嵌套

def f1(url): # f1就叫做闭包函数
    def f2():
        print(url)
        pass
        
    return f2 # 函数对象
res = f1(1)
res()

装饰器

本质

一个 给函数增加功能的函数

注意

  1. 装饰器本身是函数,只不过用来装饰 被装饰的函数
  2. 不改变原函数的源代码
  3. 不改变原函数的调用方式

计时功能的装饰器

# v1
import time

def index():
    """被装饰的函数"""
    print('index')
    time.sleep(1)
# time_count 装饰器:对被装饰函数计时
def time_count(func): # func 才是真正的index
    """装饰器"""
    
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
        
    return wrapper

index = time_count(index) # index == wrapper
index() # wrapper()

带返回值

# v2:带返回值
import time

def index():
    """被装饰的函数"""
    print('x', x)
    print('index')
    time.sleep(1)
    
    return 'index'
# time_count 装饰器:对被装饰函数计时
def time_count(func): # func 才是真正的index
    """装饰器"""
    
    def wrapper():
        start = time.time()
        res = func() # index()
        end = time.time()
        print(end - start)
        
        return res
    
    return wrapper

index = time_count(index) # index == wrapper
res = index() # wrapper()
print(res)

加参数

# v3:加参数
import time


def index(x,y,z=10):
    """被装饰的函数"""
    print('x',x)
    print('index')
    time.sleep(1)

    return 'index'


# time_count装饰器:对被装饰函数计时
def time_count(func):  # func才是真正的index
    """装饰器"""

    def wrapper(*args,**kwargs):  # (10, 20)  # *args和**kwargs接收了所有的参数
        start = time.time()
        res = func(*args,**kwargs)  # index()  # *(10,20)  # *args和**kwargs打散参数传给真正的index
        end = time.time()
        print(end - start)

        return res

    return wrapper


index = time_count(index)  # index == wrapper
res = index(10,20,320)  # wrapper()
print(res)

登录装饰器

username_list = []


def login_deco(func):
    def wrapper(*args, **kwargs):

        if username_list:
            print('已经登录,请勿重复登录')
            res = func(*args, **kwargs)
            return res

        username_inp = input('请输入用户名:')
        pwd_inp = input('请输入密码:')

        with open('user_info.txt', 'r', encoding='utf8') as fr:
            for user_info in fr:
                username, pwd = user_info.strip().split(':')
                if username_inp == username and pwd_inp == pwd:
                    print('登录成功')
                    username_list.append(username)

                    res = func(*args, **kwargs)
                    return res

            else:
                print('登录失败')

    return wrapper


@login_deco  # index = login_deco(index)
def index(x, y):
    print('index')
    print('x,y', x, y)

    return 123


res = index(10, 20)

二层装饰器

  1. 用来装饰函数的,它本质是函数
  2. 不改变函数源代码
  3. 不改变函数调用方式

装饰器模板

如果装饰器真的不懂,记住模板

def deco(func):
    def wrapper(*args, **kwargs):
        # 要加什么功能就加上去
        res = func(*args, **kwargs)
        
        return res
    
    return wrapper

三层装饰器

username_list = []


def sanceng(role): # role 就是第三层 装饰器关键
    def login_deco(func):
        def wrapper(*args, **kwargs):

            if username_list:
                print('已经登录,请勿重复登录')
                res = func(*args, **kwargs)
                return res

            username_inp = input('请输入用户名:')
            pwd_inp = input('请输入密码:')

            with open(f'{role}_info.txt', 'r', encoding='utf8') as fr:
                for user_info in fr:
                    username, pwd = user_info.strip().split(':')
                    if username_inp == username and pwd_inp == pwd:
                        print('登录成功')
                        username_list.append(username)

                        res = func(*args, **kwargs)
                        return res

                else:
                    print('登录失败')

        return wrapper

    return login_deco


@sanceng('admin')
def index(x, y):
    print('index')
    print('x,y', x, y)

    return 123


res = index(10, 20)

迭代器引入

可迭代对象

含有__iter__方法的就叫做可迭代对象

迭代器

含有__iter____next__方法的就叫做迭代器

生成器

含有 ==yield== 关键字的函数就叫做生成器

转载于:https://www.cnblogs.com/Isayama/p/11574188.html

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值