这里主要是总结学习过程中遇到的一些问题和注意事项
函数参数可以有默认参数,而默认参数使用不当很容易掉坑里。
def personInfo(name,age = 22,city = 'BeiJing'):
print(name,age,city)
personInfo('allen') # ==> allen 22 BeiJing
personInfo('allen',city = 'SH') # ==> allen 22 SH
personInfo('allen',18) # ==> allen 18 BeiJing
以上函数执行的时候,没有问题,很正常。在看一下下面的函数
def add_end(L = []):
L.append('END')
print(L)
add_end([1,2,3]) # ==> [1, 2, 3, 'END']
add_end() # ==> ['END']
add_end() # ==> ['END', 'END']
我们看到默认值是[]
,为什么调用两次之后add_end()
之后会出现['END', 'END']
这样的结果,原因是[]
是可变对象,如果学过c++的同学可能很容易理解,在里的L
是一个指针,指向一块地址,而这块地址的内容在多次调用add_end()
之后内容发生变化,而指针所指向的地址未发生变化。这里我们需要注意:定义默认参数要牢记一点:默认参数必须指向不可变对象
修改上述例子:
def add_end(L=None):
if L is None:
L = []
L.append('END')
print(L)
在参数前面加一个*
号,函数内部参数param
接收到一个tuple。同样Python允许你在list或tuple前面加一个*
号,把list或tuple的元素变成可变参数传进去
def printParam(*param):
for x in param:
print(x)
printParam(1,2,3) # ==> 1,2,3
printParam([1,2,3]) # ==> [1,2,3]
printParam(*[1,2,3]) # ==> 1,2,3
关键参数
**
+参数,如**kw
,kw
将获得一个dict.
# 关键字参数
def person(name,age,**kw):
print('name:',name,'age:',age,'kw:',kw);
person('yy',22)
person('yy',22,city = 'BJ',addr = 'CY')
命名关键参数
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,后面的参数被视为命名关键字参数。有一种情况,如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符了。
# 命名关键字参数
# 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
def student(name,age,*,city,grade):
print('name:%s,age:%d,city:%s,grade:%s'%(name,age,city,grade))
student('DH',12,city="BeiJing",grade = 'A') #==> name:DH,age:12,city:BeiJing,grade:A
student('DH',12) #==> 提示缺少 'city' and 'grade' 参数
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def student2(name,age,*args,city,grade):
print('name:%s,age:%d,city:%s,grade:%s, args:'%(name,age,city,grade),args)
student2('DH',12,1,2,3,4,city="BeiJing",grade = 'A') #==> name:DH,age:12,city:BeiJing,grade:A, args: (1, 2, 3, 4)
我们来看一个函数
def count():
fs = []
for i in range(1,4):
def f():
return i * i
fs.append(f)
return fs
for f in count():
print(f()) //==>9 9 9
看看这个函数,输出结果跟我们预想的1,4,9不符合。这是因为变量i
在循环3次之后,i
已经变成3了,因此结果是9,9,9
注意:返回闭包时牢记一点,返回函数不要引用任何循环变量,或者后续会发生变化的变量
上个函数我们做个改变
def count():
def f(j):
def g():
return j * j
return g
fs = []
for x in range(1,4):
fs.append(f(x));
return fs
class Student(object):
def set_age(self,age):
self.age = age
def set_name(self,name):
self.name = name
Student.set_name = set_name
print(type(Student.set_name)) #==>
print(type(Student.set_age)) #==>
s = Student()
print(type(s.set_name)) #==>
print(type(s.set_age)) #==>