python闭包,装饰器,生成器

python闭包,装饰器,生成器

1、           python是动态语言

动态语言(python,javascript,php等):可以在运行过程中修改代码

静态语言(java,C++):编译时已经确定好代码,运行时不可再修改

python可以动态的添加属性,可以使用__slots__这一特殊的变量限制这一行为,指定其类所添加属性名称。如:__slots__ = (“name”,”age”)其实例只允许添加这两个属性

 

2、           生成器(generator)

创建生成器

1)G = (x for x inrange(10))

可以通过next()方法获得生成器的下一个返回值。如:G.next()

2)通过函数和关键字yield创建

def fib(times):

        n = 0

        a = 0

        b = 1

        while n < times:

                yield b

                a, b = b, a+b

                n+=1

生成器是可迭代对象可以for循环访问,也可以用__next()__()方法使用。如f=fib(5),可以使用f.__next__()一个一个生成数据

send()与 __next__() 一样都是从停下的地方开始运行直到原地,不同的是send的传的值相当于yield i语句返回的,如果用 __next__()则没有返回值

 

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变

 

3、           迭代器

可迭代对象

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

如:list, tuple, dict,str, set, generator

 

迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()方法判断一个对象是否是 Iterator 对象

把 list、dict 、str 等 Iterable 变成 Iterator 可以使用iter()方法

生成器和迭代器区别:

迭代器可以不止一遍的生成数据,生成器只能生成一遍数据

4、           闭包

闭包:在一个内部函数中,对外部函数的变量的引用。称内部函数为闭包

     deffunx(x):

         deffuny(y):

              returnx * y

         returnfuny

调用方式:

     i=funx(8)

     i(5)

     或

     funx(4)(5)

 

通过关键字nonlocal可以使得内部函数调用外部函数变量。

     deffun1():

         x=5

         deffun2():

              nonlocalx

              x*=x

              returnx

     returnfun2()

 

5、           装饰器

单个装饰器

# coding:utf-8

def check_login(fun):

    definner():

        print'正在验证权限'

             ifTrue:

              fun()

             else:

                    print'你没有权限'

return inner

 

 

@check_login  #这一步就相当于test = check_login(test)

def test():

        print '登录成功后执行action'

 

 

if __name__ =="__main__":

        test()

             

执行check_login函数 ,并将 @check_login下面的函数作为check_login函数的参数,即:@check_login等价于check_login (test)

多个装饰器一般从离函数越近越先开始装饰

在装饰器装饰有参函数的时候闭包内函数需设置参数

在闭包内可用 *agrs , **mak 通用承参数(怎么传怎么用)

装饰器装饰带返回值得函数:在闭包内调用该函数需接收返回过来的值

 

6、==, is

is是比较两个引用是否指向同一个对象

== 判断两个对象是否相等

 

7、           深拷贝,浅拷贝

浅拷贝:仅仅拷贝地址

深拷贝:相当于新开辟一块内存空间拷贝其值

如:

浅拷贝:a = b

深拷贝:

Importcopy

 

a =copy.deepcopy(b)

 

可用id() ,append()方法查看其区别

在copy模块中的copy功能在拷贝数据时会根据数据的可变或不可变类型有不同的处理方式

 

8、           属性property

class Test(object):

  def __init__(self):

      self.__num = 0

 

  def setNum(self,value):

     self.__num = value

 

  def getNum(self):

     return self.__num

 

  num = property(getNum, setNum)

 

t = Test()

t.num = 5

print t.num

私有属性设置的魔法方法

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,"三器一闭"指的是迭代器、生成器装饰器闭包这四个概念。它们都是Python中非常重要且强大的编程概念。 1. 迭代器(Iterator):迭代器是一个对象,它实现了迭代器协议,即包含`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,迭代器可以逐个返回元素,直到没有元素可返回时抛出`StopIteration`异常。迭代器可以用于遍历可迭代对象,如列表、元组、字典等。 2. 生成器(Generator):生成器是一种特殊的迭代器,它使用函数来创建。生成器函数使用`yield`关键字来暂停函数的执行,并返回一个值。每次调用生成器的`__next__()`方法时,函数会从上次暂停的位置继续执行,直到再次遇到`yield`关键字。生成器可以节省内存,并且可以按需生成数据。 3. 装饰器(Decorator):装饰器是一种用于修改函数或类的行为的函数。它可以在不修改原始函数或类的情况下,通过将其传递给装饰器函数来添加额外的功能。装饰器使用`@`语法来应用于函数或类定义之前。 4. 闭包(Closure):闭包是指一个函数对象,它可以访问并修改其词法作用域之外的变量。闭包在函数内部定义了一个内部函数,并返回该内部函数。内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。闭包可以用于实现函数工厂、实现私有变量和缓存结果等功能。 以下是一个简单的示例,演示了迭代器、生成器装饰器闭包的使用: ```python # 迭代器 class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return value # 生成器 def my_generator(): yield 1 yield 2 yield 3 # 装饰器 def my_decorator(func): def wrapper(): print("Before function execution") func() print("After function execution") return wrapper @my_decorator def my_function(): print("Inside function") # 闭包 def outer_function(x): def inner_function(y): return x + y return inner_function # 使用迭代器 my_list = [1, 2, 3] my_iterator = MyIterator(my_list) for item in my_iterator: print(item) # 使用生成器 my_generator = my_generator() for item in my_generator: print(item) # 使用装饰器 my_function() # 使用闭包 add_5 = outer_function(5) print(add_5(3)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值