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

原文地址:https://www.cnblogs.com/rootid/p/9388396.html