装饰器、生成器与迭代器以及序列化与反序列化的探索(week4)

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











 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值