zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LeetCode Flatten Binary Tree to Linked List
    LeetCode Longest Common Prefix
    LeetCode Trapping Rain Water
    LeetCode Add Binary
    LeetCode Subsets
    LeetCode Palindrome Number
    LeetCode Count and Say
    LeetCode Valid Parentheses
    LeetCode Length of Last Word
    LeetCode Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/rootid/p/9388396.html
Copyright © 2011-2022 走看看