这里主要是总结学习过程中遇到的一些问题和注意事项
-
关于函数参数问题
默认参数
函数参数可以有默认参数,而默认参数使用不当很容易掉坑里。
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
-
关于Function 和 Method理解
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)) #==> <class 'function'> print(type(Student.set_age)) #==> <class 'function'> s = Student() print(type(s.set_name)) #==> <class 'method'> print(type(s.set_age)) #==> <class 'method'>