• LearnPython_week4


    1、装饰器
    2、生成器
    3、迭代器
    4、内置方法
    5、可序列化
    6、项目规范化

    1、装饰器

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    ### 原代码
    def home():
        print("Welcome to home...")
    def shoe():
        print("Welcome to shoe...")
    def clothes():
        print("Welcome to clothes...")
    def gift():
        print("Welcome to gift...")
    home()
    shoe()
    clothes()
    gift()
    
    #################需求:为程序的购物专区增加认证功能#################
    ### Part1:添加认证函数login(),加入到需要认证模块的函数当中
    user = 'Wong'
    passwd = 'Wong123'
    def login():
        count = 0
        while count < 3:
            username = input('User login: ')
            password = input('Password: ')
            if username == user and password == passwd:
                print("Login successful...")
                break
            else:
                print("Invalid username or password...")
            count += 1
    
    def home():
        print("Welcome to home...")
    def shoe():
        login()
        print("Welcome to shoe...")
    def clothes():
        login()
        print("Welcome to clothes...")
    def gift():
        login()
        print("Welcome to gift...")
    home()
    shoe()
    clothes()
    gift()
    
    #################需求:为程序的购物专区增加认证功能#################
    ### Part2:添加认证函数login(func),在login()中调用需要添加认证功能的函数
    user = 'Wong'
    passwd = 'Wong123'
    def login(func):
        count = 0
        while count < 3:
            username = input('User login: ')
            password = input('Password: ')
            if username == user and password == passwd:
                print("Login successful...")
                func()
                break
            else:
                print("Invalid username or password...")
            count += 1
    
    def home():
        print("Welcome to home...")
    def shoe():
        print("Welcome to shoe...")
    def clothes():
        print("Welcome to clothes...")
    def gift():
        print("Welcome to gift...")
    home()
    # shoe()
    # clothes()
    # gift()
    login(shoe)
    login(clothes)
    login(gift)
    
    #################需求:为程序的购物专区增加认证功能#################
    ### Part3:添加认证函数login(func),函数赋值,再调用
    user = 'Wong'
    passwd = 'Wong123'
    def login(func):
        count = 0
        while count < 3:
            username = input('User login: ')
            password = input('Password: ')
            if username == user and password == passwd:
                print("Login successful...")
                func()
                break
            else:
                print("Invalid username or password...")
            count += 1
        return login    #高阶函数,返回login的内存地址
    
    def home():
        print("Welcome to home...")
    def shoe():
        print("Welcome to shoe...")
    def clothes():
        print("Welcome to clothes...")
    def gift():
        print("Welcome to gift...")
    home()
    # shoe()
    # clothes()
    # gift()
    # shoe = login(shoe)
    # clothes = login(clothes)
    # gift = login(gift)
    # shoe()
    # clothes()
    # gift()
    
    #################需求:为程序的购物专区增加认证功能#################
    ### Part4:添加认证函数login(func),嵌套函数+高阶函数,函数赋值,再调用
    user = 'Wong'
    passwd = 'Wong123'
    def login(func):
        def auth():
            count = 0
            while count < 3:
                username = input('User login: ')
                password = input('Password: ')
                if username == user and password == passwd:
                    print("Login successful...")
                    func()
                    break
                else:
                    print("Invalid username or password...")
                count += 1
        return auth    #高阶函数,返回login的内存地址
    
    def home():
        print("Welcome to home...")
    def shoe():
        print("Welcome to shoe...")
    def clothes(name):
        print("%s,Welcome to clothes..." %name)
    def gift():
        print("Welcome to gift...")
    home()
    shoe = login(shoe)
    clothes = login(clothes)
    gift = login(gift)
    shoe()
    clothes()
    gift()
    
    ### Part5:添加不固定参数,增加装饰器的可扩展性
    user = 'Wong'
    passwd = 'Wong123'
    def login(func,*args,**kwargs):
        def auth(*args,**kwargs):
            count = 0
            while count < 3:
                username = input('User login: ')
                password = input('Password: ')
                if username == user and password == passwd:
                    print("Login successful...")
                    func(*args,**kwargs)
                    break
                else:
                    print("Invalid username or password...")
                count += 1
        return auth    #高阶函数,返回login的内存地址
    
    def home():
        print("Welcome to home...")
    def shoe():
        print("Welcome to shoe...")
    def clothes(name,*args,**kwargs):
        print("%s,Welcome to clothes..." %name)
    def gift():
        print("Welcome to gift...")
    home()
    # shoe = login(shoe)
    clothes = login(clothes)
    # gift = login(gift)
    # shoe()
    clothes('Wong')
    # gift()
    
    ### Part6:函数赋值的方式看起来太low了,用装饰器专用调用方法
    user = 'Wong'
    passwd = 'Wong123'
    def login(func,*args,**kwargs):
        def auth(*args,**kwargs):
            count = 0
            while count < 3:
                username = input('User login: ')
                password = input('Password: ')
                if username == user and password == passwd:
                    print("Login successful...")
                    func(*args,**kwargs)
                    break
                else:
                    print("Invalid username or password...")
                count += 1
        return auth    #高阶函数,返回login的内存地址
    
    def home():
        print("Welcome to home...")
    @login      #相当于shoe = login(shoe)
    def shoe():
        print("Welcome to shoe...")
    @login      #相当于shoe = login(clothes)
    def clothes(name,*args,**kwargs):
        print("%s,Welcome to clothes..." %name)
    @login      #相当于shoe = login(gift)
    def gift():
        print("Welcome to gift...")
    home()
    # shoe()
    clothes('Wong')
    # gift()
    
    ### Part7:为函数添加不同平台qq/wechat/weibo等认证功能
    user = 'Wong'
    passwd = 'Wong123'
    def login(auth_type,*args,**kwargs):
        def auth(func,*args,**kwargs):
            def inner(*args,**kwargs):
                if auth_type == 'qq':
                    count = 0
                    while count < 3:
                        username = input('User login: ')
                        password = input('Password: ')
                        if username == user and password == passwd:
                            print("Login successful...")
                            func(*args,**kwargs)
                            break
                        else:
                            print("Invalid username or password...")
                        count += 1
                else:
                    print("Sorry,Only support qq login...")
            return inner    #高阶函数,返回login的内存地址
        return auth
    
    def home():
        print("Welcome to home...")
    @login('qq')      #相当于shoe = login(shoe)
    def shoe():
        print("Welcome to shoe...")
    @login('weibo')      #相当于shoe = login(clothes)
    def clothes(name,*args,**kwargs):
        print("%s,Welcome to clothes..." %name)
    @login('wechat')      #相当于shoe = login(gift)
    def gift():
        print("Welcome to gift...")
    home()
    shoe()
    clothes('Wong')
    gift()
    View Code

    2、生成器

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    
    '''
    生成器 generator
    生成器最直观的效果就是节省内存
        1.传统的列表等集合体是把所有元素存在内存里,当我们需要某个元素时,再从集合体里调用,此方式耗费内存,效率低下
        2.生成器可以理解为是把一套计算方法和一个内存地址绑定在一起,这个内存地址里面没有生成元素,当我们需要某个元素时,再通过内存地址里面的算法一个一个生成元素
    制造生成器:
        1.g = (x*2 for x in range(10))
        2.用yield在函数中定义,把整个函数制造成一个生成器
    特性:
        生成器只能向后生成元素
        生成器有两种调用方式
            1. __next__方法
                g.__next__()
            2. for循环调用
                for i in g:
                    print(i)
    '''
    
    ### 制造生成器和类型说明
    g = (x*2 for x in range(10))
    print(type(g))
    print(g)
    '''
    输出:
    <class 'generator'>
    <generator object <genexpr> at 0x0000000000A2A938>
    '''
    
    ### 生成器的调用特点
    print(g.__next__())
    print(next(g))
    print("走走神。。。")
    print(next(g))
    print(g.__next__())
    print("发发呆。。。")
    for i in g:
        print(i)
    
    ### 函数生成器,
    ## 生成器的send方法可以给yield赋值
    print('华丽分割线'.center(40,'*'))
    # def fib(max):       #普通函数
    #     n,a,b = 0,0,1
    #     while max > n:
    #         print(b)
    #         a,b = b,a+b
    #         n += 1
    #     return 'done'
    # print(type(fib))
    def fib(max):       #函数生成器
        n,a,b = 0,0,1
        while max > n:
            # print(b)
            yield b
            a,b = b,a+b
            n += 1
        return 'done'
    print(type(fib(5)))
    for i in fib(5):
        print(i)
    
    ### 单线程并行效果
    import time
    def foo(name):
        print("%s 要开始吃包子了" %name)
        while True:
            baozi = yield
            print("包子 %s 被 %s 吃了" %(baozi,name))
    
    def war():
        a1 = foo('A')
        a2 = foo('B')
        a1.__next__()
        a2.__next__()
        print("我要准备做包子啦...")
        for i in range(5):
            time.sleep(1)
            print("做了2个包子...")
            a1.send(i)
            a2.send(i)
    
    
    war()
    View Code

    3、迭代器

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    '''
    迭代器
    定义:迭代器与生成器类似,属数据流对象
        可以直接作用于for循环的对象统称为可迭代对象:Iterable,如list、dict、set、tuple、str等
        可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator,生成器是迭代器
    判断方法:
        from collections import Iterator    #导入Iterator模块
        from collections import Iterable    #导入Iterable模块
        print(isinstance(g,Iterable))    #判断g是否是一个可迭代对象
        print(isinstance(g,Iterator))    #判断g是否是一个迭代器
    生成迭代器:
        iter()方法可以把可迭代对象编程一个迭代器
        如:
            list = (1,2,3,4)
            list = iter(list)
    '''
    
    ### 判断是否为迭代器或可迭代对象的方法
    from collections import Iterator
    from collections import Iterable
    str = '111'
    print(isinstance(str,Iterable))    #True
    print(isinstance(str,Iterator))    #False
    list = [1,2,3]
    print(isinstance(list,Iterable))    #True
    print(isinstance(list,Iterator))    #False
    g = (i*2 for i in range(5))
    print(isinstance(g,Iterable))    #True
    print(isinstance(g,Iterator))    #True
    
    
    ### 可迭代对象可通过iter()方法变成一个迭代器
    tup = (1,2,3,4,5,4)
    print(type(tup))        #tuple
    tup = iter(tup)
    print(type(tup))        #tuple_iterator
    View Code

    4、内置方法

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    def dir_object():
        ## 删除对象的属性方法
        ## delattr(object, name: str)
        delattr('Wong', 'count')
    
        ## 判断对象是否有这个属性方法
        ## hasattr(object, name: str)
        print(hasattr('Wong', 'count1'))
    
        ## 获取对象的属性方法,如存在可直接调用执行,如不存在则可配置default返回相关信息
        ## getattr(object, name: str, default)
        print(getattr('Wong,ggg', 'count', '不存在'))
    
        ## 为对象添加属性方法
        ## setattr(object, name: str, value)
        def Wong(name):  # 定义函数对象
            print("Welcome to", name)
            print("I am 23 years old")
            return 'done'
        setattr(Wong, 'author', 'Wongdu')  # 增加'author'属性
        print(hasattr(Wong, 'author'))  # 验证
    
    # 绝对值,
    # abs(n),Return the absolute value of the argument.
    print( abs(-22) )
    
    # 判断可迭代对象内元素是否全为真
    # all(Iterable)
    '''Return True if bool(x) is True for all values x in the iterable.
    If the iterable is empty, return True.'''
    print( all([1,2,3,0]) )
    
    # 判断可迭代对象内元素是否有真
    # any(Iterable)
    '''Return True if bool(x) is True for any x in the iterable.
    If the iterable is empty, return False.'''
    print( any([1,'0','']) )
    
    # 把对象变成可打印的字符串形式,如存在中文字符,则用二进制表示;repr则所见即所得
    # ascii(object);repr(object)
    print(ascii({'name':'wong','age':23,'您好':''}))
    print([repr([1,2,3,'22','您好'])])
    
    # 把int对象转换成二进制
    # bin(number:int)
    '''Return the binary representation of an integer.'''
    print( bin(256) )
    
    # 判断对象是否可调用,如函数是可调用的
    # callable(object)
    def calla():print("It is callable...")
    print( callable(calla) )
    
    # 使用序号i返回一个字符的Unicode字符串
    # chr(i)
    print(chr(1111))
    
    # 打印给定对象的所有方法
    # dir(object)
    print( dir([1,2,3]) )
    
    # 返回一个元组,关系:((x-x%y)/y, x%y)
    # divmod(number,numbre)
    print( divmod(22.22,23) )
    
    #退出程序
    import time
    time.sleep(1)
    exit("退出程序")
    
    # 为集合体元素进行编号一一对应
    dict = {'name':'Wong','age':23,'sox':'man'}
    print(dict)
    for k,v in enumerate(dict):
        print(k,v,dict[v])
    
    # 在全局和本地语境中评估给定的源。
    #eval()
    
    # 在全局和本地语境中执行给定的源。
    #exec()
    
    # 格式化输出
    print("My name is {_name}".format(_name="Wong"))
    
    # 过滤可迭代对象中的元素生成一个迭代器
    s = filter(lambda x:x==1,range(10))  #
    print(s)
    for s1 in s:
        print(s1)
    
    # 对可迭代对象中的元素进行计算生成一个迭代器
    g = map(lambda x:x*5,range(10))
    print(g)
    for g1 in g:
        print(g1)
    
    
    # 返回包含当前作用域全局变量的字典
    print(globals())
    # 返回包含当前作用域局部变量的字典
    print(locals())
    # 没有参数时,返回当前作用域局部变量的字典,相当于locals()
    print(vars())
    
    # 返回一个对象的哈希值
    # hash(object)
    list = []
    for i in ['1','666','2','3','45',33]:
        print(hash(i))
        list.append(hash(i))
    list.sort()
    print(list)
    
    # 查看帮助
    # help(object)
    help(dict)
    
    # 返回int对象的16进制
    # hex(int)
    print(hex(111))
    
    # 判断对象是否属于哪个类型
    # isinstance(object,union)
    print(isinstance('11',int))
    from collections import Iterator,Iterable
    print(isinstance('asdfg',Iterable))
    print(isinstance('asdfg',Iterator))
    
    # 用户输入
    # input()
    name = input("您的名字是:")
    print(name)
    
    # 返回对象的内存地址
    # id(object)
    print(id('name'))
    
    # 把可迭代对象变成迭代器
    # iter(iterable)
    list = [1,2,34,5]
    list = iter(list)
    print(list)
    
    # 计算集合体的长度
    # len(list)等,可迭代对象?
    print(len({'name':"wong",'age':23}))
    
    # 版本作者等信息
    copyright()
    credits()
    license()
    
    # 取可迭代对象中的最大值
    # max(Iterable)
    print(max({'name':'wong','age':23}))
    
    # 取可迭代对象中的最小值
    # min(Iterable)
    print(min({'name':'wong','age':23}))
    
    # 打开文件
    # open(file,mode,encoding)
    f = open('test','r')
    f.close()
    
    # 返回int对象的八进制表示
    # oct(int)
    print(oct(64))
    
    # 通过单个字符,返回ascii表的对应编号
    # ord(str)
    print(ord('@')
    
    # 打印内容
    # print("你想表达的内容")
    print("打印")
    
    # 按如下公式计算
    # Equivalent to x**y (with two arguments) or x**y % z (with three arguments)
    # pow(int, int, *int)
    print(pow(2,8,127))
    
    # 退出程序,指定退出程序code
    # quit(code)
    count = 0
    while True:
        print("你是风儿我是沙,缠缠绵绵走天涯...")
        if count >1000:
            quit(4)
        count += 1
    
    # 反转集合体内元素并生成一个迭代器
    # reversed(sequence)
    rev_iter = reversed([1,2,33,4])
    print(rev_iter)
    for _i in rev_iter:
        print(_i)
    
    # 设置数字的精确位,会四舍五入算法
    # round(number, ndigits=None)
    print(round(23.266655555,5))
    
    # 排序可迭代对象内的元素
    # sorted(Iterable)
    print(sorted([1,2,44,5,66,7]))
    
    # 求和
    # sum(int)
    print(sum([1,2,3,44,5]))
    
    # 将多个可迭代对象的元素一一对应形成一个元组,生成一个迭代器,长度以最小元素的可迭代对象为准
    # zip(Iterable1,Iterable2,Iterable3...)
    print(zip([1,2,3,55,6]))
    for iz in zip([1,2,3,55,6],{'name':'wong','age':23}):
        print(iz)
    View Code

    5、可序列化

    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    '''
    序列化
    序列化可将非字符串的数据类型的数据进行存档,如字典、列表甚至是函数等等
    反序列化,将通过序列化保存的文件反序列化即可得到数据原本的样子,可直接使用
    python中序列化的方式:
        json:只可序列化简单的数据类型,如字典、列表等,其他语言也有json,即json可跨语言进行序列和反序列化
        pickle:python独有的序列化,可序列化一切数据,以二进制的形式保存
        python中json和pickle的用法基本上是一模一样的
    '''
    
    dict = {'name':'wong','age':'23'}
    
    # with open('test','w') as f:
    #     f.write(dict)
    ### 报错:TypeError: write() argument must be str, not dict
    
    
    '''
    ### 把字典用json序列化后写入文件
    ### json.dumps(obj); json.dump(obj, fp)
    ### f.write(json.dumps(dict)) == json.dump(dict,f)
    '''
    import json
    with open('test','w') as f:
        # f.write(json.dumps(dict))
        json.dump(dict,f)
    ### 成功写入
    
    '''pickle序列化'''
    import pickle
    def foo():
        print("In the foo...")
    foo()
    with open('test2','wb') as f:       #以二进制字节类型写入到文件当中,所以mode = 'wb'
        # f.write(pickle.dumps(foo))
        pickle.dump(foo,f)
    ### 写入成功!注意,这里的写入是把foo函数对象写入到文件当中,反序列化后,当代码里没有foo函数对象,则会报错
    
    
    list = [1,2,3,4,'name']
    with open('test3','wb') as f:
        # f.write(pickle.dumps(list))
        pickle.dump(list,f)
    序列化
    # -*- coding:utf-8 -*-
    # Author:Wong Du
    
    '''
    序列化
    序列化可将非字符串的数据类型的数据进行存档,如字典、列表甚至是函数等等
    反序列化,将通过序列化保存的文件反序列化即可得到数据原本的样子,可直接使用
    python中序列化的方式:
        json:只可序列化简单的数据类型,如字典、列表等,其他语言也有json,即json可跨语言进行序列和反序列化
        pickle:python独有的序列化,可序列化一切数据,以二进制的形式保存
    '''
    
    # with open('test','r') as f:
    #     print(f.read())
    #     f.read()['name']
    ### 报错:TypeError: string indices must be integers
    
    '''
    ### json反序列化读取文件内容,可直接获取到字典,进行元素调用
    ### json.loads(str); line = json.load(fp)
    ### line = json.loads(f.read()) == line = json.load(f)
    '''
    import json
    with open('test','r') as f:
        # line = json.loads(f.read())
        line = json.load(f)
        print(type(line))
        print(line['age'])
    ### 成功调用
    '''
    输出:
    <class 'dict'>
    23
    '''
    
    
    import pickle
    def foo():
        print("In the foo2...")
    with open('test2','rb') as f:       #以二进制字节类型读取文件内容,所以mode = 'rb'
        # line = pickle.loads(f.read())
        line = pickle.load(f)
        line()
    
    
    with open('test3','rb') as f:
        # line = pickle.loads(f.read())
        line = pickle.load(f)
        print(type(line))
        print(line[4])
    反序列化

    6、项目规范化

     1 App/
     2     bin/
     3         app
     4     conf
     5         conf.py
     6     app
     7         test
     8             __init__.py
     9             main.py
    10         main.py
    11         __init__.py
    12     setup.py
    13     requirement.txt
    14     readme/README
    静静的学习一阵子儿...
  • 相关阅读:
    Unity 随机数与随机种子
    Unity 基于Cinemachine计算透视摄像机在地图中的移动范围
    Unity 利用Cinemachine快速创建灵活的相机系统
    Unity NavMesh 动态烘焙绘制与随机取点
    Unity LineRenderer 射线检测 激光攻击
    Unity ugui屏幕适配与世界坐标到ugui屏幕坐标的转换
    实验:用Unity抓取指定url网页中的所有图片并下载保存
    关于Unity中AI随机巡逻障碍物预判与快速运动时物理穿透的思考
    唬人的Java泛型并不难
    你知道Java中的CopyOnWriteArrayList吗?
  • 原文地址:https://www.cnblogs.com/Caiyundo/p/8527033.html
Copyright © 2020-2023  润新知