函数
就像中学所学的一样,也可以称之为“方法”,可以用来解决各种数学计算或者实现切合实际的功能,例如计算圆的面积 S=PIrr,只要知道半径,什么圆的面积都可以计算出来。
这就是一种抽象,再举个栗子:
计算数列的和:1+2+3+...+100,可以抽象记成:
而计算机程序也是一样,函数就是一种最基本的一种代码抽象的方式。
定义函数
在 Python 中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。举例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
函数体内部的语句在执行到 return 时,函数就执行完毕并将结果返回,如果没有 return语句也会返回,只不过返回结果是 None。 return None 可以简写为 return。
空函数
什么都不做的函数,只是作为占位符,让代码可以正常运行,以后有什么功能可以添加进去。
def nop():
pass
而 pass 语句还可以放在其它语句里面,也是占位:
if age >= 18:
pass
调用函数
在写完函数之后,我们可以进行调用。而 Python 也内置了不少的函数,调用时需要知道函数的名称和参数。内置函数自行官网,不熟的可以 help(【函数名】)。例如调用绝对值函数,最大值函数,类型转换函数:
>>> abs(100)
100
>>> abs(-20)
20
>>> max(2, 3, 1, -5)
3
>>> int('123')
123
当输入的函数参数数量不对,或者类型不对,Python 将会爆出相应错误。
而函数名其实也是一个指向函数对象的引用,完全可以把函数名赋给一个变量,相当于起了个“别名”:
>>> a = abs # 变量 a 指向 abs 函数
>>> a(-1) # 所以也可以通过 a 调用 abs 函数
1
函数的参数检查
当函数的参数数量不对的时候, Python 解释器会自动检查出来并抛出 TypeError:
>>> my_abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given
但是参数的类型不对,解释器就没法进行检查,除了早已编写过类型异常检查的内置函数。而自己编写时,数据类型检查可以用内置函数 isinstance() 实现:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
输入错误类型:
>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_abs
TypeError: bad operand type
返回多个值
Python 的函数是可以返回多个值的,例如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
然后我们可以同时获得返回值:
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
但这是假象,Python 返回的还是一个单一的值:
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
没错,Python 返回的是一个 tuple,语法上返回的 tuple 可以省略括号,而多个变量可以同时接收一个 tuple,按位置赋给对应的值。
Oh-damn-it-194980992
网友评论