Python的函数学习
函数的学习
函数的基本知识
python类型可以动态变换使得在定义函数的时候不需要像JAVA一样去声明返回类型甚至形参只需要一个名字就行,返回值如果有多个python还会自动封装成元组返回。形参由调用者定义,可以按顺序定义,也可义通过名字来定义(这种方法则无需按照顺序),还能给形参定义默认值。
python不定义数量的参数较为复杂这里只举一个例子:
# 定义函数:普通参数 + 默认参数 + 可变位置参数(*books) + 可变关键字参数(**scores) 一个*代表元组,俩个表字典
def test(x, y, z=3, *books, **scores):
# 打印普通参数和默认参数
print(x, y, z)
# 打印*books(打包后的元组)
print(books)
# 打印**scores(打包后的字典)
print(scores)
# 调用函数:传入位置参数、可变位置参数、可变关键字参数
test(
1, 2, # 前两个普通参数x、y
3, # 覆盖默认参数z(若不传入,z会用默认值3)
"疯狂iOS讲义", "疯狂Android讲义", # 可变位置参数(会被*books打包成元组)
语文=89, 数学=94 # 可变关键字参数(会被**scores打包成字典)
)
参数在传元组之类的时候也要通过*来标记,哪怕定义的形参本身支持元组。具体情况过于多变,需要参考书114页。
函数内可以通过一个global来在函数内改变全局的变量👍。
递归函数
和JAVA等类似,def函数中套个自己的函数名字,逻辑没问题就没问题。
局部函数
局部函数好像在JAVA中写工具类一样,用来写工具API很方便,举个代码例子如下:
# 定义函数,该函数会包含局部函数
def get_math_func(type, nn):
# 定义一个计算平方的局部函数
def square(n): # ①
return n * n
# 定义一个计算立方的局部函数
def cube(n): # ②
return n * n * n
# 定义一个计算阶乘的局部函数
def factorial(n): # ③
result = 1
for index in range(2, n + 1):
result *= index
return result
# 调用局部函数
if type == "square":
return square(nn)
elif type == "cube":
return cube(nn)
else:
return factorial(nn)
print(get_math_func("square", 3)) # 输出 9
print(get_math_func("cube", 3)) # 输出 27
print(get_math_func("", 3)) # 输出 6
函数内容直接的局部变量调用也有严格要求,使用nonlocal关键字区别,详见121页
函数的高级内容
当函数可以变成对象时,函数的使用就变得极为灵活,它甚至能作为形参!!!这使得一个函数可以因为形参的函数使得它的内容是伪可变的,举个例子类似上面的代码:
# 定义映射函数,其中 fn 是一个函数
def map(data, fn):
result = []
# 遍历 data 列表中的每个元素,用 fn 函数对每个元素进行计算
# 然后将计算结果作为新数组的元素
for e in data:
result.append(fn(e))
return result
# 定义一个计算平方的函数
def square(n):
return n * n
# 定义一个计算立方的函数
def cube(n):
return n * n * n
# 定义一个计算阶乘的函数
def factorial(n):
result = 1
for index in range(2, n + 1):
result *= index
return result
data = [3, 4, 9, 5, 8]
print("原数据:", data)
# 下面程序代码调用 map() 函数三次,每次调用时传入不同的函数
print("计算数组元素的平方")
print(map(data, square))
print("计算数组元素的立方")
print(map(data, cube))
print("计算数组元素的阶乘")
print(map(data, factorial))
输出结果为原数据: [3, 4, 9, 5, 8]
计算数组元素的平方
[9, 16, 81, 25, 64]
计算数组元素的立方
[27, 64, 729, 125, 512]
计算数组元素的阶乘
[6, 24, 362880, 120, 40320]
可以看出效果,我们可以通过自己传一个函数进去让后让map函数显现出一种伪动态的感觉。
当然函数作为返回值也是一种很炸裂的存在,详见124页,比如可以通过给窜字母返回段函数代码。
可以通过lambda表达式来简写函数,当然我感觉干脆还是定义一个有函数好,lambda表达式简洁但是阅读难度会增加。

浙公网安备 33010602011771号