第三章 函数
函数的目的:简化重复运算。
1. 自定义函数
自定义一个求值函数:
def f(x):
f=x^2+3*x+2
print(f)
可以得到:f(2)=8
等价的返回值return语句:
def f(x):
f=x^2+3*x+2
return f
PS:函数调用求值的结果就是“返回值”;在自定义函数中可以用return语句指定“返回值”。
2. None值
含义:表示没有值(类似于null)
作用:在没有设定return返回值时,其默认返回值为None
3.关键词参数
以print()函数为例:
print(value,sep=’ ‘,end=’\n’)
关键词 | 调用 |
---|---|
value | 打印value的取值 |
sep | 在values之间插入字符串,默认为空格 |
end | 在最后的value之后添加字符串,默认为换行符(\n) |
4.局部和全局作用域
规则: 1. 局部变量不能在全局作用域内使用
2.局部作用域不能使用其他局部作用域内的变量
3.全局变量可以在局部作用域内调用
4.不同局部变量名、局部和全局变量名可同名(影响人为识别,建议避免)
PS:在离开函数内的局部作用域之后,除返回值外,其他变量的取值都会被销毁。
5.global语句
作用:可以将函数类的局部变量修改为全局变量
例:
def spam():
eggs='spam' #局部变量eggs的取值为spam
print(eggs)
eggs='big' #全局变量eggs的取值为big
spam() #调用自定义函数spam():打印局部变量eggs的取值
print(eggs) #打印全局变量eggs
结果为:
spam
big
global语句使用:
def spam():
global eggs #转化eggs为全局变量
eggs='spam' #变量eggs的取值为spam
print(eggs)
eggs='big' #全局变量eggs的取值为big
spam() #调用自定义函数spam():打印局部变量eggs的取值
print(eggs) #打印全局变量eggs
结果为:
spam
spam
6.异常处理
对于可能发生错误的程序可以使用try和except语句来处理,可能出现错误的语句放在try语句中,在except语句中写入当错误发生时需要进行的处理
#在函数模块中调用
def f(x):
try:
f=36/x
return f
except ZeroDivisionError:
print('invalid argument')
print(f(1))
print(f(0))
print(f(3))
#在语句块中调用
def g(x):
return 36/x
try:
print(g(1))
print(g(0))
print(g(3))
except ZeroDivisionError:
print('invalid argument')
上例中在语句块中的*print(g(3))*语句未执行,说明一旦运行except的代码,就不会在运行try语句中的代码。
PS:(1).ZeroDivisionError是Python本身定义的一个错误,表示试图用一个数除以0
(2).None的数据类型为NoneType
7.实践
题目:编写一个名为collatz()的函数,有参数x。如果参数x是偶数则collatz(x)=x//2;如果参数x是奇数,则collatz(x)=3x+1;
然后编写一个程序,让用户输入一个非零数,并对这个数不断调用f(),直到函数返回值为1.
def collatz(x):
if x%2==0:
return x//2
elif x%2==1:
return 3*x+1
else:
print('number is invalid')
print('please enter a non-zero number')
try:
x=int(input())
while True:
print(collatz(x))
x=collatz(x)
if x==1:
break
except ValueError:
print('Please enter an integer')