一、函数的定义

语法如下,依赖上下文缩进对齐:

  1. def 函数名(参数列表):
  2. 函数体

例如下面的代码:

  1. #!/usr/bin/env
  2. def demo(num):
  3. print(num)
  4. demo('小黄牛真帅!')

二、参数的传递

在 python 中,类型属于对象,变量是没有类型的,string, tuple, 和 number 是不可更改的对象,而 listdict 等则是可以修改的对象。
python 中一切都是对象,严格意义上不能说值传递还是引用传递,应该说传不可变对象和传可变对象。

python 函数的参数传递:
1、不可变类型:如整数、字符串、元组。
例如fun(a),传递的只是a的值,没有影响a对象本身。
比如在fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响函数外部 a 变量本身,就是通常说的作用域。

2、可变类型:如列表,字典。
fun(la),则是将 la 真正的传过去,修改后fun()外部的la也会受影响。

传不可变对象的例子:

  1. #!/usr/bin/env
  2. #定义函数
  3. def demo(b):
  4. b = 100
  5. print(b)
  6. b = 1
  7. #调用函数
  8. demo(b)
  9. print(b)

运行上面的代码后,我们可以从结果中看出函数外部b变量的值并没有发生变化。
注意:上面的b变量为必传参数,如果我们直接调用demo()函数就会报错
Python也允许给函数变量传递默认参数,例如这样创建函数:def demo(b=200)

传可变对象的例子:

  1. #!/usr/bin/env
  2. #定义函数
  3. def demo( list ):
  4. list[0] = 100
  5. print(list)
  6. list = [1,2,3,4]
  7. #调用函数
  8. demo(list)
  9. print(list)

从结果可以看出,在调用过函数之后,函数外部的list中的值也发生了改变。

三、可变参数位置

Python中允许使用关键字参数调用函数,在调用时参数的顺序与声明时可以不一致,用法如下:

  1. #!/usr/bin/env
  2. # 定义函数
  3. def demo(name,phone):
  4. print(name)
  5. print(phone)
  6. # 调用函数
  7. demo(phone="110", name="小黄牛")

四、传递不定个数的参数

当我们创建一个函数的时候,需要传入的参数个数未知,这时候应该怎么办?
Python中给我们提供了两种方法:

语法一:

  1. def 函数名(*var):
  2. 函数体

加了*星号的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数,
例如:

  1. #!/usr/bin/env
  2. # 定义函数
  3. def demo(*var):
  4. print(var)
  5. #调用函数
  6. demo(1,2,3)

如果在函数调用时没有指定参数,它就是一个空元组。
可以不向函数传递未命名的变量。

语法二:

  1. def 函数名(**var):
  2. 函数体

加了两个**星号的参数会以字典的形式导入。
例如:

  1. #!/usr/bin/env
  2. # 定义函数
  3. def demo(**var):
  4. print(var)
  5. #调用函数
  6. demo(a=1,b=2,c=3)

输出结果如下:

  1. {'a': 1, 'b': 2, 'c': 3}

五、匿名函数

Python中也支持匿名函数的创建,但没有闭包的概念,所以作用不大,只能处理简单的逻辑。
python 使用 lambda 关键字来创建匿名函数:
1、lambda 只是一个表达式,函数体比 def 简单很多。
2、lambda 的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
3、lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

语法如下:
lambda [变量,变量] : 函数体
示例:

  1. #!/usr/bin/env
  2. #定义匿名函数
  3. sum = lambda a,b : print(a+b)
  4. #调用函数
  5. sum(2,2)

注意:匿名函数的函数体,只能写在同一行代码中,也无法使用\符号进行多行划分。

六、返回值

与其他编程语言一样,Python中同样是使用return关键字退出函数,选择性地向调用方返回一个表达式。
不带参数值的return语句返回None,这里需要注意,首字母N是大写的。
在Python中没有NULL的概念,空则是None字符串,我们要判断是不是为None可以直接使用if判断,例如这样:if a== None

示例代码:

  1. #!/usr/bin/env
  2. #定义函数
  3. def demo(a,b):
  4. sum = a + b
  5. return sum
  6. #调用函数
  7. total = demo(5,10)
  8. print(total)