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