分享

Python系列(24)——不可不知“技能”之「函数」(三)

 静幻堂 2018-08-22
前端两分钟 2018-08-19 18:26:05

前面说,函数一般分为2种,一种是语言自带的內建函数,另一种则是自己自定义的函数

前2篇文章讲的是Python的內建函数,下面将介绍下自定义函数。

Python系列(24)——不可不知“技能”之「函数」(三)

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方。
  • 不带表达式的return相当于返回 None。

语法

def functionname( parameters ):

"函数_文档字符串"

function_suite

return [expression]

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

实例

以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

def printme( str ):

"打印传入的字符串到标准显示设备上"

print str

return

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():

pass

pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

pass还可以用在其他语句里,比如:

if age >= 18:

pass

缺少了pass,代码运行就会有语法错误。

参数检查

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

所以,参数检查是保证函数定义以及调用过程中,很重要的一个步骤!

>>>def my_abs(x):

if x >= 0:

return x

else:

return -x

>>> 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

但是如果参数类型不对,Python解释器就无法帮我们检查。试试my_abs和内置函数abs的差别:

>>> my_abs('A')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 2, in my_abs

TypeError: unorderable types: str() >= int()

>>> abs('A')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: bad operand type for abs(): 'str'

当传入了不恰当的参数时,内置函数abs会检查出参数错误,而我们定义的my_abs没有参数检查,会导致if语句出错,出错信息和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

添加了参数检查后,如果传入错误的参数类型,函数就可以抛出一个错误:

>>> 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

错误和异常处理将在后续讲到。要是觉得英文水平不错的,可以试着先翻译翻译。

返回多个值

函数可以返回多个值吗?答案是肯定的。

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:

import math

def move(x, y, step, angle=0):

nx = x + step * math.cos(angle)

ny = y - step * math.sin(angle)

return nx, ny

import math语句表示导入math包,并允许后续代码引用math包里的sin、cos等函数。

然后,我们就可以同时获得返回值:

>>> 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)

原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

函数定义成功后,函数调用就显得容易许多了,只要参数传的正确,类型,个数,顺序不要出错就可以~

如下实例调用了printme()函数:

# 定义函数

def printme( str ):

"打印任何传入的字符串"

print str;

return;

# 调用函数

printme("我要调用用户自定义函数!");

printme("再次调用同一函数");

以上实例输出结果:

我要调用用户自定义函数!

再次调用同一函数


老铁们,大佬们,今天就给大家介绍到这里啦~~有兴趣的可以加关注或点赞转发给朋友哟~【爱他(她)就让他(她)去搬砖吧】

敬请期待~~你我一同进步!!!有任何问题皆可留言询问~~谢各位大佬关注!!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多