前言
学习使用任何一个机器都应该详细阅读它的说明书,而不是四处寻找零散的知识片段,对学习编程来说尤其如此,而自己以前总是喜欢四处百度来找答案,殊不知答案早已在官方文档里写的清清楚楚,明明白白。今天顿悟,悔恨不已!
[关于python函数的详细使用方法](https://docs.python.org/zh-cn/3/tutorial/controlflow.html)
提示:以下是本篇文章正文内容,下面案例可供参考
一、计算机函数是什么?
函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。 一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在C语言中,子程序是由一个主函数和若干个函数构成的。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。 在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于利用函数,以减少重复编写程序段的工作量。
二、python语言函数参数详解
1.参数类型
在python的函数中参数可分为位置参数(positional argument)和关键字参数(key ward argument)。位置参数是必填项,关键字参数是可选项
下面的例子中, 指定了位置参数为1,而关键字参数没有给实参。运行正常
>>> def pos_arg(pos,arg = 1):
... pass
...
>>> pos_arg(1)
下面的例子中,没有给定任何实参,此时报错。
>>> pos_arg()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pos_arg() missing 1 required positional argument: 'pos'
给关键字参数任意实参,没有任何异常。
>>> pos_arg(1,arg = 666)
>>>
只给关键字参数实参会报错
>>> pos_arg(arg = 666)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pos_arg() missing 1 required positional argument: 'pos'
2.仅限位置参数
仅限关键字参数要求不能使用关键字传递实参。在某些情况下,如果不使用限定关键字参数会导致意想不到的的错误,比如:
def foo(name, **kwds):
return 'name' in kwds
该函数永远不可能返回True,因为实参会被name 读取。 所以返回值永远是FALSE。
>>> foo(1, **{'name': 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'name'
>>>
此时仅限关键字参数就派上用场了,代码如下:
def foo(name, /, **kwds):
return 'name' in kwds
>>> foo(1, **{'name': 2})
True
可以看到在name 后面出现了/ 这表示前面的参数是仅限位置参数,不接受关键字形式的参数,这就使得**{'name': 2} 只能被**kwds 吸收。
3.仅限关键字参数
仅限关键字参数使用* 来表示后面的参数是只接受关键形式的参数而不接受位置参数,代码如下:
>>> def kwd_only_arg(*,arg):
... print(arg)
...
>>> kwd_only_arg(arg = 'hello,world')
hello,world
当给出位置参数时会报错,代码如下:
>>> kwd_only_arg('hello,world')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given
4. 混合类型参数
请看下例:
>>> def combined_example(pos_only, /, standard, *, kwd_only):
... print(pos_only, standard, kwd_only)
>>> combined_example('XueWeijuan say :','hello !',kwd_only='I say : hello')
XueWeijuan say : hello ! I say : hello !
>>>
这个例子中,是混合了限定关键字参数和限定位置参数。
5.解包实参列表
函数调用要求独立的位置参数,但实参在列表或元组里时,要执行相反的操作。例如,内置的 range() 函数要求独立的 start 和 stop 实参。如果这些参数不是独立的,则要在调用函数时,用 * 操作符把实参从列表或元组解包出来: –python官网
>>> list(range(3, 6))
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))
[3, 4, 5]
三、写给开发者
1.文档字符串 docstring
__doc__ 用于获取函数的说明文档,我们建议每一个开发者都要养成良好的编写docstring的习惯,代码只有一半是给机器读的,另一半是给人读的。下文教你如何给自己的函数模块编写说明文档。
1.第一行应为对象用途的简短摘要。为保持简洁,不要在这里显式说明对象名或类型,因为可通过其他方式获取这些信息(除非该名称碰巧是描述函数操作的动词)。这一行应以大写字母开头,以句点结尾。
2.文档字符串为多行时,第二行应为空白行,在视觉上将摘要与其余描述分开。后面的行可包含若干段落,描述对象的调用约定、副作用等
3.Python 解析器不会删除 Python中多行字符串字面值的缩进,因此,文档处理工具应在必要时删除缩进。这项操作遵循以下约定:文档字符串第一行 之后 的第一个非空行决定了整个文档字符串的缩进量(第一行通常与字符串开头的引号相邻,其缩进在字符串中并不明显,因此,不能用第一行的缩进),然后,删除字符串中所有行开头处与此缩进“等价”的空白符。不能有比此缩进更少的行,但如果出现了缩进更少的行,应删除这些行的所有前导空白符。转化制表符后(通常为 8 个空格),应测试空白符的等效性。
请看代码实例:
>>> def test():
... """This is just a document and it do nothing."""
... pass
...
>>> print(test.__doc__)
This is just a document and it do nothing.
>>>
总结
本文系统的介绍了python函数参数的类型,包括位置参数和关键字参数。位置参数是必选项,关键字参数是选填项目,通常情况若不指定参数则使用默认参数。在实际开发中,使用限定关键字参数和限定位置参数也是常有的事情。前者使用/ ,后者使用* 。另外写给开发者的建议中,包含了写出人类高质量代码的建议(记得要写文档哦!)。如果你觉得本文还不错,不妨留下一个免费的赞让更多的人看到!
|