原标题:python函数定义精讲

在 Python 中,你也可以定义包含若干参数的函数。这里有三种可用的形式,也可以混合使用。

默认参数值

最常用的一种形式是为一个或多个参数指定默认值。这会创建一个可以使用比定义时允许的参数更少的参数调用的函数,例如

这个函数可以通过几种不同的方式调用:

只给出必要的参数:

ask_ok('Do you really want to quit?')

给出一个可选的参数:

ask_ok('OK to overwrite the file?', 2)

或者给出所有的参数:

ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

这个例子还介绍了 in 关键字。它测定序列中是否包含某个确定的值。

默认值在函数 定义 作用域被解析,如下所示

将会输出 5 。

重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数。小编为大家推荐一个学习交流群:308754087,群里有好多人了~大家遇到啥问题都可以在里面交流!是一个非常好的学习交流地方~欲进从速欧~各种PDF等你来下载,全部免费,只为帮助大家快速入门。

输出:

如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:

关键字参数

函数可以通过 关键字参数 的形式来调用,形如 keyword = value 。例如,以下的函 数:

接受一个必选参数 ( voltage ) 以及三个可选参数 ( state , action , 和 type )。可以用 以下的任一方法调用

不过以下几种调用是无效的:

在函数调用中,关键字的参数必须跟随在位置参数的后面。传递的所有关键字参数必须与函数接受的某个参数相匹配 (例如 actor 不是 parrot 函数的有效参数),它们的顺序并不重要。这也包括非可选参数(例如 parrot(voltage=1000) 也是有效 的)。任何参数都不可以多次赋值。下面的示例由于这种限制将失败

引入一个形如 **name 的参数时,它接收一个字典(参见 Mapping Types — dict ),该字典包含了所有未出现在形式参数列表中的关键字参数。这里可能还会组合使用一个形如 *name (下一小节详细介绍) 的形式参数,它接收一个元组(下一 节中会详细介绍),包含了所有没有出现在形式参数列表中的参数值( *name 必须 在 **name 之前出现)。 例如,我们这样定义一个函数:

它可以像这样调用

当然它会按如下内容打印:

注意在打印关键字参数之前,通过对关键字字典 keys() 方法的结果进行排序,生 成了关键字参数名的列表;如果不这样做,打印出来的参数的顺序是未定义的。

可变参数列表

最后,一个最不常用的选择是可以让函数调用可变个数的参数。这些参数被包装进一个元组(参见 元组和序列 )。在这些可变个数的参数之前,可以有零到多个普通的参数:

通常,这些 可变 参数是参数列表中的最后一个,因为它们将把所有的剩余输入参 数传递给函数。任何出现在 *args 后的参数是关键字参数,这意味着,他们只能被 用作关键字,而不是位置参数

参数列表的分拆

另有一种相反的情况: 当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来。例如内建函数 range() 需要要独立的 start,stop 参数。你可以在调用函数时加一个 * 操作符来自动把参数 列表拆开:

以同样的方式,可以使用 ** 操作符分拆关键字参数为字典:

Lambda 形式

出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量:

上面的示例使用 lambda 表达式返回一个函数。另一个用途是将一个小函数作为参数传递:

文档字符串

这里介绍的文档字符串的概念和格式。

第一行应该是关于对象用途的简介。简短起见,不用明确的陈述对象名或类型,因为它们可以从别的途径了解到(除非这个名字碰巧就是描述这个函数操作的动词)。这一行应该以大写字母开头,以句号结尾。

如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔。接下来的文档应该有一或多段描述对象的调用约定、边界效应等。

Python 的解释器不会从多行的文档字符串中去除缩进,所以必要的时候应当自己清除缩进。这符合通常的习惯。第一行之后的第一个非空行决定了整个文档的缩进格式。(我们不用第一行是因为它通常紧靠着起始的引号,缩进格式显示的不清楚。)留白“相当于”是字符串的起始缩进。每一行都不应该有缩进,如果有缩进的话,所有的留白都应该清除掉。留白的长度应当等于扩展制表符的宽度(通常是8个空格)。

以下是一个多行文档字符串的示例

函数注解

函数注解 是关于用户自定义的函数的完全可选的、随意的元数据信息。无论 Python 本身或者标准库中都没有使用函数注解;本节只是描述了语法。第三方的项目是自由地为文档,类型检查,以及其它用途选择函数注解。

注解是以字典形式存储在函数的 __annotations__ 属性中,对函数的其它部分没有 任何影响。参数注解(Parameter annotations)是定义在参数名称的冒号后面,紧随着一个用来表示注解的值得表达式。返回注释(Return annotations)是定义在一个 ‐> 后面,紧随着一个表达式,在冒号与 ‐> 之间。下面的示例包含一个位置参数,一个关键字参数,和没有意义的返回值注释

责任编辑:

python中、函数定义可以不包括以下_python函数定义精讲相关推荐

  1. Python中lambda详解(包括内置函数map、reduce、filter、sorted、max)

    文章目录 一.lambda是什么? 1.lambda语法 2.语法详解 二.lambda的使用 1.定义 2.调用 3.替换 4.作返回值 三.lambda作参数 1.map函数 2.reduce函数 ...

  2. python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  3. Python中数组,列表,元组的区别、定义、功能

    准确的来说,在python中是没有数组类型的,python中取而代之的是列表和元组.列表比元组好用,因为元组一旦定义就没法修改.而列表不仅可以和数组一样按索引访问,还有一堆的功能. 列表: (1)添加 ...

  4. python中那些双下划线开头的那些函数都是干啥用用的

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  5. python属性名以两个下划线开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  6. python中os.path.join()的循环用法_Python中.join()和os.path.join()两个函数的用法详解

    Python中有.join()和os.path.join()两个函数,具体作用如下: . join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 ...

  7. Python中通过索引名称提取数据loc()函数Python中通过行和列下标提取数据iloc()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中通过索引名称提取数据 loc()函数 Python中通过 ...

  8. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  9. python中newfile是干嘛用的_python 文件操作方法

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

最新文章

  1. 基于Google排名因素对Drupal进行SEO优化
  2. python进制转化大全
  3. SVN 图标和工具、wc.db学习
  4. 长白山特色产品谋定农民丰收节交易会 吉林蛟河农商互联
  5. rsync软件配置和使用教程
  6. 列存Delta表是个什么东东
  7. __attribute__((section(name))) study again
  8. NGINX下红黑树的删除(终章)附GIF
  9. python下列数据中不属于字符串的是_下列数据中,不属于字符串的是( )。 (6.0分)_学小易找答案...
  10. python比赛2020_2020LPL春季赛3月15日比赛数据的数据分析(Python)
  11. 偏导数,雅可比矩阵(jacobi matrix),黑塞矩阵(Hessian matrix)
  12. c++ Dxgi+FFmpeg 完成对截图屏幕,以及将屏幕数据保存为MP4格式,以完成录屏功能
  13. android opengl滤镜,Android OpenGL ES滤镜开发之美颜效果
  14. 工作一周年,带你认识杭州最好的电商公司
  15. 一元四次方程求解C++实现
  16. 数据分析方法和思维—RFM用户分群
  17. EAS BosType详解
  18. Tomcat7 与 maven
  19. MediaPlayer之音乐播放器完整解析
  20. ARM的 N、Z、C、V 标志位的解释

热门文章

  1. 精通版本之Subversion
  2. latex algorithm 引用格式错误
  3. Exp5 MSF基础应用 ——20164316张子遥
  4. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】
  5. javascript 日常
  6. .NET dnSpy 程序集编辑器,反编译器和调试器
  7. 螺旋矩阵的上下左右四指针解法
  8. iOS利用OpenCV 实现文字行区域提取的尝试
  9. Github访问慢的问题
  10. 修改 tomcat 初始 ROOT 的方法