调用函数

python内置了很多有用的函数,我们可以直接调用。

要调用一个函数,需要知道函数的名称和参数,可从python官方网站文档 查看python的内置函数(Built-in Function).

例如 求绝对值的函数abs,只有一个参数,可从文档查看,也可在交互式命令行通过help(abs)abs函数的帮助信息

help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
    Return the absolute value of the argument.

调用abs函数:

abs(-2.718218)
2.718218

python内置的常用函数还包括数据类型转换函数,比如int()汉画素可以把其他数据类型转换为整数:

print(int('123'))
print(int(12.34))
123
12
float('12.34')
12.34
str(1.23)
'1.23'

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:

a = abs #变量a指向abs函数
a(-1)
1

函数定义

定义函数使用def语句,一次写出 函数名括号括号中的参数冒号:; 然后在缩进快中编写函数体,函数的返回值用return语句返回。

自定义一个求绝对值的函数my_abs:

# -*- coding: utf-8 -*-
def my_abs(x):
    if x>=0:
        return x
    else:
        return -x
print(my_abs(-2.71828))
2.71828

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句,pass可以用来作为占位符。

def nop():
    pass

pass还可用于其他语句,例如:

age = input('please input your age:')
age = int(age)
if age >= 18:
    pass
please input your age:18

此处若缺少了pass,代码运行将有语法错误

参数检查

调用函数时,如果参数个数不对,python解释器会自动检查出来,并抛出TypeError;

但如果参数类型不对,python解释器就无法检查。

传入不恰当参数时,内置函数abs会检查出参数错误,而我们定义的my_abs无参数检查,会导致if语句出错,出错信息和abs不一样。所以这个函数定义不够完善。

修改my_abs的定义,对参数类型做检查,只允许整数和浮点型参数。数据类型检查可以用内置函数isinstance()实现:

abs('A')
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-22-6eee3e7a739d> in <module>()
----> 1 abs('A')


TypeError: bad operand type for abs(): 'str'
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')
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-21-3a4b4137ec2c> in <module>()
----> 1 my_abs('A')


<ipython-input-20-c24a51d84b1e> in my_abs(x)
      1 def my_abs(x):
      2     if not isinstance(x, (int, float)):
----> 3         raise TypeError('bad operand type')
      4     if x >= 0:
      5         return x


TypeError: bad operand type

返回多个值

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 / 3)
print(x, y)
130.0 48.03847577293369

其实这是一种假象,python函数返回的仍然是单一值:

r = move(100, 100, 60, math.pi / 3)
print(r)
(130.0, 48.03847577293369)

实时上,返回值是一个tuple,但在语法上,返回一个tuple可以省略,而多个变量可以同时接收一个tuple,按位置赋给对应的值;

所以,python的函数返回多值,其实就是返回一个tuple.

小结

  • 定义函数时,需要确定函数名和参数个数;
  • 如果有必要,可以先对参数的数据类型做检查;
  • 函数体内部可以用return随时返回函数结果;
  • 函数执行完也没有return语句时,自动return None;
  • 函数可以同时返回多个值,但其实就是一个tuple.

参考文献
笔记内容多源于廖雪峰python教程