python 函数
- 定义带形参的函数
- 用实参来调用函数
- 区分带返回值的函数和不带返回值的函数
- 使用位置参数和关键字参数调用函数
- 开发可重用代码来模块化程序,使程序易读、易调试和维护
- 决定变量的作用域
- 在软件开发中使用函数抽象的概念
- 用逐步求精的方法设计和实现函数
- 使用可重用代码简化程序
def functionName(list of parameters):
#别忘了冒号
function body
几个常见的函数
- 累加函数
#定义累加函数
def sum(i1,i2) :
result = 0
for i in range(i1,i2+1):
#result 自行加 i
result += i
return result
- 最大值函数
def my_max(a,b):
if a > b:
result = a
else:
result = b
return result
👉 带返回值的函数可以当作语句使用,函数返回值会被忽略,比较少见,但是如果函数调用对返回值不敢兴趣,这样也被允许
👉 如果需要调用函数,可以使用 functionName(parameter) 的方式调用。
- 成绩分级函数,不带返回值
def printGrade(score):
if score >= 90:
print('A')
elif score >= 80:
print('B')
elif score >= 70:
print('C')
elif score >= 60:
print('D')
else:
print('F')
def main():
score = eval(input('请输入成绩:'))
print('The grade is ',end = '')
printGrade(score)
- 成绩分级函数,带返回值
def printGrade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'F'
def main():
score = eval(input('请输入成绩:'))
print('The grade is ',printGrade(score))
👉带返回值和不带返回值有区别,但是所有 Python 的函数都返回一个值,如果没有返回值,默认情况下,它会返回一个特殊值 None,所以,没有返回值后函数不会返回任何值,所以也被称为 None函数, None 函数可以赋值给一个变量来表明这个变量不指向任何对象。
比如:
def sun(a,b):
total = a + b
def main():
print(sun(1,2))
就会返回一个 None。
位置参数和关键字参数
函数作用是调用函数时将实参传递给形参,实参有两种类型: 位置参数 和 关键词参数 。使用位置参数要求参数在函数头的顺序进行传递。
def nPrintln(message,n):
for i in range(n):
print(message)
例如,message,会打印参数 message,n次,调用的时候使用 nPrintln('a',3)
会打印 a 字符 3次,但是如果换成 nPrintln(3,'a')
会有不同的意义,它会将 3 传递给 message,把 a 传递给 n ,所以字符,好像页不会蠢到这样写 function 吧。
这种方法称为位置参数调用法,所以需要严格对应顺序。
也可以通过 name = value
的形式传递参数,比如上面的 nPrintln
函数,可以通过 nPrintln(n=3,message='balalala')
的方式进行调用,这样就不需要对应位置,就是敲起来烦点。
通过传递引用来传递参数
其实就是提前定义好变量的值,就比如上面的函数
def nPrintln(message,n):
for i in range(n):
print(message)
def main():
#提前对变量进行赋值
n = 3
message = '生活就是一坨狗屎'
nPrintln(message,n)
main()
模块化代码
㊙️ Keys:模块化可以使代码易于维护和调试,可以提高代码的重用性
例如,编写了一个最大公约数的函数
#最大公约数
def gcd(n1,n2):
gcd = 1 # 初始化
k = 2
while k <= n1 and k<=n2:
if n1 % k ==0 and n2 % k ==0:
gcd = k
k += 1
return gcd
我可以在其他文件中通过 from GCDFunction import gcd
的方法调用 gcd
函数,然后通过编写一个 main
函数进行调用。
def main():
n1 = eval(input('请输入一个数'))
n2 = eval(input('请输入另外一个数'))
print('两个数的最大公约数为: ', gcd(n1,n2))
main()
如果使用 import GCDFunction
,必须使用 GCDFunction.gcd
才能调用函数 gcd
,例如,在定义了之前的 GCDFunction.py 之后,然后在另一个文件中,输入 import GCDFunction
,然后定义了 main
函数,这时候就需要使用 GCDFunction.gcd
来进行调用。
def main():
n1 = eval(input('请输入一个数'))
n2 = eval(input('请输入另外一个数'))
print('两个数的最大公约数为: ',GCDFunction.gcd(n1,n2))
main()
这种方法具有如下的 优点:
👍 1. 它将计算最大公约数的代码和其他代码分割开,这样使程序的逻辑性更加清晰而且可读性更好
👍2. 计算最大公约数的任何错误就被限定在函数 gcd
之中,缩小了调试范围。
👍3. 其他程序也可以重用函数 gcd
了。
变量的作用域
globalVar = 1
def f1():
localVar = 2
print(globalVar) #全局变量
print(localVar)
f1()
print(globalVar)
print(localVar) #函数内的局部变量,打印会失败
globalVar 为全局变量,可以直接打印,在函数内部或者 procedure 中都可以直接打印,而在函数内部临时定义的变量如果没有经过传参,则无法直接都打印。
传参可以通过在内部直接使用全局变量来实现,例如:
# 在函数内部定义全局变量以实现传递出函数
x = 1
def increase():
global x
x += 1
print(x)
increase()
默认参数
㊙️ Keys:Python 允许定义带默认参数值的函数。当函数被调用无参数。那么默认值就会传递给实参。
例如下面的 MWE
def printArea(width=1,height=2):
area = width * height
print('Width:', width,'\theight:', height,'\tarea:', area)
printArea()
printArea(2,3)
会得到:
Width: 1 height: 2 area: 2
Width: 2 height: 3 area: 6
👉Notice: 函数可以混用默认值参数和非默认值参数,在这种情况下,非默认值参数必须要在默认值参数前。
👉Notice: 尽管许多语言支持在同一个模块里定义两个同名的函数,但是 Python 并不支持这个特点。通过默认参数只可以定义函数一次,但可以通过许多不同的方调用函数。这和其他语言中定义同名的多个函数的效果一样。如果定义了多个函数,那么后面的会顶替前面的
返回多个值
👉Keys: Python 的 return 语句可以返回多个值。
例如下面的 MWE:
def sort(number1,number2):
if number1 < number2:
return number1,number2
else:
return number2,number1
n1,n2 = sort(2,3)
print('n1 is', n1 )
print('n2 is', n2)
关键术语
actual parameter(实际参数) | information hiding(信息隐藏) |
argument(实参) | keywords argument(关键字参数) |
caller(调用者) | local variable(局部变量) |
default argument(默认参数) | None function(None 函数) |
divide and conquer(分治) | paramaters(参数) |
functions(函数) | position argument(位置参数) |
function header(函数头) | scope of variable(变量的作用域) |
global variable(全局变量) | stepwise refinement(逐步求精) |
immutable object(不可变对象) | stub(待完善方式) |