Python学习笔记(9)——函数

本章将介绍语言中经常出现的函数知识。

本文仅供个人记录和复习,不用于其他用途

函数的用处

一般来说,函数有两个作用:

  • 将代码分离,使整体结构清晰
  • 可以直接调用函数,避免重复编写代码

调用函数

Python有很多内置函数,我们可以直接调用,具体可以查看官方文档

这里举两个简单的例子,比如abs()函数,这个是用于将数值转为绝对值:

>>> abs(100)
100
>>> abs(-100)
100
>>> abs(-12.34)
12.34

还有一个就是cmp(x, y)函数,用于比较两个值的大小。如果x < y,那么返回-1,如果x == y,返回0,如果x > y,返回1

>>> cmp(1, 2)
-1
>>> cmp(2, 2)
0
>>> cmp(2, 3)
-1

数据类型转换

Python内置了类型转换用到的函数,比如我们之前用到过的int()

>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> unicode(100)
u'100'
>>> bool(1)
True
>>> bool(0)
False

函数名

学过C的都知道,函数名其实就是一个指针,指向函数体。Python也是一样,我们可以直接把函数赋值给变量,,相当于给变量起了一个名字:

>>> a = abs
>>> a(-1)
1

定义函数

Python中定义函数需要使用def语句,依次写出函数名、括号、参数、冒号:,然后编写函数体,使用return返回数值:

1
2
3
4
5
def myAbs(x):
if x >= 0:
return x
else:
return -x

写完之后可以调用一下这个函数,看看代码是否有误。Python的函数和其他语言的函数是一样的,运行到return时,函数执行完毕,并将结果返回。如果没有return语句,那么函数执行完后会返回一个None

空函数

如果什么都不想做,可以使用pass语句:

1
2
def nothing():
pass

那么一个空函数有什么用呢?比如你还没有想好代码怎么写,那么你可以使用pass充当占位符,让代码可以先运行。

或者你也可以这么做:

1
2
if age >= 18:
pass

参数检查

在调用函数时,如果参数个数不对,那么Python就会给出提示。但是如果是类型不对,那么Python就无法检查。我们可以对比一下myAbsabs,如果类型错误,abs就会给出具体的错误位置,而我们自定义的则不能。

为了自定义函数能够给与报错,我们需要对参数类型进行检查,只允许传入整数和浮点型数。数据类型检查可以使用isinstance

1
2
3
4
5
6
7
def myAbs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x

这个时候如果我们再传入其他的数据类型,那么Python就会报错:

Traceback (most recent call last):
  File "def.py", line 9, in <module>
    print myAbs('A')
  File "def.py", line 3, in myAbs
    raise TypeError('bad operand type')
TypeError: bad operand type

返回多个值

如果你的函数需要返回多个值,比如返回一个坐标,那么Python能够做到吗?答案是能:

1
2
3
4
5
6
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.961524227 70.0

不过你要知道,C、JAVA等语言都只能够返回一个值。所谓的多个返回值,其实大都使用数组或者类来实现的,本质上还是只能够返回一个值。Python当然也不例外:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print r
(151.96152422706632, 70.0)

你会发现返回值其实是一个tuple,而由于tuple只有1个元素时括号可以省略,多个参数可以按照次序赋值给多个变量,所以看起来是返回了多个值。

因此,请牢记,Python返回的是tuple,本质上是一个值。