python 易错点

摘自: 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
原文地址:https://www.cnblogs.com/bsszds930/p/13253788.html