Python基础(四):函数和代码复用
函数和代码复用
函数
定义
def <函数名>(<参数(0个或多个)>): <函数体> return <返回值>
所指定的参数是一种占位符
不调用,不执行
作用:模块化设计+代码复用
调用
参数传递
- 必需参数
- 可选参数(默认参数)
- 可变参数(不定长参数)
- 关键字参数(按名称传递参数)
返回值
- 函数可以有返回值,也可以没有,可以有 return, 也可以没有。
- return 可以传递 0 个返回值,也可以传递任意多个返回值(不带参数值的 return 语句返回 None)。
局部变量和全局变量
规则1:局部变量和全局变量是不同变量
局部变量是函数内部的占位符,与全局变量可能重名但不同
函数运算结束后,局部变量被释放
可以使用 global 保留字在函数内部使用全局变量
规则2:如果局部变量是组合数据类型且未创建,则等同于全局变量
lambda 函数(匿名函数)
代码复用
模块化设计
模块内部紧耦合,模块之间松耦合
递归
两个关键特征
- 基例:存在一个或多个不需要再次递归的基例
- 链条:计算过程中的递归链
递归的实现:函数+分支语句
- 函数内部,采用分支语句对输入参数进行判断
- 基例和链条,分别编写对应代码
实例:字符串反转,斐波那契数列,汉诺塔
思维导图
Tips
函数参数传递:可使用的正式参数类型
必需参数
- 必需参数须以正确的顺序传入函数。
- 调用时的数量必须和声明时的一样。
可选参数(默认参数)
def <函数名>(<必需参数>, <可选参数>): <函数体> return <返回值>
- 函数定义时可以为某些参数指定 默认值,构成可选参数。
- 调用函数时,如果没有传递可选参数,则会使用默认值。
- 可选参数要放在必需参数之后。
# 举例 def printinfo( name, age = 35 ): print ("名字: ", name) print ("年龄: ", age) return printinfo( "runoob" ) # 输出 名字: runoob 年龄: 35
可变参数(不定长参数)
def <函数名>(<参数>, *b ): <函数体> return <返回值>
- 函数定义时可以设计可变数量的参数,即 不确定参数总数量。
- 加了星号
*
的参数会以 元组(tuple) 的形式导入,存放所有未命名的变量参数。
# 举例 def printinfo( arg1, *vartuple ): print (arg1) print (vartuple) printinfo( 70, 60, 50, 100 ) # 输出 70 (60, 50, 100)
关键字参数(按名称传递参数)
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能用参数名匹配参数值。
# 举例 def printinfo( name, age ): print ("名字: ", name) print ("年龄: ", age) return printinfo( age=50, name="runoob" ) # 输出 名字: runoob 年龄: 50
lambda函数(匿名函数)
Python 使用 lambda 来创建匿名函数,不再使用 def 语句这样标准的形式定义一个函数。
格式:
<函数名> = lambda <参数>: <表达式>
# 例1
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
# 输出
相加后的值为 : 30
# 例2,将匿名函数封装在 myfunc 函数中
def myfunc(n):
return lambda a : a * n
# 通过传入不同的参数来创建不同的匿名函数
mydoubler = myfunc(2) # 等价于 mydoubler = lambda a : a * 2
mytripler = myfunc(3) # 等价于 mytripler = lambda a : a * 3
print(mydoubler(11))
print(mytripler(11))
# 输出
22
33
谨慎使用 lambda 函数
Python基础(四):函数和代码复用
https://luminous-ee.github.io/2023/01/24/Python基础(四):函数和代码复用/