深浅copy生成器迭代器装饰器

2017-11-18  本文已影响0人  步_尘

   ..# 浅拷贝是对于一个对象的顶层拷贝

# 拷贝了引用,并没有拷贝内容,在某种情况下可以随着变对象的更改而改变

# 深拷贝是对于一个对象所有层次的拷贝(递归),拷贝下来就改不了了,当做克隆来理解就是说不再和原来的对象有瓜葛,只是长得像而已.

# 列表,字符串,元组的切片操作属于浅copy

# 字典的copy有深浅两种

# # 切片的例子:

# l=[32,442342,4234,4234,[1,2]]

# l1=l[1:]

# print(l1)

# l[-1].append(3)

# print(l,l1)

# #字典的copy

# import copy

# D={

#    'a':[2,3],

#    'b':5,

#    'c':6

# }

# C1=copy.copy(D)

# C2=copy.deepcopy(D)

# D['a'][1]=4

# print(D,C1,C2)

#

# print(D,C1,C2)

# #深浅拷贝,即可用于序列,也可用于字典

#    >>> import copy

#    >>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

#    >>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

# 【结论】

# 深浅拷贝都是对源对象的复制,占用不同的内存空间

# 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象

# 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝

# 序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

#

#

# 生成器是用来节省内存,简化程序冗余度的一种函数.可以用来完成协程

# 带有 yield 关键字的的函数在 Python 中被称之为 generator(生成器)。Python 解释器会将带有 yield 关键字的函数视为一个 generator 来处理。一个函数或者子程序都只能 return 一次,但是一个生成器能暂停执行并返回一个中间的结果 —— 这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行。

# 在 for 循环语句执行时,才会执行 fab() 函数的代码块。

# 执行到语句 yield b 时,fab() 函数会返回一个迭代值,直到下次迭代前,程序流会回到 yield b 的下一条语句继续执行,然后再次回到 for 循环,如此迭代直到结束。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

# 由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,从而节省内存空间。从这点看来生成器和迭代器非常相似,但如果更深入的了解的话,其实两者仍存在区别。

# 生成器和迭代器的区别

#

#r# 生成器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素,即无须将对象的所有元素都存入内存之后,才开始进行操作。生成器仅在迭代至某个元素时才会将该元素放入内存,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的类序列对象,EG. 大文件/大集合/大字典/斐波那契数列等。这个特点被称为 延迟计算 或 惰性求值(Lazy evaluation),可以有效的节省内存。惰性求值实际上是现实了协同程序 的思想。

#

# 协同程序:是一个可以独立运行的函数调用,该调用可以被暂停或者挂起,之后还能够从程序流挂起的地方继续或重新开始。当协同程序被挂起时,Python 就能够从该协同程序中获取一个处于中间状态的属性的返回值(由 yield 返回),当调用 next() 方法使得程序流回到协同程序中时,能够为其传入额外的或者是被改变了的参数,并且从上次挂起的下一条语句继续执行。这是一种类似于进程中断的函数调用方式。这种挂起函数调用并在返回属性中间值后,仍然能够多次继续执行的协同程序被称之为生成器。

#

# NOTE:而迭代器是不具有上述的特性的,不适合去处理一些巨大的类序列对象,所以建议优先考虑使用生成器来处理迭代的场景。

# 两种创建方式:

# (i for i in range(9))

# 和 yield

# 用生成器来写兔子函数

# def fib(max):

#    n,a,b=0,0,1

#    while n

#        yield b

#        a,b=b,a+b

#        n+=1

# f=fib(10)

# print(next(f))

# print(next(f))

# print(next(f))

#

# 迭代器

# 迭代器是个很好用的函数,使得遍历,查找很便捷

# 可以直接作用于for循环的对象统称为可迭代对象(Iterable)。

#

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

#

# 所有的Iterable均可以通过内置函数iter()来转变为Iterator。

#

# 对迭代器来讲,有一个__next()就够了。在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next__()方法,直到监测到一个StopIteration异常。

#

# 迭代器是一次性的,可以用deepcopy来保存重用

# s=[1,2]

# d=iter(s)

# import copy

# c=copy.deepcopy(d)

# print(next(d))

# print(next(d))

# print(next(c))

# print(next(c))

# 装饰器

# 装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。

# 比如java中的动态代理,python的注解装饰器

# 其实python的装饰器,是修改了代码。

#

# 原理也就是通过闭包的形式把需要修改的函数拿出来修改后还原再放回去.

# 装饰器(decorator)功能

# 引入日志

# 函数执行时间统计

# 执行函数前预备处理

# 执行函数后清理功能

# 权限校验等场景

# 异常的处理

# 缓存

# def getge(num):

#    def ge(func):

#        def inner():

#            print(num)

#            print('修葺内容')

#            func()

#        return inner

#    return ge

#

# @getge(2356)

# def f():

#    print(1111)

# f()

上一篇下一篇

猜你喜欢

热点阅读