摘自: http://www.py3study.com/Article/details/id/16424.html
is 判断是否是一个ID, == 判断内容是否一致。
深拷贝指的是复制内容,单独开辟一个内存,浅拷贝指的是两个变量同时指向一个内存ID。
闭包: 当外部参数确定时,内部函数参数可以反复调用。
# is 判断是否是一个ID, == 判断内容是否一致。
a = 'hello world'
b = 'hello world'
a == b #返回True
a is b #返回False
import copy
a = [1,2,3,4,5]
b = a #浅拷贝,a,b同时指向一个id,当其中一个修改时,另外一个也会被修改。
c = copy.deepcopy(a) #深拷贝,c单独开辟一个id,用来存储和a一样的内容。
d =a[:] #这样也是深拷贝。
e = copy.copy(a) #当拷贝内容是可变类型时会进行深拷贝,如果是不可变类型时会进行浅拷贝。
# 一个对象具有 iter方法的才能称为可迭代对象,使用yield生成的迭代器函数,也有iter方法。凡是没有__next__()方法的不是是生成器。(这里的方法都是魔法方法,是内置方法,可以使用dir()查看)
for i in '',[],(),{},{:}
# 当一个函数定义在另一个函数内,且使用到外部函数的参数。整个代码块称为闭包。当外部参数确定时,内部函数参数可以反复调用。
def num(num):
def num_in(nim_in):
return num + num_in
return num_in #返回内部函数的引用。
a = num(100) # 将参数为100的函数num接收,并赋值给a,只不过这个返回值是一个函数的引用。等于 a = num_in,注意这里接收的不光是函数本身,还有已经传递的参数。
b = a(100) # 调用函数a,即num_in,并传递一个参数100,返回值给b。
装饰器: 原理就是将原有的函数名重新定义为以原函数为参数的闭包。
def function(func): # 闭包
def func_in(): # 闭包内的函数
print('这里是需要装饰的内容,就是需要添加的内容')
func()
return func_in
def test(): #需要被装饰修改的函数。
print('无参函数的测试')
test = function(test)
test() # 将会调用闭包内的函数func_in()。所以将会起到装饰修改的作用,最后会再次调用原函数test()。
@function # 装饰器的python写法,等价于test = function(test),并且无需调用当代码运行道这里,Python会自动运行。
def test():
print('无参函数的测试')
test() #这里再次调用函数时,将会产生修改后的效果。
# 装饰带有参数的函数
def function(func):
def func_in(*args,**kwargs): # 闭包内的函数,因为装饰器运行的实则是闭包内的函数,所以这里将需要有形参用来接收原函数的参数。
print('这里是需要装饰的内容,就是需要添加的内容')
func(*args,**kwargs) # 调用实参函数,并传入一致的实参。
return func_in
@function
def test():
print('无参函数的测试')
test(5,6) # 再次掉用test()的时候,其实是将会调用闭包内的函数func_in()。所以将会起到装饰修改的作用,最后会再次调用原函数test()。
# 装饰带有返回值的函数
def function(func):
def func_in(*args,**kwargs):
print('这里是需要装饰的内容,就是需要添加的内容')
num = func(*args,**kwargs)
return num #将接受到的返回值再次返回到新的test()函数中。
return func_in
@function
def test(a,b):
return a+b # 返回实参的和
# 带有参数的装饰器
def func(*args,**kwags):
def function(func):
def func_in(*args,**kwargs):
print('这里是需要装饰的内容,就是需要添加的内容')
num = func(*args,**kwargs)
return num
return func_in
return function
@func(50) #这里会先运行函数func,并传入参数,之后会再次运行闭包函数进行装饰, @func(50)>>@function,然后将由@function继续进行装饰修改。
def test(a,b):
print('这是一个函数')
return a+b