Python入门之十:自定义函数
### 一、函数的定义
语法如下,依赖上下文缩进对齐:
```
def 函数名(参数列表):
函数体
```
例如下面的代码:
```python
#!/usr/bin/env
def demo(num):
print(num)
demo('小黄牛真帅!')
```
### 二、参数的传递
在 python 中,类型属于对象,变量是没有类型的,`string`, `tuple`, 和 `number` 是不可更改的对象,而 `list`,`dict` 等则是可以修改的对象。
python 中一切都是对象,严格意义上不能说值传递还是引用传递,应该说传不可变对象和传可变对象。
python 函数的参数传递:
1、不可变类型:如整数、字符串、元组。
例如`fun(a)`,传递的只是`a`的值,没有影响`a`对象本身。
比如在`fun(a)`内部修改 `a` 的值,只是修改另一个复制的对象,不会影响函数外部 `a` 变量本身,就是通常说的作用域。
2、可变类型:如列表,字典。
如 `fun(la)`,则是将 `la` 真正的传过去,修改后`fun()`外部的`la`也会受影响。
传不可变对象的例子:
```python
#!/usr/bin/env
#定义函数
def demo(b):
b = 100
print(b)
b = 1
#调用函数
demo(b)
print(b)
```
运行上面的代码后,我们可以从结果中看出函数外部`b`变量的值并没有发生变化。
注意:上面的`b`变量为必传参数,如果我们直接调用`demo()`函数就会报错
Python也允许给函数变量传递默认参数,例如这样创建函数:`def demo(b=200)`
传可变对象的例子:
```python
#!/usr/bin/env
#定义函数
def demo( list ):
list[0] = 100
print(list)
list = [1,2,3,4]
#调用函数
demo(list)
print(list)
```
从结果可以看出,在调用过函数之后,函数外部的`list`中的值也发生了改变。
### 三、可变参数位置
Python中允许使用关键字参数调用函数,在调用时参数的顺序与声明时可以不一致,用法如下:
```python
#!/usr/bin/env
# 定义函数
def demo(name,phone):
print(name)
print(phone)
# 调用函数
demo(phone="110", name="小黄牛")
```
### 四、传递不定个数的参数
当我们创建一个函数的时候,需要传入的参数个数未知,这时候应该怎么办?
Python中给我们提供了两种方法:
#### 语法一:
```
def 函数名(*var):
函数体
```
加了`*`星号的参数会以元组(`tuple`)的形式导入,存放所有未命名的变量参数,
例如:
```python
#!/usr/bin/env
# 定义函数
def demo(*var):
print(var)
#调用函数
demo(1,2,3)
```
如果在函数调用时没有指定参数,它就是一个空元组。
可以不向函数传递未命名的变量。
#### 语法二:
```
def 函数名(**var):
函数体
```
加了两个`**`星号的参数会以字典的形式导入。
例如:
```python
#!/usr/bin/env
# 定义函数
def demo(**var):
print(var)
#调用函数
demo(a=1,b=2,c=3)
```
输出结果如下:
```
{'a': 1, 'b': 2, 'c': 3}
```
### 五、匿名函数
Python中也支持匿名函数的创建,但没有闭包的概念,所以作用不大,只能处理简单的逻辑。
python 使用 `lambda` 关键字来创建匿名函数:
1、`lambda` 只是一个表达式,函数体比 `def` 简单很多。
2、`lambda` 的主体是一个表达式,而不是一个代码块。仅仅能在`lambda`表达式中封装有限的逻辑进去。
3、`lambda` 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法如下:
`lambda [变量,变量] : 函数体`
示例:
```python
#!/usr/bin/env
#定义匿名函数
sum = lambda a,b : print(a+b)
#调用函数
sum(2,2)
```
注意:匿名函数的函数体,只能写在同一行代码中,也无法使用`\`符号进行多行划分。
### 六、返回值
与其他编程语言一样,Python中同样是使用`return`关键字退出函数,选择性地向调用方返回一个表达式。
不带参数值的`return`语句返回`None`,这里需要注意,首字母`N`是大写的。
在Python中没有`NULL`的概念,空则是`None`字符串,我们要判断是不是为`None`可以直接使用`if`判断,例如这样:`if a== None`
示例代码:
```python
#!/usr/bin/env
#定义函数
def demo(a,b):
sum = a + b
return sum
#调用函数
total = demo(5,10)
print(total)
```