1.装饰器:相当于对一个函数进行功能的添加,装饰器是由高阶函数和嵌套函数的结合
使用装饰器装饰函数时,不能修改原函数的调用方式。比如登录认证时会用到装饰器
装饰器能够带参数,一下是一个高级装饰器列子
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
# 装饰器高级版
import time
user="yang"
pwd="123"
def auth(auth_type):
print("auth func:",auth_type)
def outer_wrapper(func):
def wrapper(*args, **kwargs):
print("auth func wrapper:",*args, **kwargs)
if auth_type =="local":
username = input("username:").strip()
password = input("pwd:").strip()
if user == username and pwd == password:
print("\033[32;1m user has passed authentication\033[0m")
res = func(*args, **kwargs) # from home
print('---')
return res
else:
exit("\033[32;1m error\033[0m")
elif auth_type=="ldap":
print("ladap")
return wrapper
return outer_wrapper
def index():
print("welcome to index page")
@auth(auth_type="local") # 本地认证 这句话相当于
def home(): # 需要登录
print("welcome to home page")
return "from home"
@auth(auth_type="ldap") # 远程认证
def bbs(): # 需要登录
print("welcome to bbs page")
index()
print(home()) # 调用的wrapper
bbs()
2.生成器
只要带有yield关键字的就是生成器,且已经不是函数了
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
def fib(max): # 只要有yield存在 就是生成器 且不是函数了
n,a,b=0,0,1
while n <max:
# print(b)
yield b # 保存函数的中断状态
a,b=b,a+b
# a,b=b,a+b相当于 t=(b,a+b) t是一个元组
# a=t[0]
# b=t[1]
n=n+1
return 'done'
f=fib(10)
# #print('---------ddddd')
# print(f.__next__())
# print("----")
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
print('start loop')
# #for i in f:
# print(i)
3.协程的使用。(单线程并行)
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
import time
# 生产者消费者模型 单线程并行(协程)
def consumer(name):# 消费者
print("%s 准备吃包子了"%name)
while True:
baozi=yield
print("包子[%s]来了,被[%s]吃了"%(baozi,name))
c=consumer("yhr")
c.__next__()
# b1="韭菜馅"
# c.send(b1) # 调用yield 传值 (唤醒传值)
# c.__next__() # 调用yield 不传值 (只唤醒)
def producer(name): #生产者
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始做包子了")
for i in range(10):
time.sleep(1)
print("做了一个包子,分两半")
c.send(i)
c2.send(i)
producer("yang")
4.迭代器
–可迭代对象iterable,凡是可作用于for 循环的都是iterable对象,list,dict,tuple,str是可迭代对象
–迭代器iterator,凡是可作用于next()函数的对象都是iterator对象,表示一个惰性计算的序列,
使用b=iter(a)讲a转为iterator对象
注:在python 2.x版本中,range(10)得到的结果是列表,是一个iterable对象。在python 3.x版本中 range(10)得到的是一个iterator对象
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
from collections import Iterable
a=[1,2,3]
print(dir(a))
print(isinstance(a,Iterable))
# 生成器都是iterator对象,list,dict,tuple,str 是Iterbale,却不是iterator
# 凡是可作用与for循环的对象都是iterable对象
# 凡是可作用与next()函数的兑现个都是iterator对象,表示一个惰性计算的序列
# b=iter(a) 将a转为iterator对象
5.序列化与反序列化
可在不同的语言环境,操作系统环境上进行数据的传输。使用Pickle作为序列化格式的时候,可以将对象传入,但是只能在python语言中执行,且pickle实际上传输的是函数的内存地址
(json 与pickle)
序列化:
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
import json
import pickle
def sayhi():
name='yhr'
print("hello",name)
info ={
'name':'yang',
'age':22
}
f = open("test.txt","w") # 写json 传简单数据
f.write(json.dumps(info))
# f=open('test2.txt','wb') # 写pickle 能序列化函数对象 传输内存地址
# f.write(pickle.dumps(info)) # f.write(pickle.dump(info,f)
f.close()
反序列化
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
# 读json
import json
f=open('test.txt','r')
data=json.loads(f.read())
print(data['age'])
f.close()
# print(eval(data)['age'])
# # 读pickle
# import pickle
#
# def sayhi():
# name='yhr'
# print("hello",name)
# print("hello2")
# f=open('test2.txt','rb')
# data=pickle.loads(f.read())
# print(data)
# print(data['func']())
f.close
6.python 3.x内置函数及用法概览
#!/usr/bin/env python
# coding:utf-8
# Author:Yang
# 内置函数
print(all([0,-1,3])) # 判断iterable元素 都为真则返回True 非0为真 有假则假
print(any([0,-1,3])) # 有真则真
print(ascii([1,2,"杨"])) #把内存的数据对象变成可打印的字符串对象
print(bin(255)) # 数字十进制转二进制 b 代表二进制开头
print(bool(0),bool(1),bool(-1)) # 判断布尔值 列表为空 字典为空 是假
a=bytes("abcde",encoding="utf-8")
b=bytearray("abcde",encoding="utf-8") #打印a的ascii形式
print(b[1])
def a():
pass
print(callable(a)) # 判断是否可调用
print(chr(98)) # 把数字对应ascii
print(ord('d')) # 把ascii转对应数字
code="for i in range(10):print(i)"
#print(compile(code,'','exec'))
#c=compile(code,'','exec') # 把字符串编译成可执行文件
exec(code) # exec可直接执行。。。(多行)
list=[]
print(dir(list)) # 可以查方法
print(divmod(5,3)) # 得商,余数
l=[1,2,3]
for i in enumerate(l): # 将iterable可迭代对象组成一个索引序列
print(i)
a="2*5"
d="[1,2,3]"
print(eval(a)) # 用来执行字符串表达式,并返回表达式的值
print(eval(d)) # 将字符串对象转换为有效的表达式,讲d转换为list
res = filter(lambda n:n>5,range(10)) # 使用了匿名函数做条件,filter作为过滤器,在3.0 filter生成的是迭代器对象,要用for来迭代
for i in res:
print(i)
import functools
res1=functools.reduce(lambda x,y:x+y,range(10))
print(res1)
f="{} {}".format("hello","world") # 格式化字符串/数字
print(f)
a=frozenset([1,3,444,55,231,3]) # 变成不可变集合
print(globals()) # 返回当前程序所有全局变量的字典
print(hash('yang')) # 生成哈希算法对应哈希值 (找字符串的时候 就是哈希值的二分查找)
print(hex(10)) # 转为16进制 0x
def test():
local_var='a'
print(locals()) # 打印当前局部变量
test()
print(oct(10)) # 转八进制 0o
print(oct(8))
print(round(1.3323))
print(round(1.32,2)) #保留两位
a={6:2,-3:1,3:4}
print(sorted(a.items())) # 把key排序变成列表
print(sorted(a.items(),key=lambda x:x[1])) # 把value排序变成列表
a=[1,2,3,4]
b=['a','b','c','d']
for i in zip(a,b): # 拉链 组合
print(i)
__import__('decorator') # 之后会用
day5作业
需求
模拟的atm机器,完成转账、还款、取款等操作,并于购物车结合,付款时调用付款接口。数据存储采用txt格式,以json的数据格式进行存储。