Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

python函数

函数简介

将常用的代码以固定的格式封装(包装)成一个独立的模块,可以重复使用,这个模块就叫做函数(Function)。

定义函数。

1
2
3
4
5
6
7
#定义个空函数,没有实际意义
def pass_dis():
pass
#定义一个比较字符串大小的函数
def str_max(str1,str2):
str = str1 if str1 > str2 else str2
return str

调用函数。

1
2
3
pass_dis()
strmax = str_max("http://c.biancheng.net/python","http://c.biancheng.net/shell");
print(strmax)

函数说明文档。

函数的说明文档通常位于函数内部、所有代码的最前面。

1
2
3
4
5
6
7
8
9
10
#定义一个比较字符串大小的函数
def str_max(str1,str2):
'''
比较 2 个字符串的大小
'''
str = str1 if str1 > str2 else str2
return str
help(str_max)
#__doc__ 属性来获取 str_max() 函数的说明文档
print(str_max.__doc__)

值传递和引用传递

形式参数:在定义函数时,函数名后面括号中的参数就是形式参数。

实际参数:在调用函数时,函数名后面括号中的参数称为实际参数。

  1. 值传递:适用于实参类型为不可变类型(字符串、数字、元组);
  2. 引用(地址)传递:适用于实参类型为可变类型(列表,字典);

函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。

值传递,其本质就是将实际参数值复制一份,将其副本传给形参。这意味着,采用值传递方式的函数中,无论其内部对参数值进行如何修改,都不会影响函数外部的实参。

传参解包

当传入列表或元组时,其名称前要带一个 * 号,当传入字典时,其名称前要带有 2 个 * 号。

1
2
3
4
5
6
def dis_str(name,add) :
print("name:",name)
print("add",add)
data = ["Python教程","http://c.biancheng.net/python/"]
#使用逆向参数收集方式传值
dis_str(*data)

函数返回多值

2 种方式:

  1. 在函数中,提前将要返回的多个值存储到一个列表或元组中,然后函数返回该列表或元组;
  2. 函数直接返回多个值,之间用逗号( , )分隔,Python 会自动将多个值封装到一个元组中,其返回值仍是一个元组。

序列解包,使用对应数量的变量,直接接收函数返回列表或元组中的多个值。

1
2
3
4
5
6
def retu_list() :
add = ["http://c.biancheng.net/python/",\
"http://c.biancheng.net/shell/",\
"http://c.biancheng.net/golang/"]
return add
pythonadd,shelladd,golangadd = retu_list()

变量作用域

局部变量

仅限于函数内部,出了函数就不能使用。

在函数执行完毕后,这块临时存储空间随即会被释放并回收,该空间中存储的变量无法再被使用。

全局变量

在所有函数的外部定义变量,这样的变量称为全局变量(Global Variable)。

全局变量的默认作用域是整个程序,即全局变量既可以在各个函数的外部使用,也可以在各函数内部使用。

  • 在函数体外定义的变量。
  • 在函数体内使用 global 关键字对变量进行修饰。

函数高级

赋值、作为其他函数的参数以及作为其他函数的返回值。

将函数赋值给其它变量。

1
2
3
4
5
6
def my_def ():
print("正在执行 my_def 函数")
#将函数赋值给其他变量
other = my_def
#间接调用 my_def() 函数
other()

将函数以参数的形式传入其他函数中。

1
2
3
4
5
6
7
8
9
def multi(a,b):
return a*b
def my_def(a,b,dis):
return dis(a,b)

#求 2 个数的和
print(my_def(3,4,add))
#求 2 个数的乘积
print(my_def(3,4,multi))

返回值为函数。

1
2
3
4
5
6
7
8
9
def my_def ():
#局部函数
def indef():
print("调用局部函数")
#调用局部函数
return indef
other_def = my_def()
#调用局部的 indef() 函数
other_def()

闭包

外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。

1
2
3
4
5
6
7
8
9
#闭包函数,其中 exponent 称为自由变量
def nth_power(exponent):
def exponent_of(base):
return base ** exponent
return exponent_of # 返回值是 exponent_of 函数
square = nth_power(2) # 计算一个数的平方
cube = nth_power(3) # 计算一个数的立方
print(square(2)) # 计算 2 的平方
print(cube(2)) # 计算 2 的立方

闭包比普通的函数多了一个 closure 属性,该属性记录着自由变量的地址。

匿名函数

lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能
1
2
add = lambda x,y:x+y
print(add(3,4))

评论