在 Python 中,函数的应用非常广泛。比如:input()、print()、str()、range()、len() 等,这些称为 Python 的内置函数,可以直接使用。Python 支持自定义函数,即将一段有规律的、可重复使用的代码定义为函数,达到一次编写,多次使用的目的。
自定义函数使用关键字 def 实现,语法格式如下:
def function_name([parameterlist]):
["connments"]
[function_body]
说明:
(1)function_name:函数名称。
(2)parameterlist:可选参数,用于指定向函数中传递的参数,如果有多个参数,各参数之间使用逗号分隔。如果不指定参数,则表示函数没有参数。
(3)connments:可选参数,表示为函数指定的注释。
(4)function_body:可选参数,用于指定函数体。
例如:定义以下函数,取出字符串中的数字字符
def get_digit(instr):
num = ""
for item in instr:
if item.isdigit():
num += item
return num
调用函数也就是执行函数,调用函数的语法格式如下:
function_name([parameterlist])
说明:
(1)function_name:表示要调用的函数名称。
(2)parameterlist:可选参数,用于指定各参数的值。
例如:
def get_digit(instr):
num = ""
for item in instr:
if item.isdigit():
num += item
return num
print(get_digit("abc12张三88,2^..33")) # 调用函数
程序的运算结果为:
============================= RESTART: C:\Python\Python38\First.py =============================
1288233
在调用函数时,主调函数和被调用函数之间有数据传递关系。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作。
在使用函数时,函数名后面括号中的参数称为【形式参数】,简称【形参】。
在调用一个函数时,函数名后面括号中的参数称为【实际参数】,也就是函数的调用者提供给函数的参数,实际参数也称为【实参】。
根据实参的类型不同,可以分为将实参的值传递形参和将实参的引用传递给形参两种情况。其中:
(1)当实参为不可变对象时,进行的是值传递。
(2)当实参为可变对象时,进行的是引用传递。
值传递和引用传递的区别是:进行值传递后,形参的值改变,而实参的值不变。进行引用传递后,形参的值改变,实参的值也一同改变。
例如:
(1)值传递
代码如下:
def add(x,y):
x = x * 2
y = y ** 2
return x + y
a = 2
b = 3
print(add(a,b))
print("a=", a) # a的值不变
print("b=", b) # b的值不变
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
13
a= 2
b= 3
(2)引用传递
代码如下:
def list_add(mylist):
for i in range(len(mylist)):
mylist[i] = mylist[i] + 3 # 列表中的每个元素的值增加3
print(mylist)
list1 = [12, 23, 4, 76, 100]
list_add(list1)
print(list1) # 列表list1的元素发生变化
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
[15, 26, 7, 79, 103]
[15, 26, 7, 79, 103]
位置参数也称为必备参数,必须按照正确的顺序传递给函数。即:调用函数时指定的参数的数量和位置必须和定义时的相同。
在调用函数时,指定的实参数量必须与形参数量一致,否则将抛出 TypeError 异常,提示缺少必要的位置参数。
在调用函数时,指定的实参位置必须与形参位置一致,否则可能产生如下两种结果:
(1)抛出异常:如果指定的实参与形参的位置不一致,数据类型也不一致,将抛出异常。
(2)不抛出异常:得到的结果与预期不一致。如果指定的实参与形参的位置不一致,数据类型一致,则不会抛出异常,但是得到的结果与预期的不一致。
例如:
(1)实参与形参数量不一致
def pow1(x,y):
return x ** y
a = 2
b = 10
print(pow1(a)) # 实参与形参个数不同
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 5, in <module>
print(pow1(a)) # 实参与形参个数不同
TypeError: pow1() missing 1 required positional argument: 'y'
(2)实参与形参位置不一致
def pow1(x,y):
return x ** y # 返回x的y次幂
a = 2
b = 10
print(pow1(a,b)) # 2^10 = 1024
print(pow1(b,a)) # 10^2 = 100
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
1024
100
可以在函数体内使用 return 语句为函数指定返回值。函数的返回值可以是任意类型的,无论 return 语句出现在函数的什么位置,只要执行 return 语句就是结束函数的执行。return 语句的语法格式如下:
return [value]
说明:
(1)value:可选参数。用与指定函数要返回的值,可以返回一个值,也可以返回多个值。如果返回多个值,则返回值的类型为一个元组。
(2)当函数中没有 return 语句,或者省略了 return 语句的参数时,将返回 None(空值)。
例如:
(1)返回值为空
def circle_r(r):
print("圆的周长:", 3.14 * r * 2)
print("圆的面积:", 3.14 * r ** 2)
circle_r(5)
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
圆的周长: 31.400000000000002
圆的面积: 78.5
(2)返回一个值
def f(n):
fac = 1
for i in range(1,n+1):
fac *= i
return fac
x = f(5)
print("返回值的类型:", type(x))
print("返回值:", x)
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
返回值的类型: <class 'int'>
返回值: 120
(3)返回多个值
def circle_r(r):
c = 3.14 * r * 2
s = 3.14 * r ** 2
return c,s
result = circle_r(5)
print("返回值的类型:", type(result))
print("返回值:", result)
print("圆的周长:", result[0])
print("圆的面积:", result[1])
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
返回值的类型: <class 'tuple'>
返回值: (31.400000000000002, 78.5)
圆的周长: 31.400000000000002
圆的面积: 78.5
返回多个值的函数在调用时可以使用多个变量接收返回值,代码如下:
def circle_r(r):
c = 3.14 * r * 2
s = 3.14 * r ** 2
return c,s
zc,mj = circle_r(5)
print("圆的周长:", zc)
print("圆的面积:", mj)
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
圆的周长: 31.400000000000002
圆的面积: 78.5
局部变量是指在函数内部定义并使用的变量,只在函数内部有效。
函数内部的变量只在函数运行时才会创建,在函数运行之前或之后,所有的局部变量都不存在。
局部变量只在函数内部有效,在函数外部无效。如果在函数内部和外部都定义了同名的变量,那么它们代表的是不同的变量值。
例如:
def add(x,y):
count = x + y
return count
count = 1
a = 1
b = 10
print("{} + {} = {}".format(a,b,add(a,b)))
print("count = ",count)
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
1 + 10 = 11
count = 1
有时需要在函数外设定变量的初始值,然后在函数内对其进行访问、修改,这就需要定义全局变量。
函数内外部都可以访问的变量叫全局变量。
(1)如果一个变量是在函数外部定义的,则该变量不仅在函数外可以访问,在函数内也可以访问。
注意:在函数体外定义的全局变量,只能访问,不能修改!
例如:
str1 = "Hello Python!"
def p():
print(str1) # str1 为全局变量
p() # 调用函数
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
Hello Python!
在函数中修改全局变量的值,会抛出异常:
num = 20
def p():
num = num + 5 # 在函数中不能修改全局变量的值
print(num)
p() # 调用函数
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
Traceback (most recent call last):
File "C:\Python\Python38\First.py", line 5, in <module>
p() # 调用函数
File "C:\Python\Python38\First.py", line 3, in p
num = num + 5 # 在函数中不能修改全局变量的值
UnboundLocalError: local variable 'num' referenced before assignment
(2)如果在函数内使用 global 关键字定义变量为全局变量,那么在函数外也可以访问该变量,并且在函数内可以对变量进行修改。
例如:
num = 20
def p():
global num # 定义 num 为全局变量
num = num + 5 # 在函数中修改全局变量的值
print(num)
p() # 调用函数
print(num) # 全局变量num的值发生改变
程序的运算结果为:
============ RESTART: C:\Python\Python38\First.py ============
25
25