Day_04 装饰器_迭代器_生成器_内置方法_Json & pickle 数据序列化

装饰器
 
定义 : 本质就是函数,功能 :(装饰其他函数),就是为其他函数添加的附加功能。
 
原则 :
1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
总结 : 装饰器对被装饰的函数是完全透明的,感知不到装饰器存在,因为没有修改源函数,该怎么运行还在运行。
 
实现装饰器的知识
1、函数 即 "变量"
2、高阶函数
     a : 把一个函数名当做实参传给另一个函数。(在不修改被装饰函数源代码的清空下为其添加功能)
     b : 返回值中包含函数名(不修改函数的调用方式)
3、嵌套函数
 
高阶函数+嵌套函数=> 装饰器
 
 
import time
 
def timer(func):
    print ("in the timer")
    def deco():
        func()
        print ("in the deco ")
        time.sleep(2)
        print ("装饰器完成..")
    return deco
 
#@timer()
def test1():
    a ="123"
    print ("in the test1")
 
#test1 = timer(test1)          #两种方式,一种是赋值,一种是用@来
test1()

 
高级装饰器,对传入参数加上非固定参数
 
装饰器总结:高级函数 (例如timer(func) ) + 嵌套函数(例如 wrapper() func return wrapper)  
当需要传参数的处理的时候,一定不能修改原代码,要修改装饰器代码进行传参或多层return,同时装饰器可以接受传参。
 
 
 
 
列表生成式
 
作用 : 使代表更加简洁
原理 :  使用 列表生成器的时候会加载全部元素会占用大量内存,使用生成器的时候每次只循环出1个元素。
生成器只有在调用的时候猜会生成相应的数据,若假设直接用生成器调用 c[100]则会提示报错,因为还未循环并位生成这个元素。
使用 :  只有一个__next__()方法
 
 
 
 
 
生成器
函数中每次使用yield产生一个值,函数就返回该值,然后停止执行,等待被激活,被激活后继续在原来的位置执行。
send可以传参数
 
 
 
生产者与消费者
 
import time
 
def consumer(name):
    print ("%s准备吃包子!"%name)
    while True:
        baozi = yield
        print ("包子 [%s] 来了,被[%s]吃了"%(baozi,name))
 
def producer():
    c1 = consumer("a")
    c2 = consumer("b")
    c1.__next__()
    c2.__next__()
    print ("开始准备包子啦 !!")
    for i in range(10):
        time.sleep(1)
        print ("做了一个包子!")
        c1.send(i)
        c2.send(i)
 
producer()
 
a准备吃包子!
b准备吃包子!
开始准备包子啦 !!
做了一个包子!
包子 [0] 来了,被[a]吃了
包子 [0] 来了,被[b]吃了
做了一个包子!
包子 [1] 来了,被[a]吃了
包子 [1] 来了,被[b]吃了
做了一个包子!
包子 [2] 来了,被[a]吃了
包子 [2] 来了,被[b]吃了
做了一个包子!
包子 [3] 来了,被[a]吃了
包子 [3] 来了,被[b]吃了
 
 
 
迭代器
isinstance内置函数可以判断类型
 
例如
isinstance(10,Iterator)
False
 
通过Iterator可以把list dict str变成迭代器,编程迭代器后有next方法
f = Iterator([1,2,3])
 
总结 :
1、凡是可用于for循环的对象都是Iterable类型
2、凡是有next()方法的都是迭代器
 
python2 range(10)产生的是list [0,1,2,3,4,5..]
python3 range(10)产生的是迭代器 (0,10)
 
python3 打开文件 for line in f 其实就是个迭代器
 
 
 
内置方法
all()  #只要有一个是False则返回False
print (all([0,"None"]))   #False
 
any()  #只要有一个是True则返回True
print (any([0,"None"]))   #True
 
bin() #将数字转换成二进制
print (bin(8))  #0b100
 
chr()和ord()
chr负责将给定的数字转换成ascii 字符    #chr('98') a==> 'a '
ord负责将给定的字符转换成ascii对应的数字位置
 
dir() #看有什么方法
例如
a={}
dir(a)
 
匿名函数 #适用于三元运算,不适合复杂方法、
calc = lambda n:3 if n<4 else n
(lambda  n:print(n))(5)
calc = lambda n:print(n)
calc(5)
 
filter() #输出想要的东西
res = filter(lambda n:n>5,range(10))
for i in res:
    print (i)
 
map()  #
将给的值依次传入func中再返回
def test(x):
    x = x*2
    return  x
 
res = map(test,range(10))
for i in res:
    print (i)
 
 
res = map(lambda n:n*2,range(10))
for i in res:
    print (i)
 
0
2
4
6
8
10
12
14
16
18
 
hash()
hash("str")
可以hash成一个数组,对数组进行排序,排序后可以方便用二分法来查找
 
round()
round(1.222,2) #保留两位小叔
1.22
round(1.22)   #保留1位
1
 
sotred() #排序
a = [12,2,3,5,4]
a = sorted(a)
a= [2,3,4,5,12]
 
a = {6:2,8:0,-5:7,4:22}
sorted(a.items(),key=lambad x:x[1]) #按照value进行排序
 
 
 
 
 
Json & pickle 数据序列化
import json
 
序列化写入文件
info = {"name":"zouyi","age"=20}
f = open("text.txt","w")
f.write(json.dumps(info))
 
反序列化
f = open("text.txt","r")
data = f.read()
data = json.load(data)
 
 
pickle用于处理复杂的,跟json用法一样
pickle用二进制写入wb读用rb
 
 
 
代码书写规范
 
1、在pycharm中可以new --> python_package
2、print (__file__)                #可以打印相对路径
import os 
print (os.paht.abspath(__file__))  #可以返回绝对路径
os.path.dirname(os.path.abspath(__file__))  #返回文件的目录名
 

posted on 2016-08-18 14:35  zoeeeeee  阅读(120)  评论(0编辑  收藏  举报

导航