暑假Python基础整理 -- 函数篇
函数的创建和调用
创建一个函数
创建函数也称定义函数,可以理解为创建一个具有某种用途的工具,Python中使用 def
关键字来定义函数,具体语法如下:
def func(parameter1: type, parameter2: type = default,...) -> return_type:"""Docstrings"""func_body
func
:函数名,调用函数时使用parameter
:可选参数,当没有参数时,必须保留()
,否则将会报错。若存在多个参数,每个参数间使用,
间隔。定义参数时可以通过:
指定参数的类型,也通过=
赋值的方式指定默认值。定义函数时的参数称之为形式参数,调用函数时传递的参数称之为实际参数。Docstrings
:可选参数,用于为函数指定注释,也称文档字符串,其内容通常是说明该函数的功能、要传递的参数的作用。func_body
:函数体内容
如何调用函数的Docstrings
在调用函数时,可以通过 func.__doc__
或者 help(func)
获取。代码示例如下:
def func():"""此处为文档字符串帮助信息"""pass # 若定义函数无任何动作,则需要使用pass作为点位符或添加docstringsprint(func.__doc__)
print(help(func))
调用函数
调用函数也就是执行函数。如果把函数看作成工具,所以调用函数就是使用工具。调用函数的基本语法如下:
func(parameters)
func
:表示已定义好的函数名称parameters
:可选参数,用于指定各个参数的值,若无参数,则保留()
即可。
参数传递
形参和实参
形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”。
实际参数:在调用一个函数时,函数名后面的括号中的参数为“实际参数”。
在进行值传递时,改变形式参数的值后,实际参数的值不改变;在进行引用传递时,改变形式参数的值后,实际参数的值也发生改变。
位置参数
数量必须与定义时一致:在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将会抛出TypeError
异常信息,提示缺少必要参数。
位置必须与定义时一致:指定的实际参数的位置必须与形式参数的位置一致,否则将会产生以下两种结果:
- 抛出
TypeError
异常信息 - 产生的结果与预期不符
举个实例帮助理解,首先我先定义一个函数,功能为输出姓名、年龄、身高:
def func(name: str,age: int, height: int):"""功能为输出姓名、年龄、身高参数依次为name, age, height"""print(f"当前用户的姓名是{name},年龄是{age},身高是{height}")
现在我使用位置传参调用所定义的函数(其中包含错误的调用方式示例):
name,age,height="路人甲", 18, 180
# 正确案例:
func(name,age,height)
# 错误示范1:数量不一致
func(name,age) # 将抛出异常
# 错误示范2:位置不一致
func(name,height,age) # 结果与预期不符
关键字参数
关键字参数是指使用形式参数的名字来确定输入的参数值。语法格式如下:
函数名称(形式参数名2 = 实际参数名2,形式参数名1 = 实际参数名1,...)
当使用关键字传参数时,参数的传递位置可以不用一致
为参数设置默认值
调用函数时若没指定某个参数,则程序将会报错。为解决这一问题,我们可以在定义函数时,直接指定形式参数的默认值,此时当没有输入参数时,可以直接使用定义函数时设置的默认值。示例代码如下:
def func(age: int, height: int, name: str = "路人"):"""功能为输出姓名、年龄、身高参数依次为name, age, height"""print(f"当前用户的姓名是{name},年龄是{age},身高是{height}")
此时我为name
形参定义了默认值路人
,所以我调用时可以不用传递name
的参数,如下调用方式:
age,height=18, 180
# 正确案例
func(age,height)
在定义函数时,指定默认的形式参数必须在所有参数的末尾,否则将会产生语法错误。另外可以使用
func.__defaults__
查看函数的默认值参数的当前值,其结果是一个元组,如上示例调用该语句,将显示('路人',)
可变参数
可变参数也称可变长参数,即传入函数中的实际参数可以是任意个。定义可变参数存在两种形式:
*parameter
:表示接受任意多个实际参数并将其放到一个元组中;**parameter
:表示接受任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中。
在*parameter
进行传参时,若参数对象为列表,则可以直接在列表前添加 *
作为参数传入。如下示例:
lis = [1,2,3,4,5]
func(*lis) # func函数参数为可变参数
在**parameter
进行传参时,若参数对象为字典,则可以直接在字典前添加 **
作为参数传入。如下示例:
def func(**dic):print()for key,value in dic.items():print("["+key+"]"+"的ASCII值是"+str(value))dic = {'a':97,'b':98,'c':99}
func(**dic) # func函数参数为可变参数
也可以使用类似关键字参数一样显式赋值的实际参数进行传参,如下示例:
func(A=65,B=66,C=67)
上述两个案例的执行结果为:
[a]的ASCII值是97
[b]的ASCII值是98
[c]的ASCII值是99[A]的ASCII值是65
[B]的ASCII值是66
[C]的ASCII值是67
类型联合运算符
Python提供了一些方法可以将某些部分设置为静态,如编程时为函数参数指定某种数据类型,示例代码如下:
def func(num: int) -> int:return num**2
设置的语法格式如下所示:
def 函数名(参数: type) -> type: # 指定返回值类型
若是多种数据类型,类型之间可以使用
|
隔开
返回值
Python中在函数体内使用 return
语句为函数指定返回值。返回值类型任意,位置任意,但是当程序一旦执行至 return
语句将会立即结束函数的执行。代码示例如下:
def func(n):if n == 1:return "success"else:return "fial"func(0) # 当这样写时func函数的返回值未被接受,该指令无效
a = func(1) # 正确写法,成功接受到函数的返回值
print(a)
变量的作用域
局部变量
局部变量是指在函数内部定义和使用的变量,它只在函数内部生效,在函数运行之前或者之后,函数内部定义的所有变量名都不存在。
全局变量
全局变量可以作用于函数的内外部。如果变量是在函数外部定义的,那么该变量称为全局变量。在函数内部定义的变量,在使用global
关键字进行修饰后将变为全局变量,该变量将不受局部变量的约束,还可以在函数内部对其进行修改。语法结构为:
global 变量名
当局部变量与全局变量重名时,对函数内部的变量进行赋值后,不影响函数外部的变量。
匿名函数
匿名函数是指无名字的函数,通常情况下,该函数只是用一次。使用lambda
表达式可以创建匿名函数,其语法格式如下:
result = lambda [arg1 [,arg2,...,argn]]:expression
result
:用于调用lambda
表达式[arg1 [,arg2,...,argn]]
:可选参数,用于指定要传递的参数列表expression
:必选参数,用于指定一个实现具体功能的表达式
lambda
参数可以存在多个,但表达式只能有一个,即只能返回一个值,而且不能出现其他非表达式语句
文章地址: 暑假Python基础整理 – 函数