day13

1.今日内容

今日内容:
    0、有参装饰器
    1、迭代器
    2、生成器
    3、面向过程编程
    4、表达式
        三表达式
        列表生成式
        生成器表达式

2.有参装饰器

import time
current_user={
    'username':None,
    # 'login_time':None
}

# 装饰器最多套三层
def auth(engine):
    # engine='file'
    def auth2(func):
        # func=index
        def wrapper(*args,**kwargs):
            if engine == 'file':
                if current_user['username']:
                    print('已经登陆过了')
                    res=func(*args,**kwargs)
                    return res

                uname=input('用户名>>: ').strip()
                pwd=input('密码>>: ').strip()
                if uname == 'egon' and pwd == '123':
                    print('登陆成功')
                    current_user['username']=uname
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('用户名或密码错误')
            elif engine == 'mysql':
                print('基于MyQL的认证')
            elif engine == 'ldap':
                print('基于LDAP的认证')
        return wrapper
    return auth2

@auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
def index():
    time.sleep(1)
    print('welcome to index page')
    return 122


index() # wrapper()

3.装饰器修复技术

from functools import wraps


def outer(func_name):
    @wraps(func_name)  # 添加这个功能,就能暴露被装饰对象的注释
    def inner(*args, **kwargs):
        """我是inner 我擅长让人蒙蔽"""
        res = func_name(*args, **kwargs)
        return res

    return inner


@outer
def func():
    """我是真正的func 我很强大 我很牛 我很聪明"""
    pass


help(func)
# print(func)
func()

4.总结装饰器模版

无参装饰器

# 总结:有参装饰器模板
# 1、无参装饰器
def outter(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res

    return wrapper


@outter
def index():
    pass

有参装饰器

# 总结:有参装饰器模板
# 1、无参装饰器
# 2、有参装饰器
def outter2(xxx):
    def outter(func):
        def wrapper(*args, **kwargs):
            print(xxx)
            res = func(*args, **kwargs)
            return res

        return wrapper

    return outter


@outter2(xxx=111)
def index():
    pass


index()

5.可迭代对象与迭代器对象

可迭代对象

1.可迭代对象
	对象内置有__iter__方法的都称为可迭代对象
	"""
	1.内置方法  通过点的方式能够调用的方法
	2.__iter__  双下iter方法
	"""
2.可迭代对象的范围
	不是可迭代对象
    	int float bool 函数对象
	是可迭代对象
    	str list dict tuple set 文件对象
3.可迭代的含义
	"""
	迭代:更新换代(每次更新都必须依赖上一次的结果)
		eg:手机app更新
	"""
	可迭代在python中可以理解为是否支持for循环

迭代器对象

1.迭代器对象
	是由可迭代对象调用__iter__方法产生的
	迭代器对象判断的本质是看是否内置有__iter__和__next__
    
2.迭代器对象的作用
	提供了一种不依赖于索引取值的方式
 	正因为有迭代器的存在 我们的字典 集合才能够被for循环
    
3.迭代器对象实操
	 """
	 s1 = 'hello'  # 可迭代对象
     res = s1.__iter__()  # 迭代器对象
     print(res.__next__())  # 迭代取值 for循环的本质
     print(res.__next__())
	 一旦__next__取不到值 会直接报错
	 """
    
4.注意事项
	可迭代对象调用__iter__会成为迭代器对象 迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身

实例.py

d = {'name': 'jason', 'age': 123}
res = d.__iter__()  # res是迭代器对象
print(res)
print(res.__next__())
print(res.__next__())

6.for循环的本质

for 变量名 in 可迭代对象:
    循环体代码
"""
1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
"""
posted @ 2023-12-18 17:55  王苗鲁  阅读(3)  评论(0编辑  收藏  举报