python中的函数就像乐高中的小积木一样,通过组合可以形成各种功能的产品,千里之行,起于函数。
函数就是把代码打包成不同形状的乐高积木,以便可以发挥想象力进行随意拼装和反复使用。
定义函数
在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,返回值用return表示。
简单来说,一个程序可以按照不同功能的实现,分割成许许多多的代码块,每一个代码块就可以封装成一个函数。
eg:
def sum(a,b):
return a + b
print(sum(1,2))
# 输出是
3
空函数
如果想定义一个什么事也不做的空函数,可以用pass语句:
def empty():
pass
print(empty())
参数
函数被设计之初是没有参数的,很快就带来很多麻烦,为了每次调用函数可以有不同的实现,加入了参数的概念。多个参数使用逗号隔开
形参和实参
参数从调用的角度来说,可以分为形式参数和实际参数。
- 形参:函数创建和定义过程中小括号里的参数
- 实参:函数在被调用的过程中传递进来的参数
可变参数
有时候并不清楚这个函数需要多少个参数,这时候可以定义成可变参数,在参数前面加上星号(* param
def test(* params):
print("可变参数的长度:",len(params))
print("可变参数:",params)
注释
单行注释
python的单行注释使用#
eg:
# 这里是python的单行注释
文档注释
使用”“”注释内容”“”表示多行注释;
给函数写文档是为了让别人可以更好的理解自己的函数,所以这是一个好习惯。充足的文档注释即方便了自己复查代码,也方便别人理解自己的代码。因为中大型项目往往需要多人团队配合才能够完成,只有充足的文档注释才能够更利于大家代码的衔接。
返回值
有些场景需要知道我们调用函数之后的结果如何,因此函数有了返回值,可以使用return 返回我们需要的数据;
多返回值
python支持返回多个值
eg:
def test():
return 5,'test'
def test():
return [5,'test']
如果没有指定返回的数据类型,默认是元组
global关键字
全局变量的作用域是整个模块,也就是代码段内所有的函数内部都可以访问到全局变量。
但是需要注意:在函数内部仅仅去访问全局变量就好,不要试图去修改它。因为Python会使用屏蔽的方式”保护“全局变量:一旦函数内部视图修改全局变量,Python就会在函数内部自动创建一个跟全局变量一模一样名字的局部变量,这样修改的结果只会修改到局部变量,而不会影响到全局变量。
count = 10
def test():
count = 20
print(count)
test()
print(count)
但如果确实想在函数内部修改全局变量,可以使用global实现;
count = 10
def test():
global count = 20
print(count)
test()
print(count)
内嵌函数
Python的函数定义是可以嵌套的,也就是允许在函数内部创建另一个函数,这种函数叫做内嵌函数或者内部函数。
def func01() :
print('正在调用func01方法')
def func02() :
print('正在调用func02方法')
闭包(closure)
闭包是函数式编程的一个重要的语法结构,函数式编程是一种编程范式,著名的函数式编程语言就是LISP语言(主要应用于绘图和人工智能,一直被认为是天才程序员使用的语言)
Python中的闭包从表现形式上定义为:如果在一个函数内部,对再外部作用域但不是再全局作用域的变量进行引用,那么内部函数就被认为是闭包。
eg:
def funX(x):
def funY(y):
return x * y
return funY
funX(10)(20)
在闭包中,外部函数的局部变量对应内部函数的局部变量,相当于全局变量和局部变量的关系,在内部函数中,你只能对外部函数的局部变量进行访问,但不能进行修改;
在Python3以前并没有直接的解决方案,只能间接的通过容器类来存放,因为容器类不是放在栈里,所以不会被”屏蔽“调。
容器类-字符串,列表,元组
在python3中,如果希望在内部函数里可以修改外部函数里的局部变量值,那么也有一个关键字可以使用,就是nonlocal,方式跟global一样
def funX():
x = 10
def funY():
nonlocal x
x *= x
return x
return funY
funX()()
匿名函数
Python允许使用lambda关键字来创建匿名函数。我们提到一个新的关键字
什么是lambda?
def func(x):
return 2 * x + 1
func(5)
# 等价于
func = lambda x : 2 * x + 1
func(5)
lambda表达式的语法非常精简(:左边放原函数的参数,可以有多个参数,用逗号,隔开即可;冒号右边是返回值)
lambda好处:
1. Python写一些执行脚本时,使用lambda可以省下定义函数的过程
2. 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,不用考虑取名字的问题
3. 简化代码的可读性