一、函數的定義:
Python中使用def關鍵字定義函數,函數包括函數名稱和參數,不需要定義返回類型,Python能返回任何類型:
 
- def run(name):  
 -        PRint name,'runing' 
 -   
 - >>>run('xiaoming')  
 - xiaoming runing  
 -   
 - >>>print run('xiaoming')  
 - xiaoming runing  
 - None 
 -   
 -   
 - def run(name):  
 -        return name+'runing'  
 - >>>r = run('xiaoming')  
 - >>>r  
 - xiaoming runing  
 
  二、 文檔字符串:
在Python中注釋是用#來表示的,暫時沒有發現多行注釋的寫法。不過在函數內部可以使用多行字符串來寫:
- def run(name):  
 -        
 -        print name,'runing'   
 
 
可以使用__doc__查看函數的文檔字符串內容
- >>>run.__doc__  
 - print somebody runing  
 
 
 
三、參數:
Python的函數的參數列表可以是任意多個,調用函數的時候,采取位置綁定和關鍵字綁定兩種方式,確認傳入的變量對應的參數!
 
上面演示的代碼,都可以看作是位置綁定 。
 
下面看一下關鍵字綁定 :
- def run(name,age,sex):  
 -        print 'name :',name,'age:',age,'sex:',sex  
 - >>> run(age=23,name='xiaoming',sex='boy')
 - name:xiaoming age:23 sex:boy  
 
 
某個參數不能在一次調用中同時使用位置和關鍵字綁定
- def run(name,age,sex):  
 -        print 'name :',name,'age:',age,'sex:',sex  
 - >>> run('xiaoming',name='xiaoming',sex='boy')  
 - SyntaxError: non-keyWord arg after keyword arg  
 
 函數調用的時候,如果第一個參數使用了關鍵字綁定,后面的參數也必須使用關鍵字綁定!
 
默認參數 :
- def run(name,age=20,sex='girl'):  
 -        print name,age,sex  
 - >>>run('nana')  
 - nana 20 girl  
 - >>>run('nana',23)  
 - nana 23 girl  
 - >>>run('gg','boy')
 - gg boy girl  
 -   
 - >>>run('gg',sex='boy')
 - gg 20 boy  
 
 1、 如果一個函數的參數中含有默認參數,則這個默認參數后的所有參數都必須是默認參數 ,
       否則會拋出:SyntaxError: non-default argument follows default argument的異常。
- def run(name,age=10,sex):  
 -        print name ,age ,sex  
 - SyntaxError: non-default argument follows default argument gg 23 boy  
 
 
幾個異常
- def run(name,age,sex='boy'):  
 -        print name,age,sex  
 -   
 - >>>run()
 - >>>run(name='gg',23)
 - >>>run('gg',name='pp')
 - >>>run(actor='xxxx')
 -   
 
 
 
 
2、默認參數在函數定義段被解析,且只解析一次 。
- >>>i = 5  
 - >>>def f(arg=i):  
 - >>>    print arg  
 - >>>i = 6  
 - >>>f()  
 - 5  
 
 當默認值是一個可變對象,諸如鏈表、字典或大部分類實例時,會產生一些差異:
- >>> def f(a, L=[]):  
 - >>>    L.append(a)  
 - >>>    return L  
 -   
 - >>> print f(1)  
 - >>> print f(2)  
 - >>> print f(3)  
 - [1]  
 - [1, 2]  
 - [1, 2, 3]  
 -   
 - >>> def f(a, L=None):  
 - >>>    if L is None:  
 - >>>        L = []  
 - >>>    L.append(a)  
 - >>>    return L  
 
 
可變參數
參數被包裝進一個元組。在這些可變個數的參數之前,可以有零到多個普通的參數:
- def run(name,*args):  
 -        print name,'runing'  
 -        for a in args : print a  
 -   
 - >>> run('gg','mm')  
 - gg runing  
 - mm  
 - >>> run('gg',1,2,'mm')  
 - gg runing  
 - 1  
 - 2  
 - mm  
 - >>> run('gg',1,1.02,['mm','gm'])  
 - gg runing  
 - 1  
 - 1.02  
 - ['mm','gm']  
 
 可見可變參數可以是任意多個,而且是任意類型(并且能混合使用)
 
關鍵字綁定的可變參數 (**args這種形式,看原文檔,不甚理解,暫且這樣叫)
 
- def run(name,**args):  
 -        keys = args.keys()  
 -        for k in keys :  
 -               print k,args[k]  
 -   
 - >>> run('nana',type='open')  
 - type open  
 - >>> run('nana',type='open',title='gogo')  
 - type open  
 - title gogo  
 -   
 -   
 - def run(name,*arg,**args):  
 -        for a in arg :print a  
 -        keys = args.keys()  
 -        for k in keys :  
 -               print k,args[k]  
 - >>> run('nn','mm',1,2,'oo',type='open',title='gogo')  
 - mm  
 - 1  
 - 2  
 - oo  
 - type open  
 - title gogo  
 
 
參數列的分拆
- >>> range(3, 6)             
 - [3, 4, 5]  
 - >>> args = [3, 6]  
 - >>> range(*args)            
 - [3, 4, 5]  
 
 通過 lambda 關鍵字,可以創建短小的匿名函數
-   
 - >>> def make_incrementor(n):  
 - ...     return lambda x: x + n 
 - ...  
 - >>> f = make_incrementor(42)
 - >>> f(0)
 - 42  
 - >>> f(1)  
 - 43  
 -   
 -   
 - >>>def t(n):  
 - ...          print x*n  
 - >>>m = t(2)  
 - Traceback (most recent call last):  
 -   File "<pyshell#85>", line 1, in <module>  
 -     m = t(2)  
 -   File "<pyshell#84>", line 2, in t  
 -     print x*n  
 - NameError: global name 'x' is not defined  
 -   
 - 說是沒有定義全局name 'x'  
 -   
 - >>> x =10  
 - >>> def t(n):  
 - ...        print x*n  
 - >>> m = t(2)  
 - 20