2018/1/29-2018/2/9
这周开始学习python的装饰器、生成器与迭代器以及序列化与反序列化的应用。
(1)装饰器
装饰器本质是函数,(装饰其他函数为其他函数添加附加功能)
原则:
1、不能修改被装饰函数的源代码
2、不能修改被装饰函数的调用方式
实现装饰器的知识储备: 1、函数即“变量” 2、高阶函数 #例子 import time def bar(): time.sleep(3) print('in the bar') def text(func): star_time = time.time() func() #run bar stop_time = time.time() print('The func running time is %s '%(stop_time-star_time)) text(bar) #a:把一个函数名当做实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能) #b:返回值中包含函数名(不修改函数的调用方式) 3、嵌套函数 #例子 x =0 def grandpa(): x=1 def dad(): x=2 def son(): x=3 print x son() dad() grandpa() 高阶函数+嵌套函数=》 装饰器
import time
def timer(func):
def deco(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs) #run test1
stop_time=time.time()
print('the func running time is %s'%(stop_time-start_time))
return deco
@timer #test1=timer(test1)
def test1():
time.sleep(1)
print('in the test1')
@timer # test2()=timer(test2)
def test2(name,age):
print('in the test2:',name,age)
test1()
test2('lance','22')
这个装饰器是为了让原本函数增加上计时的功能,传参数时调用在()里加上args,*kwargs,就能调用到,
记得不能改变原本函数的调用方式!!!
(2)生成器与迭代器generator
1、generator(生成器)
生成器只有在调用的时候才会生成相应的数据
只记录当前位置
只有一个__next__()方法
生成器是用来生成列表用的,对于某些无限的列表来说,就只能用生成器去生产,
运算到哪里就生成到那一步。
如:
>>> a = [i+1 for i in range(10)] >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
或者以函数的形式表达:
斐波那契数列
def fib(max):
n,a,b = 0,0,1
while n < max:
#print(b)
yield b #将函数内部print()改为yield即可变成生成器
a,b = b,a+b
n = n+1
return 'sb'
fib(6)
但如果想要的值会超过数列的上限,那么必须要做错误处理;
while True: try: x =next(g) print('g:',x) except StopIteration as e: print('Generator return value:',e.value) break
(3)迭代器
Iterator(迭代器)
1、可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
2、这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
3、集合数据类型:如list、dict、str等是Iterable,
4、但不是Iterator,不过可以通过iter()函数获得一个Iterator对象
5、生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
6、把list、dict、str等Iterable变成Iterator可以使用iter()函数:
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
小结:
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的
(4)序列化/反序列化
Json & pickle 数据序列化:
用于序列化的两个模块
1、json,用于字符串 和 python数据类型间进行转换
2、pickle,用于python特有的类型 和 python的数据类型间进行转换
3、Json模块提供了四个功能:dumps、dump、loads、load
4、pickle模块提供了四个功能:dumps、dump、loads、load