5.1函数定义
def function_name(arg1,arg2[,...]):
statement
[return value]
函数参数和返回值不是必须的,如果没有return语句,则Python函数默认返回值为None
函数名命名规则
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。
函数名是区分大小写的。
函数名不能是保留字或关键字。
Python定义函数有三要数:函数名,参数,返回值,函数可以嵌套。
函数的分类
1.内置函数:解释器内置,直接使用,如print()、input()、len()等
2.标准库函数:需要使用import导入函数库或模块,如math.sin()、turtle.circle()等
3.第三方库函数:需要自行安装,再使用import导入函数库或模块,如jieba.lcut()、matplotlib.pyplot.plot()等
4.自定义函数:
5.2函数参数
函数参数分类
形式参数:def function(arg1,arg2,…)
关键字参数:def function(arg=value,…)
元组参数:def function(*arg)
字典参数:def function(**arg)
参数使用规则
关键字参数必须在形式参数之后;
在单个函数定义中,只能使用一个tuple参数(*arg)和一个字典参数(**arg);
tuple参数必须在连接形式参数和关键字参数之后;
字典参数必须在所有其它参数最后定义。
位置传递
按照顺序把函数调用时的参数对象依次传递给函数定义中的参数
关键字传递
函数调用时,为函数定义中的每个参数名赋一个具体的对象值
关键字传递与位置传递混用
按位置传递的参数要放在关键字传递的参数前面
【例】
def fun(name, city, hobby): # 参数未绑定对象,空标签 return f'我的名字是{name},来自{city},爱好是{hobby}。'
位置传递:
full_name = input() # 夏琪place = input() # 武汉interest = input() # 羽毛球fun(full_name, place, interest)
关键字传递:
full_name = input() # 夏琪place = input() # 武汉interest = input() # 羽毛球fun(hobby=interest, city=place, name=full_name)混用:
full_name = input() # 夏琪place = input() # 武汉interest = input() # 羽毛球fun(full_name, hobby=interest, city=place)
默认值传递
函数定义时参数赋默认值,调用时若不传入新值则使用默认值
默认参数可指向整型(int)、字符串(str)、浮点型(float)、元组(tuple)等不可变对象,不能指向字典(dict)和列表(list)等可变对象。
*解包元组传递参数
函数定义时形参为独立参数(数量固定),调用时实参存储在元组中,用*元组名 解包后,元组的每个元素会按顺序匹配函数的形参。
【例】
def calculate_exposure(iso: int, aperture: float, shutter_speed: float) -> float:
"""计算光学成像的曝光值(简化公式)"""
return (iso * aperture) / shutter_speed
#元组存储实参(ISO, 光圈, 快门速度)
params = (400, 2.8, 1/125)
#用 * 解包元组传递参数(等价于 calculate_exposure(400, 2.8, 1/125))
exposure = calculate_exposure(*params)
print(exposure) # 输出:400*2.8/(1/125) = 140000.0
**解包字典传递参数
【例】
def calculate_exposure(iso: int, aperture: float, shutter_speed: float) -> float:
"""光学成像曝光值计算(简化公式)"""
return (iso * aperture) / shutter_speed
#字典存储参数(键=形参名,值=参数值)
camera_params = {
"iso": 400,
"aperture": 2.8,
"shutter_speed": 1/125
}
#用 ** 解包字典传递参数(等价于 calculate_exposure(iso=400, aperture=2.8, shutter_speed=1/125))
exposure = calculate_exposure(**camera_params)
print(exposure) # 输出:140000.0
函数返回值
1.如果函数有return语句,则返回一个tuple元组,如果给定值,则返回对应元组值,如果没有给定值,则返回空元组。
2.如果函数没有return语句,则函数默认为返回的值是None。
【例】
def add(a, b): """接受两个正整数参数,输出两参数的和""" print(a + b) # 无返回值,输出结果m = int(input()) # 3n = int(input()) # 5add(m, n) # 8print(add(m, n)) # None
3.没有类型和数量限制,多个返回值以元组类型返回
【例】
def calc(x, y):"""接受两个正整数参数,返回两个数的和差积商"""return x + y, x - y, x * y, x / y
4.当函数有多条返回值语句时,只能执行其中一条,执行任意return语句都会结束函数调用
【例】
def is_prime(n): """接收一个整数n为参数,判定n是否为素数,返回值为布尔类型。""" if n < 2: # 小于2的都不是素数 return False for i in range(2, n): # 在(2,n-1)中存在因子的不是素数 if n % i == 0: return False else: # 不满足前两种情况的是素数 return True
5.3函数文档字符串
在函数定义后紧跟的字符串会被认为是函数的说明文档,也叫docstring(文档字符串),可以使用help (function_name)显示出来。
5.4函数变量作用域
查找变量的规则(LGB规则):大多数变量引用在三个作用域中查找:先局部(local),次之全局(global),再次之内置(build-in)。
局部变量和全局变量
l在一个函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量local。
l在一个文件或者模块的顶部定义的变量可以供该文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量global。
l如想在局部作用域中改变全局作用域的对象,必须使用global 关键字进行标识。
【例】
globalInt = 9
def myAdd():
localInt = 3 #在函数中定义一个局部变量
global gi #在函数中定义一个全部变量
gi =7
return globalInt + localInt
#测试变量的局部性和全局性
print (myAdd())
print (globalInt)
print (gi)
print (localInt)
5.5 lambda函数
Python允许用lambda 关键字创造匿名函数,匿名是因为不需要以标准的方式(比如def语句)来声明。作为函数它们也有参数。一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。
语法:lambda (parameters): expression
匿名函数
很多函数支持lambda函数作为参数
如:sorted()、filter()、map()等
【例】sorted(iterable, *, key=None, reverse=False)
ls = [-5, -9, 6, 10, 8]# 直接排序输出
print(sorted(ls))# [-9, -5, 6, 8, 10]# 按各元素的平方升序排序输出print(sorted(ls, key=lambda x: x ** 2)) # [-5, 6, 8, -9, 10]
【例】定义两个函数,分别用于将小写字母转换为大写和将大写字母转换为小写。
upper = lambda x:chr(ord(x)-32)
upper(‘a’)
#‘A’
lower = lambda x:chr(ord(x)+32)
lower(‘A’)
#‘a’
注: 1.ord () 函数返回一个字母的unicode码;
2.chr ()函数返回一个unicode码对应的字母;
3.大小写字母相差数值32。
5.6常用内置函数
vabs( ):返回一个数字的绝对值,如果给出复数,返回值就是该复数的模。
vcallable( ):测试对象是否可调用,如果可以则返回True,否则返回False,可调用对象包括函数、方法、代码对象、类和已经定义了“调用”方法的类实例。
visinstance( object, class-or-str-or-tuple …):测试对象类型,如果为真,返回为True,如果为假,返回为False,如isinstance (‘a’, str )。
vdivmod( x, y ):除法运算,返回商和余数。
vpow(x, y [,z] ):返回以x为底,y为指数的幂,如果给出z值,该函数就计算 x 的 y次幂值被 z 取模的值。
vlen( object ):返回字符串和序列的长度。
vmin( x [,y,z...] ):返回序列或参数的最小值。
vmax( x [,y,z...] ):返回序列或参数的最大值。
vrange ( [lower,] stop [,step] ):按参数生成连续的有序整数列表。
vround( x [,n] ):返回浮点数x的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。
vtype ( obj ):返回对象的数据类型。
vprint ( value, ..., sep=' ', end='\n', file=sys.stdout)
类型转换函数—数值型
vfloat(x):把一个数字或字符串转换成浮点数。
vhex(x):把整数转换成十六进制数。
voct(x):把整数转换成八进制数。
vint(x[,base]):把数字和字符串转换成一个整数,base为可选的基数。
vcomplex(real[,imaginary]):把字符串或数字转换为复数。
类型转换函数—字符串序列
vchr(i):返回ASCII码对应的字符串。
vord(x):返回一个字符串参数的ASCII码或Unicode值。
vstr(obj):把对象转换成可打印字符串。
vlist(x):将序列对象转换成列表。
vtuple(x):把序列对象转换成tuple。
序列操作函数
v常用函数中len()、max()和min()同样可用于序列。
vfilter(function, list):把一个函数应用于序列中的每个项,并返回该函数返回真值时的所有项,从而过滤掉返回假值的所有项。
vmap(function,list[,list]):把一个函数应用于序列中所有项,并返回一个列表。
vzip(seq[,seq,...]):把两个或多个序列中的相应项合并在一起,并以元组的格式返回它们,在处理完最短序列中的所有项后就停止。
5.7函数高级主题
函数嵌套(embeded):Python函数是可以嵌套的,也就是说可以将一个函数放在另一个函数里面。
函数递归(recursion):Python函数是可以递归的,意思是函数可以调用函数自身,就是函数自己调用自己。
【例】经典阶乘运算
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
【例】经典幂运算
def power(x,n):
if n==0:
return 1
else:
return x*power(x,n-1)
生成器(generator):Python生成器是迭代器的一种特殊实现,核心特性是惰性计算——仅在迭代时逐个产生元素,不提前占用大量内存存储所有数据。适合处理大规模数据集、无限序列或需要节省内存的场景。
generator = (表达式for 变量 in 可迭代对象 if 条件判断)
【例】
gen = (x * 2 for x in range(3))
for val in gen: print(val) #输出:0, 2, 4
yield关键字:在函数中用yield替代return,函数会变为生成器函数(调用时返回生成器对象,而非直接执行函数体)。相似的有:列表推导式[x for x in ...]
生成器迭代一次后即耗尽(元素被“消费”),需重新创建生成器对象才能再次迭代,例如:
gen = (x for x in range(3))
list(gen) #输出:[0,1,2](迭代耗尽)
list(gen) #输出:[](无元素可迭代)
【例】斐波那契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
print(b)
a, b = b, a + b
n = n + 1
return 'done’
装饰器(decorater):装饰器是一个函数,主要用途是包装另一个函数或者类,目的就是透明修改或增强功能。
函数测试(doctest):doctest是Python标准库内置的轻量级测试工具,核心原理是从函数/类的文档字符串(docstring)中提取示例代码和预期输出,自动执行并验证结果是否一致。它无需额外依赖,适合快速验证函数逻辑、保障代码正确性,尤其适配学术论文代码(需可复现性)、小型工具函数(需简洁测试)等场景。