• W4_python_decorator_generator_Iteratable_Iterator_json_pickle


    W4_python_decorator_generator_Iteratable_Iterator

    50.第03章节-Python3.5-装饰器详解

    1.装修器定义:装饰器本质是函数,(装饰其它函数)就是为其它函数添加附件功能
    2.原则:a)不能修改被装饰函数的源代码
    b)不能修改被装饰函数的调用方式

    51.第04章节-Python3.5-装饰器应用详解

    52.第05章节-Python3.5-装饰器之函数即变量

    53.第06章节-Python3.5-装饰器之高阶函数

    高阶函数:
    a)把一个函数名当作实参传给另一个函数(可以实现装修器中的:不能修改被装饰函数的源代码的情况下为函数增加功能)

    def bar():
        print("in the bar")
    
    def test(func):
        print(func)
        func()
    
    test(bar)
    
    

    b)返回值中包含函数名(可以实现装修器中的:不修改函数的调用方式)

    import time
    def bar():
        time.sleep(3)
        print("in the bar")
    
    def test(func):
        print(func)
        return func
    
    # print(test(bar))
    bar = test(bar)
    bar()  #run bar
    

    返回顶部

    54.第07章节-Python3.5-装饰器之嵌套函数

    高阶函数 + 嵌套函数 => 装修器

    x = 0
    def gradpa():
        x = 1
        def dad():
            x = 2
            def son():
                x = 3
                print(x)
            son()
        dad()
    gradpa()
    
    

    返回顶部

    55.第08章节-Python3.5-装饰器之案例剖析1

    装饰器一:

    import time
    def timer(func):
        def deco():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("the func run time is :{runtime}".format(runtime = (stop_time - start_time)))
        return deco
    
    @timer
    def test1():
        time.sleep(2)
        print("in the test1")
    
    test1()
    

    返回顶部

    56.第09章节-Python3.5-装饰器之案例剖析2

    装饰器二:解决参数传递问题

    import time
    def timer(func):
        def deco(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)
            stop_time = time.time()
            print("the func run time is :{runtime}".format(runtime = (stop_time - start_time)))
        return deco
    
    @timer
    def test1():
        time.sleep(2)
        print("in the test1")
    
    @timer
    def test2(name,age):
        time.sleep(2)
        print("in the test2:",name,age)
    
    test1()
    test2("alex",age = 32)
    

    返回顶部

    57.第10章节-Python3.5-装饰器之终极讲解

    user = "wu"
    passwd = "pass"
    
    def auth(func):
        def wrapper(*args,**kwargs):
            username = input("please input username:")
            password = input("please input password:")
            if user == username and passwd == password:
                print("33[32;1mUser has passed authentication33[0m")
                res = func(*args,**kwargs)
                print("---after authentication---")
                return res
            else:
                print("33[31;1mInvalid username or password33[0m")
        return wrapper
    
    def index():
        print("welcome index page")
    
    @auth
    def home():
        print("welcome home page")
    
    
    def bbs():
        print("welcome bbs page")
    
    home()
    

    ps:
    1.理解参数传递过程
    2.当层级较多时,可断点调试

    #!/usr/bin/env python
    # -*-coding:utf-8-*-
    # author: Mr.Wu
    user = "wu"
    passwd = "pass"
    
    
    def auth(auth_type):
        def outer_wrapper(func):
            def wrapper(*args, **kwargs):
    
                if auth_type == "local":
                    username = input("please input username:")
                    password = input("please input password:")
                    if user == username and passwd == password:
                        print("33[32;1mUser has passed authentication33[0m")
                        res = func(*args, **kwargs)
                        print("---after authentication---")
                        return res
                    else:
                        print("33[31;1mInvalid username or password33[0m")
                elif auth_type == "ldap":
                    print("ldap authenticatoin")
                    res = func(*args, **kwargs)
                    print("---after authentication---")
                    return res
    
            return wrapper
    
        return outer_wrapper
    
    
    def index():
        print("welcome index page")
    
    
    @auth(auth_type="local")
    def home():
        print("welcome home page")
        return "from home"
    
    
    @auth(auth_type="ldap")
    def bbs():
        print("welcome bbs page")
    
    
    home()
    print(home())
    bbs()
    
    

    返回顶部

    58.第11章节-Python3.5-迭代器与生成器1

    生成器:只有在调用时才会生成相应的数据
    生成器的优点:可以节省内存资源
    比较列表与生成器:

    a = [ i*2 for i in range(10000000) ]
    b = ( i*2 for i in range(10000000) )
    

    for n in b:
    print(n)
    b.next() #只有一个next方法,在python2中,为b.next()

    #斐波拉契
    # def fib(max):
    #     a,b,n = 0,1,0
    #     while n < max:
    #         a,b = b,a + b
    #         print(a)
    #         n = n + 1
    #     return "done"
    #
    # fib(10)
    
    #转为生成器
    def fib(max):
        a,b,n = 0,1,0
        while n < max:
            a,b = b,a + b
            yield a
            n = n + 1
        return "done"
    
    f = fib(10)
    print(f.__next__())
    print("testxxx")
    print(f.__next__())
    print(f.__next__())
    print("testxxx")
    print(f.__next__())
    

    返回顶部

    59.第12章节-Python3.5-迭代器与生成器2

    生成器案例:

    import time
    
    
    def consumer(name):
        print("{name}准备吃包子了".format(name = name))
        while True:
            baozi = yield
            print("包子{baozi}分给{name}吃了".format(baozi=baozi,name=name))
    # c1 = consumer("user1")
    # c1.__next__()
    # c1.send("1")
    # c1.send("2")
    
    
    def producer(name):
        c1 = consumer("c1")
        c2 = consumer("c2")
        c1.__next__()
        c2.__next__()
        print("开始做包子了")
        baozi_no = 1
        for i in range(10):
            time.sleep(1)
            print("{name}做了2个包子".format(name=name))
            c1.send(baozi_no)
            c2.send(baozi_no+1)
            baozi_no = baozi_no + 2
    
    
    producer("alex")
    

    返回顶部

    60.第13章节-Python3.5-迭代器与生成器并行

    Iterable isinstance

    可以直接作用于for循环的对象统称为可迭代对象:Iterable

    from collections import Iterable
    
    print(isinstance([],Iterable))
    print(isinstance("",Iterable))
    print(isinstance({},Iterable))
    print(isinstance((),Iterable))
    print(isinstance(100,Iterable))
    

    Iterator

    可以被next()函数调用并且不断返回下一个值的对象称为迭代器:Iterator
    查看对像的方法:dir(对象)
    使用

    from collections import Iterator
    
    print(isinstance((x for x in range(5)), Iterator))
    

    iter()方法

    iter()方法可以把可迭代对象转变为一个迭代器对象
    a = iter(['a','b','c'])
    print(a.next())
    print(a.next())

    返回顶部

    61.第14章节-Python3.5-内置方法详解1-2

    dir()
    exec() #执行一段代码
    eval() #将字典形式的字符串处理成字典类型
    map()
    globals() #获取当前文件中所有全局变量,注:不包括函数中的局部变量
    hash()
    bin()
    oct()
    hex()
    sorted()
    把字典按key排序打印

    a = {6:2,8:0,1:4,-5:6,99:11,4:32}
    print(a.items())
    print(sorted(a.items()))
    print(sorted(a.items(),key=lambda x:x[1]))
    

    zip()

    a = ['a','b','c','d']
    b = [1,2,3,4,5]
    
    for i in zip(a,b):
        print(i)
    

    locals()

    返回顶部

    63.第16章节-Python3.5-Json与pickle数据序列化

    json dumps/dump

    import json
    
    data = {
        "key1":"value",
        "key2":[1,2,3]
    }
    
    with open("json_1.txt","w") as f:
        f.write(json.dumps(data))
    
    #等价于
    
    import json
    
    data = {
        "key1":"value",
        "key2":[1,2,3]
    }
    
    with open("json_1.txt","w") as f:
        json.dump(data,f)
    

    json loads/load

    import json
    
    with open("json_1.txt", "r") as f:
         data = json.loads(f.read())
    print(data)
    # 等价于
    import json
    
    with open("json_1.txt", "r") as f:
        data = json.load(f)
    
    print(data)
    
    

    json编码问题

    import json
    dic = (1:'中国',2:'b')
    f = open('test_json.txt','w',encoding='utf-8')
    json.dump(dic, f, ensure_ascii=False)
    #json.dump(dic, f)
    
    #感受下如何不加ensure_ascii=False后,文件内容的区别
    f.close()
    f = open('test_json.txt',encoding='utf-8')
    res = json.load(f)
    f.close()
    print(type(res), res)
    
    
    

    pickle dumps/dump

    
    import pickle
    
    def func_test(name):
        print(name)
    
    data = {
        "pickle":"dump",
        "func":func_test
    }
    
    # with open("pickle_1.txt","wb")as f:
    #     f.write(pickle.dumps(data))
    #等价于
    
    with open("pickle_1.txt","wb")as f:
        pickle.dump(data,f)
    

    pickle loads/load

    import pickle
    
    
    def func_test(name):
        print("hello",name)
    
    # with open("pickle_1.txt","rb")as f:
    #     print(pickle.loads(f.read())["func"]("test_name"))
    
    #等价于
    
    with open("pickle_1.txt","rb")as f:
        print(pickle.load(f)["func"]("test_name"))
    

    返回顶部

    64.第17章节-Python3.5-软件目录结构规范

    注意:项目首字母大写

    Atm/
    ├── bin
    │   ├── atm.py
    │   └── __init__.py
    ├── conf
    │   └── __init__.py
    ├── core
    │   ├── __init__.py
    │   └── main.py
    ├── docs
    │   ├── abc.rst
    │   └── conf.py
    ├── logs
    │   └── __init__.py
    ├── README
    ├── requirements.txt
    └── setup.py
    
    

    目录间程序调用
    假如从bin下的atm调用core下的main
    main.py

    print("welcome to atm")
    

    atm.py

    import os, sys
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    print(BASE_DIR)
    sys.path.append(BASE_DIR)
    
    from core import main
    
    main
    

    返回顶部

    65.第18章节-w4-practices

    模拟实现一个ATM + 购物商城程序

    额度 15000或自定义
    实现购物商城,买东西加入 购物车,调用信用卡接口结账
    可以提现,手续费5%
    每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
    支持多账户登录
    支持账户间转账
    记录每月日常消费流水
    提供还款接口
    ATM记录操作日志
    提供管理接口,包括添加账户、用户额度,冻结账户等。。。
    用户认证用装饰器
    示例代码 https://github.com/triaquae/py3_training/tree/master/atm

    获取文件所在路径,添加到sys.path

    from os import getcwd,path
    from sys import path as sys_path
    sys_path.insert(0,path.dirname(getcwd()))
    
    

    python_控制台输出带颜色的文字方法:
    https://www.cnblogs.com/Eva-J/p/8330517.html

  • 相关阅读:
    virtualbox+vagrant学习-2(command cli)-19-vagrant box命令
    virtualbox+vagrant学习-2(command cli)-24-Aliases别名
    virtualbox+vagrant学习-2(command cli)-23-vagrant version命令
    virtualbox+vagrant学习-2(command cli)-22-vagrant validate命令
    如何快速学习一门技术或进入一个岗位
    EL表达式详解
    关于JSP乱码问题
    java mail使用qq邮箱发邮件的配置方法
    数据库命名规范
    java中的Serializable接口的作用
  • 原文地址:https://www.cnblogs.com/rootid/p/9388396.html
Copyright © 2020-2023  润新知