函数
圆的面积计算公式是
当我们知道半径r的值时,就可以根据公式计算出面积。
假设我们需要计算出三个不同大小的圆的面积:r1=12.34 r2=9.08 r3=73.1
当代吗出现很有规律的重复时,每次写3.14*r*r就会很麻烦,这时我们可以写成函数调用
s=area_of_circle(x) 函数写一次就可以多次调用,python的内置函数也可以直接调用
抽象
抽象是数学中常见的概念,例如∑可以理解成求和
1+2+3+...+100可以写成
可以还原为(1x1+1)+(2x2+1)+...+(100x100+1)
借助抽象,我们才能不关心底层的具体计算过程,而是直接在高层次上思考问题
函数就是最基本的一种代码抽象的方式
调用函数
调用函数时需要知道函数的名称和参数
比如求绝对值的函数abs,只有一个参数,输入多于一个参数时便会报错
需要知道函数的名称和参数时可以直接从Python的官方查看文档,也可以在交互式命令行通过help(abs)查看abs函数的帮助信息
max()函数可以接受任意多的参数,返回最大的
数据类型转换
int()函数可以将其它数据类型转换为整数
int()、float()、str()、bool()之间可以互相转化
拓展:bool()函数
- 数字:0返回假(False),任何其他数值都返回真(True)。
- 字符串:没有值的字符串(也就是None或者空字符串)返回False,否则返回True。
- 列表、字典、元祖:空的返回False,否则返回True。
- 用bool函数来判断一个值是否已经被设置。
函数名其实就是指向一个函数对象的引用,可以把函数名赋值给一个变量,相当于给这个函数起了一个“别名”
a=abs
print(a(-28))
定义函数
定义函数使用def语句,依次写函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,返回值用return语句
def my_abs(x):
if x>=0:
return x
else:
return -x
b=input()
print(my_abs(int(b)))
注意:函数体内部的语句在执行时,一旦执行到return,函数执行完毕,并将结果返回。单独return即为返回空
空函数
如果想定义一个什么都不做的空函数,用pass语句
pass的作用?pass可以用来作为占位符,没有想好函数代码时,可以先放一个pass让代码运行起来,pass也可用在其他语句里
def nop():
pass
参数检查
调用函数时,如果参数个数不对,python就会检查出来,并抛出TypeError
但如果参数类型不对,就无法检查
my_abs和内置函数abs的差别:
当传入不恰当的参数时,内置函数会检查出参数错误,而自定义的没有参数检查,会导致if语句出错,出错信息和abs不一样,my_abs定义不完善
修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。
数据类型检查可以用内置函数isinstance()实现:
def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x>=0:
return x
else:
return -x
返回多个值
例如在游戏中,经常需要从一个点移动到另一个点,给出坐标位移角度,就可以计算出新的坐标
看似返回了多个值,实际返回的是一个tuple,Python函数返回的仍然是单一值,返回一个tuple可以省略括号
import math 语句表示导入math包,并允许后续代码引用math包里的sin、cos等函数
import math
def quadratic(a,b,c):
x1 = (-b + math.sqrt(b * b - 4 * a * c)) / (2 * a)
x2 = (-b - math.sqrt(b * b - 4 * a * c)) / (2 * a)
return x1,x2
x1,x2=quadratic(2,3,1)
print(x1,x2)
函数的参数
定义函数时,确定参数的名字和位置后,函数的接口定义就完成了
位置参数
def power(x):
return x*x
对于pover(x)函数,参数x就是一个位置参数
当我们调用pover函数时,必须传入有且仅有的有一个参数x
若需要计算x^3...x^n怎么办?可以定义一个pover(x,n)函数用来计算x^n
def pover(x,n):
s=1
while n>0 :
n=n-1
s=s*x
return s
print(pover(5,3))
(x,n)两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋值给x和n