Python 程序设计入门(023)—— Python 的自定义函数

Python 程序设计入门(023)—— Python 的自定义函数

目录

  • Python 程序设计入门(023)—— Python 的自定义函数
    • 一、创建自定义函数
    • 二、自定义函数的调用
    • 三、函数参数的传递
        • 1、形参和实参
        • 2、位置参数
    • 四、函数的返回值
    • 五、在函数中使用局部变量
    • 六、在函数中使用全局变量

在 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、形参和实参

在使用函数时,函数名后面括号中的参数称为【形式参数】,简称【形参】。

在调用一个函数时,函数名后面括号中的参数称为【实际参数】,也就是函数的调用者提供给函数的参数,实际参数也称为【实参】。

根据实参的类型不同,可以分为将实参的值传递形参和将实参的引用传递给形参两种情况。其中:

(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]
2、位置参数

位置参数也称为必备参数,必须按照正确的顺序传递给函数。即:调用函数时指定的参数的数量和位置必须和定义时的相同。

在调用函数时,指定的实参数量必须与形参数量一致,否则将抛出 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

你可能感兴趣的:(Python,程序设计入门,python)