python核心编程:迭代器,闭包,装饰器

迭代器:

  1. 可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

from collections import Iterable

list = isinstance([],Iterable)
print(list)

运行结果:
True

生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

from collections import Iterable,Iterator

list = isinstance(iter([]),Iterator)
print(list)

闭包:
在函数中再定义一个函数,如果这个函数用到了外边函数的变量,那么将这个函数以及用到的变量称为闭包
优缺点:
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

def A(num):

    def B(newNum):
        print("我是闭包:%d"%newNum)
        return num+newNum
    return B

n = A(1)
print(n(2))

运行结果:

我是闭包:2
3

装饰器:
概念:
装饰器本身就是函数,为别的函数添加附加功能。把握两个遵循的条件。
1.不修改被修饰的源代码内容
2.不修改被修饰函数的调用方式

功能:
引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景
缓存

通过例子理解一下什么是装饰器:

from time import ctime,sleep

def timefun(func):
    def wrappedfunc():
        print("%s called at %s"%(func.__name__,ctime()))
        func()
    return wrappedfunc

@timefun
def foo():
    print("i am foo")

foo()
sleep(2)
foo()

运行结果:

foo called at Wed Mar 13 17:04:48 2019
i am foo
foo called at Wed Mar 13 17:04:50 2019
i am foo

首先,从代码看@timefun就是装饰器,通俗地讲,在python程序中,加了@的就是装饰器
接下来按照我自己理解说明一下程序运行的过程:
1.代码从上到下执行,走到def timefun(func),系统知道了这里有一个函数,不进行操作接着往下走
2.接下来走到了装饰器这里,或许有人疑惑,为什么没有走到def wrappedfunc()呢?那么请问,有人调用这个函数吗?没人调用当然就不执行喽。到了装饰器这里其实就相当于foo = timefun(foo),也就是相当于创建了一个对象指向了timefun的返回值,他返回的是什么呢?由代码 return wrappedfunc看出返回的是wrappedfunc
3.接下来执行函数foo(),相当于调用的是wrappedfunc()
4.在wrappedfunc()中,先打印了 print("%s called at %s"%(func.name,ctime()))这句话,之后调用了func(),那么相当于调用了我们之前定义的foo函数,所以此时会打印print(“i am foo”)这句话
5.延迟两秒后再次执行函数foo(),仍是相当于调用的是wrappedfunc(),逻辑同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值