Python的学习笔记--函数

函数的定义


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}