Day4 迭代器,装饰器,json序列化,

本文深入探讨Python中的匿名函数、列表生成式、生成器和装饰器等高级特性,解析其工作原理及应用场景,帮助读者掌握Python编程精髓。

1.匿名函数lambda:

  没有函数名。(所以匿名函数没有函数名,可以赋值给变量,当没有变量时,则被回收。)

  eg。    calc = lambda x:x*3

  变量回收:变量不被引用,则被内存回收。当变量被一次引用,二次引用,则不会被回收,

  x =1

  y = 1

  del x

  解释:1这个值被x 第一次引用,被y 二次引用,x 和y 相当于 1的门牌号,del x 相当于删掉的是门牌号x,1还存在,当内存中定期扫描值得时候,发现1 长期没有被调用,则删掉1. 

2.列表生成式:使代码更简洁。

    a= []

    for i in range(10)

      a.append(i x 2)

    a

  上面的代码用列表生成式来表达就是[ix2 for i in range(10)],或者更复杂一点就是将函数套用进去[func(i) for i in range(10)]

 3.生成器:

res = [i*2 for i in range(10)]  #列表生成式
res = (i*2 for i in range(10)) #生成器,调用的时候才生成值,节省空间。

  1.只有在调用时才会生成相应的数据。

  2.不支持列表切片,截断。

  3.生成式生效时在内存里就是一个表达式的存在。

  4.节省内存,只记忆当前位置,可以调用后面的参数,只有一个c.__next__()方法,只能一个个取,不能指定的取值或者跳跃的取值,不可以调之前的参数。 Python2.7中是c.next().

  5.赋值语句 a,b=b,a+b 相当于 t = (b,a+b), a = t[0],b=t[1]

  6.下面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了

def fib(max):
    n,a,b = 0,0,1

    while n < max:
        #print(b)
        yield  b
        a,b = b,a+b

        n += 1

    return 'done' 
View Code

  7.这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

  在上面fib的例子,我们在循环过程中不断调用yield,就会不断中断。当然要给循环设置一个条件来退出循环,不然就会产生一个无限数列出来。

同样的,把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

  但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIterationvalue中:

  8.在生成器中,next是调用参数,send是传参数+调用函数!!!!!!!!!!!!!!

 

   

 4.装饰器

  定义:本质是函数,装饰其他函数就是为其它函数添加附加功能。

  原则:1.不能修改被装饰的函数的源代码

     2.不能修改被装饰的函数的调用方式。

             3.装饰器对原函数是透明的,它并不知道装饰器对它进行了装饰。因为它的源代码没变,调用方式也没变。

实现装饰器知识储备:

  1.函数即“变量”

  2.高阶函数:

  3.嵌套函数:

  高阶函数+嵌套函数=》装饰器

-------------->

   1.函数即变量

    变量存在于内存之中,python的内存回收机制是解释器去做的。

    eg.  x=1,  test= "函数体“”

整个内存相当于一栋大楼,里面有好多小房子,1 存在于一个小房子,x是1 的门牌号,函数体存在于一个小房子,test是函数体的门牌号。当门牌号被del删除之后,不存在  了,1/函数体也不存在了,内存就回收了。

匿名函数lambda: 有的函数是可以不定义名字。calc = lambda x:x*3.匿名函数没有函数名,这样匿名函数就会被回收。可以将lambda赋值给一个变量。

   2.高阶函数

     a.把一个函数名当做实参传给另外一个函数

     b.返回值中包含函数名

   3.嵌套函数: 在一个函数的函数体内用def 定义另一个函数,叫做函数嵌套。

 

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 %s"%(stop_time-start_time))
    return deco
@timer #test1= timer(test1)
def test1():
    time.sleep(3)
    print("in the test1")
test1()
@timer
def test2(name,age):
    time.sleep(1)
    print("name:",name,age)
test2("alex",30)
View Code

 

3.json序列化 反序列化

    

json.dumps()    ---序列化,---挂机,实现把内存的数据对象存到硬盘上。

json.loads()  ---反序列化,--恢复,实现把硬盘上的数据加载回来。

json只能处理简单的数据类型,比如字典,字符串,列表。json是所有语言里通用的,是为了进行不同语言之间的数据交互。xml正在逐渐被json取代。

 调用时一般需要 import json

处理复杂的数据类型时需 import pickle,用法与json完全一样.Pickle 只能用于python,其他语言不适用。

  Pickle.dumps()  / Pickle.loads()

  pickle.dump(info,f)   =   f.write(pickle.dumps(info))

  data=pickle.load(f)    = date = pickle.loads(f.read())

建议dump一次 load一次,单独存放备份文件。

 

跨目录调用.py:  动态的获取绝对路径,然后动态的加到系统的环境变量里。

 

  

 

    

 

 

 

 

  

转载于:https://www.cnblogs.com/genggeng0/p/7472660.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值