函数的定义
python使用def来定义   
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | def print_str(x):     print (x) ```   调用`print_str("12")`  打印`12`
 
 
  ----------------------------
  `python`支持默认参数。   
  ```python def print_str(x,y="end"):     print (x,y) ```  
  调用`print_str("12")`,不传递y参数  打印`12  end`        调用`print_str("12","continue")`  打印`12  continue`        
  如果是多个默认参数,可以根据参数的名称来指定参数。
  ``` python def print_str(x,y="y",z="z"):     print ("x:",x)     print ("y:",y)     print ("z:",z)
 
   | 
 
当调用print_str(1,2),打印结果:
1 2 3 4 5 6 7 8 9 10
   | x: 1 y: 2 z: z ```   
  当调用`print_str(1,z=2)`,打印结果:   ``` cte x: 1 y: y z: 2
   | 
使用默认参数需要注意一个问题:默认定义的时候,默认参数值已近计算出来,如果是一个默认参数是一个引用,则会发生改变。   
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | def add_dict(arr=[]):         arr.append("end")         print (arr) add_dict() add_dict() add_dict() ```  
  打印结果如下:   
  ```cte ['none'] ['none', 'none'] ['none', 'none', 'none']
   | 
 
所以,如果使用可变的引用变量,则注意这种形式。可以使用None来代替:  
1 2 3 4 5 6
   | def add_dict(arr=None):     if arr is None:         arr=[]
      arr.append("end")     print (arr)
   | 
 
可变参数
在python支持可变的个数的参数,在原来的参数上面增加一个*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | def print_str(*x):     print (x) print_str(1,2,3,4) ```    打印结果如下:`(1, 2, 3, 4)`   
  > 可变参数在函数调用时自动组装为一个tuple   
  如果想把一个数组的元素当成默认参数传到方法里面,该如何操作?
  ``` python def print_str(*x):     print (x)
  arr=[1,2,3,4] print_str(arr)
   | 
 
打印结果:([1, 2, 3, 4],),这个是把arr当成一个list类型的参数传入到方法中,打印出来是一个tuple([],)类型。
所以在python允许list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | def print_str(*x):     print (x)
  arr=[1,2,3,4] print_str(*arr) ```   打印结果:`(1, 2, 3, 4)`    
 
  -----------------------------
  关键字参数是把默认参数当成一个`dict`的类型,使用方法是`**`,我们定义一个关键字参数:   
  ``` python def print_str(x,**arg):     print (x,arg) print_str(1)
   | 
 
打印结果是:1 {}  
调用print_str(1,a=1,b=2,c=3),打印结果:1 {'a': 1, 'b': 2, 'c': 3}  
同样如果想把一个dict类型的参数传递进来,也需要使用**
1 2 3 4
   | def print_str(x,**arg):     print (x,arg) dic={'a': 1, 'b': 2, 'c': 3} print_str(1,**dic)
   | 
 
打印结果:1 {'a': 1, 'b': 2, 'c': 3}    
注意: dic这个中参数传递是一种拷贝,在函数内部修改不会影响原来的值。
1 2 3 4 5 6 7 8 9 10 11 12 13
   | def print_str(x,**arg):     arg["a"]=10     print (x,arg) dic={'a': 1, 'b': 2, 'c': 3} print_str(1,**dic) print(dic) ```  
  打印结果:   
  ``` cte 1 {'a': 10, 'b': 2, 'c': 3} {'a': 1, 'b': 2, 'c': 3}
   |