洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数
函数文档
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模块,形参,实参,默认参数,关键字参数,收集参数,位置参数的更多相关文章
- C语言函数库帮助文档
C语言函数库帮助文档 安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo ap ...
- cmd命令查看Python模块函数等帮助文档和介绍
dir函数式可以查看对象的属性 使用方法很简单,举os类型为例,在Python命令窗口输入 dir(‘os’) 即可查看os模块的属性 打开cmd命令窗口 输入python(注意:计算机需要有Py ...
- R自动数据收集第二章HTML笔记1(主要关于handler处理器函数和帮助文档所有示例)
本文知识点: 1潜在畸形页面使用htmlTreeParse函数 2startElement的用法 3闭包 4handler函数的命令和函数体主要写法 5节点的丢弃,取出,取出标签名称.属性.属 ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...
- jQuery 效果函数,jquery文档操作,jQuery属性操作方法,jQuerycss操作函数,jQuery参考手册-事件,jQuery选择器
jQuery 效果函数 方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选元素的所有排队函数( ...
- 在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)
在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套 ...
- 使用sphinx自动提取python中的注释成为接口文档
写好了代码,交付给他人使用的时候,查看代码固然可以了解各类和函数的功能细节,但接口文档能更方便的查找和说明功能.所以,一价与代码同步的接口文档是很有必要的.sphinx可以根据python中的注释,自 ...
- python开发_xml.dom_解析XML文档_完整版_博主推荐
在阅读之前,你需要了解一些xml.dom的一些理论知识,在这里你可以对xml.dom有一定的了解,如果你阅读完之后. 下面是我做的demo 运行效果: 解析的XML文件位置:c:\\test\\hon ...
- 三言两语聊Python模块–文档测试模块doctest
doctest是属于测试模块里的一种,对注释文档里的示例进行检测. 给出一个例子: splitter.pydef split(line, types=None, delimiter=None): &q ...
- python 使用win32com实现对word文档批量替换页眉页脚
最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的.就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这 ...
随机推荐
- 对话Task
上一篇简单讲解了 线程和线程池以及上下文切换.创建线程代价高昂,默认每个线程都要占用大量虚拟内存1M.更有效的做法使用线程池,重复利用线程.在.NET4.0中引入了TPL任务并行库,你可以在将精力集中 ...
- IDA远程调试 在内存中dump Dex文件
1. 首先使用调试JNI_OnLoad函数的方法,先将apk以调试状态挂起,使用IDA附加上去. 2. 然后在libdvm.so中的dvmDexFileOpenPartial函数上下一个断点 3. 然 ...
- Spring Boot + Spring Cloud 构建微服务系统(一):服务注册和发现(Consul)
使用Consul提供注册和发现服务 什么是 Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul ...
- vue里碰到 $refs 的问题
记录困惑自己一个简单的问题...(瞬间感觉官方文档的强大) 在自己做的一个项目中,遇到一个列表页,根据id能进入详情页(动态匹配路由),详情页是单独的一个组件,在这个详情的组件里,我想获取内容给你区域 ...
- java界面设计(swing)
1.Swing基本组件 窗体控件 JFrame.容器控件 JPanel .标签控件 JLabe.按钮控件 JButton.文本框控件 JTextField 与 JTextArea(注意JScrollP ...
- [转]docker-compose教程(安装,使用, 快速入门)
本文转自:https://blog.csdn.net/pushiqiang/article/details/78682323 教程基于ubuntu下最新的compose版本3 参考: https:// ...
- sort、sorted高级排序-Python3.7 And 算法<七>
1.sort(*, key=None, reverse=False) sort()接受两个参数,这两个参数只能通过关键字(关键字参数)传递. 参数key:带一个参数的函数(排序时,会依次传入列表的每一 ...
- [PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100000000 ...
- 【Java深入研究】8、Java中Unsafe类详解
java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法all ...
- GDB使用技巧
最近使用GDB比较多,发现除了最常用的run.break.continue.next等命令的基本用法外,还有一些非常有用的命令和用法,能让你更加得心应手地使用GDB,在这里做了一下简单的总结. 1. ...