函数文档

1.什么是函数文档:

就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算

2.怎么查看函数文档:

function.__doc__

注意:不加小括号

3.例:

你可能会想,假如我不传入参数能直接打印函数文档吗?

测试一下就知道:

结果是可以的

接着想,前面说不能带小括号,我确认一下是不是真的不能带小括号呢:

果然是不行的,接着看:

有没有什么发现?总结一下:

函数的.__doc__属性里,因为函数加括号表示实例化函数,即对函数的调用,不加括号才是对函数自身的引用,但是函数文档.__doc__是属性,不是方法,不能加括号

那为什么一定要加双下划线?

因为它是魔法方法系统属性都是用双下划线,并且大部分魔法方法都是系统属性

你应该会想,这,函数文档完全没有参与计算啊,那我留它干嘛?不是说python的宗旨是优雅而精简,我不要它啊,是的,道理是这么个道理,你确实是不需要留它,有没有它确实计算不受影响,这里暂且不说,请看下面的。

还有个方法可以访问函数文档:使用help函数

是不是有点突然的恍然大悟,哎呀,我靠,这函数文档不就是帮助文档吗?用来说明函数的方法 ,怎么使用的,方便他人读懂代码读懂函数用法的,是啊,函数文档就是这个作用,那么你现在还觉得函数文档是没用的吗?函数文档虽然看起来不参与运算处理,但是作用真的很大,一个合格的程序员在自定义函数时都会加上函数文档

那么既然函数文档这么重要,那是不是函数文档就真的无法进行运算,当然是可以的,不过它的作用比运算更强大,是作测试用,主角登场:测试框架:doctest模块

doctest

1.作用:

允许在文档字符串内嵌入注释以显示各种语句的用法或者叫期望行为,尤其是函数和方法的结果。

2.创建可自测试的模块:

在模块的尾部添加如下代码:

if __name__=='__main__':
    import doctest
    doctest.testmod(verbose=True)

这样模块在python中直接运行时即能进行自我测试

例:

结果:

如果还是不太有感觉,自己测试,给你代码:

# -*- coding:utf-8 -*-
def my1(num1,num2):
    '''
    >>> my1(3,7)
    21
    >>> my1('py',4)
    'pypypypy'

    '''
    return num1*num2

if __name__=='__main__':
    import doctest
    doctest.testmod(verbose=True)
    

有几点需要注意:

1):必须要加入‘>>>’,这样在其自动测试时才会执行测试,在python的官方文档中,对doctest是这样介绍的:doctest模块会搜索那些看起来像是python交互式会话中的代码片段,然后尝试执行并验证结果,就印证这个效果。

2):'>>>' 开头的行就是doctest测试用例。不带 '>>>' 的行就是测试用例的输出。如果实际运行的结果与期望的结果不一致,就标记为测试失败。

3):doctest.testmod方法里有个verbose参数,如果设置为True则在执行测试的时候会输出详细信息。默认是False,表示运行测试时,只有失败的用例会输出详细信息,成功的测试用例不会输入任何信息

4):有两个地方可以放doctest模块,一个位置是模块的最开头,另一个位置是函数声明语句的下一行(就像上面的例子这样)。除此之外的其它地方不能放,放了也不会执行

如果__main__函数有其他用途,不方便调用doctest.testmod()方法,那么可以用另外一种执行测试的方法:

python -m doctest (模块名).py或者 python -m doctest -v (模块名).py。这里 -m 表示引用一个模块,-v 等价于 verbose=True。运行输出与上面基本一样

如果不想将doctest嵌入到python的源码中,则可以建立一个独立的文本文件来保存测试模块。将doctest从上面的python源码中剥离出来放到一个单独的文件里

例:

文件代码和存放位置

同一路径下,存放有内容如下的txt文档:

使用命令:

python -m doctest -v doct.txt  ()         #-m 表示引用一个模块,-v 等价于 verbose=True

结果:

发现结果是一样的

不过要注意的是,在Windows下运行,注意编码问题,尽量不要使用中文。没办法,这个问题一直存在

参数:

一.实参指函数调用过程中传递进入的参数,叫做“实际参数”,或者简称“实参”

例:def My1(‘yang’):此时括号里面的即为实参,及这个‘yang’参数是一个实际的参数,在创建函数时已经定义好,后面也无法更改

二.形参指创建函数时小括号里面定义的参数,叫做“形式参数”,或者简称“形参”

例:def my1(name):此时里面的name即为形参,即这个name只是一个形式,当实际调用时可以任意一个参数

1.关键字参数:关键字参数调用时是再赋值,其实也就是形参,不过这是完全不同的概念

例:def my2(name,words):其中name,words则为关键字参数,但是调用时则必须赋值,不然报错

2.默认参数:就是在函数定义时为形参附一个初始值,防止调用时忘记赋值,程序出错。如果在调用函数时,没有给参数也不会报错,当前就是默认值,如果调用时给定参数,此时的值就是给定的参数值

例:def my2(name="I",words="U"):其中name="I"或者words="U" 整个则是默认参数

3.收集参数:可以赋值多个,就像一个无底洞,你给我多少,我都接住,来者不拒

例:def test(*params):形参前加*,表示收集参数

有没有发现,打印出来是元组?所以,收集参数得到的是元组

注意:

1):参数之间必须用逗号隔开,不然报错

2):在定义收集参数后,调用收集参数时,直接给参数名,不要再在前面加符号【*】

3):收集参数后面如果还有形参,此时最好把后面的形参定义为默认参数,不然报错:

因为前面的参数都被收集参数拿去了,所以后面个参数永远都获不到值,所以报错。

而这是python3的代码在python2里,在创建的时候就已经不被允许了:

定义默认参数之后:

同样的python2里即使给了默认参数还是无法创建

4.位置参数:任意位置参数

例:def  test(m,*y,**z):形参前加**,表示位置参数,**z则是位置参数

发现打印出来的是字典?所以,位置参数得到的就是字典

位置参数和收集参数的区别:

再一例:

所以,不管是什么类型的参数,都必须匹配

总结:

1.所有参数都必须有匹配的值才行

2.参数位置:

  • 先是位置匹配的参数
  • 再是关键字匹配的参数
  • 手机匹配的元组参数
  • 手机匹配的关键字参数

3.以上几类参数不能同时存在:

(左边python2,右边python3)

参数就介绍完了,记住一句话:调用是为了分解,定义为了整合

洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数的更多相关文章

  1. C语言函数库帮助文档

    C语言函数库帮助文档 安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo ap ...

  2. cmd命令查看Python模块函数等帮助文档和介绍

    dir函数式可以查看对象的属性 使用方法很简单,举os类型为例,在Python命令窗口输入 dir(‘os’) 即可查看os模块的属性 打开cmd命令窗口 ​ 输入python(注意:计算机需要有Py ...

  3. R自动数据收集第二章HTML笔记1(主要关于handler处理器函数和帮助文档所有示例)

    本文知识点:     1潜在畸形页面使用htmlTreeParse函数 2startElement的用法 3闭包 4handler函数的命令和函数体主要写法 5节点的丢弃,取出,取出标签名称.属性.属 ...

  4. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  5. jQuery 效果函数,jquery文档操作,jQuery属性操作方法,jQuerycss操作函数,jQuery参考手册-事件,jQuery选择器

    jQuery 效果函数 方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选元素的所有排队函数( ...

  6. 在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)

    在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套 ...

  7. 使用sphinx自动提取python中的注释成为接口文档

    写好了代码,交付给他人使用的时候,查看代码固然可以了解各类和函数的功能细节,但接口文档能更方便的查找和说明功能.所以,一价与代码同步的接口文档是很有必要的.sphinx可以根据python中的注释,自 ...

  8. python开发_xml.dom_解析XML文档_完整版_博主推荐

    在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后. 下面是我做的demo 运行效果: 解析的XML文件位置:c:\\test\\hon ...

  9. 三言两语聊Python模块–文档测试模块doctest

    doctest是属于测试模块里的一种,对注释文档里的示例进行检测. 给出一个例子: splitter.pydef split(line, types=None, delimiter=None): &q ...

  10. python 使用win32com实现对word文档批量替换页眉页脚

    最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的.就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这 ...

随机推荐

  1. Xamarin.Android 使用 SQLite 出现 Couldn't read row 0, col -1 from CursorWindow. 异常

    异常:Java.Lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cu ...

  2. 杭州富阳场口科目四考试公交路线(西溪北苑->场口)

    从西溪北苑出发,时间充裕,比较悠闲,打算坐公交前往,也打算做下科目四模拟题,顺便欣赏沿途的风景(去的时候需要看题目,回来的时候可以放松,哈哈哈),路线如下. 早上7点半出发,出去吃个早餐,步行到文一社 ...

  3. salesforce lightning零基础学习(八) Aura Js 浅谈一: Component篇

    我们在开发lightning的时候,常常会在controller.js中写 component.get('v.label'), component.set('v.label','xxValue'); ...

  4. Docker修改默认网段

    因阿里云服务器VPC默认占用了172.16.0.0/16 网段,与Docker里的网段相同,导致Docker里无法连接VPC服务器.后来找到的解决方案是修改Docker的默认网段. 由于Docker默 ...

  5. Hadoop2源码分析-YARN 的服务库和事件库

    1.概述 在<Hadoop2源码分析-YARN RPC 示例介绍>一文当中,给大家介绍了YARN 的 RPC 机制,以及相关代码的演示,今天我们继续去学习 YARN 的服务库和事件库,分享 ...

  6. Linux常用命令-vim

    vim的基本模式 1普通模式Normal mode 输入vim命令后进入的就是普通模式. 2插入模式Insert mode 这是内容修改编辑的模式, 在普通模式进入插入模式方法 按i或insert 在 ...

  7. Python机器学习笔记:利用Keras进行分类预测

    Keras是一个用于深度学习的Python库,它包含高效的数值库Theano和TensorFlow. 本文的目的是学习如何从csv中加载数据并使其可供Keras使用,如何用神经网络建立多类分类的数据进 ...

  8. bootstrap3中container与container_fluid的区别

    .container与.container_fluid是bootstrap中的两种不同类型的外层容器,按照官方的说法,这两者的区别是: .container 类用于固定宽度并支持响应式布局的容器. . ...

  9. vb.net 发Mail

    Private Sub A1() '创建发件连接,根据你的发送邮箱的SMTP设置填充 Dim a As System.Net.Mail.Attachment Dim smtp As New Syste ...

  10. [javaEE] HTTP协议总结

    OSI网络7层协议 物理层 ==> 数据链路层 ==> 网络层ip ==> 传输层 TCP UDP ==>会话层 ==>表示层 ==> 应用层 HTTP FTP S ...