每天一小时python官方文档学习(三)————函数
上一天看到第四章的一半,介绍了一些常用的流程控制工具,也就是常用语句,主要是if
、for
、range()
、break
、continue
、else
和pass
。今天把第四章剩下的看完,讲的是如何在python中定义和使用函数。函数其实就是一种对代码的封装,对于一段完成某种功能的代码,如果需要在程序中多次用到这个功能,不使用函数的话,就要写多次相同的代码,很麻烦;如果使用函数的话,定义函数只需要一次,往后每次需要使用这个函数的话调用就行了,即实现了代码重用,简便很多。
4.6. 定义函数
python中,我们使用关键字 def
引入一个函数定义。它必须后跟函数名称和带括号的形式参数列表。构成函数体的语句从下一行开始,并且必须缩进。
函数体的第一个语句通常是注释或者帮助文档,用三引号‘’‘ ’‘’
括起来,里面应该写上函数的功能和各参数的意义等等,是面向用户的。在notebook里面使用help()
就可以查看到这些信息。写帮助文档是一个应该养成的好习惯。
函数调用(执行)则是直接运行函数名,如果有参数则写在括号内,一个用于输出斐波拉契数列的函数例子如下:
>>> def fib(n): # 函数定义
... """函数功能:打印n以内的斐波拉契数列"""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
>>> # 函数调用
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
定义了的函数是一个特定的类型,它也支持重命名,如下f和fib就是同一个函数了:
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
学过其他语言的人可能会问,python的函数有返回值吗?答案是肯定的,我们可以用return
语句返回指定的值,如果像上面的例子一样没有return
呢?实际上也有返回值,只不过是一个None
而已,使用print()
就可以看到它了。
总结一句:return
语句会从函数内部返回一个值。 不带表达式参数的 return
会返回 None
。 函数执行完毕退出也会返回 None
。
>>> fib(0)
>>> print(fib(0))
None
最后我们改写上面的斐波拉契函数,不是直接打印print()
,而是先调用函数返回return
一个列表,再打印这个列表:
>>> def fib2(n): # 函数定义
... """函数功能:返回一个列表,里面包含了n以内的斐波拉契数列"""
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a) # 向列表新增一个数据
... a, b = b, a+b
... return result
...
>>> f100 = fib2(100) # 函数调用
>>> f100 # 打印结果
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
4.7. 函数定义的更多形式
4.7.1. 参数默认值
最有用的形式是对一个或多个参数指定一个默认值。这样创建的函数,可以用比定义时允许的更少的参数调用,比如:
def ask_ok(prompt, retries=4, reminder='Please try again!'):while True:ok = input(prompt)if ok in ('y', 'ye', 'yes'): # in关键字可以测试一个序列是否包含某个值return Trueif ok in ('n', 'no', 'nop', 'nope'):return Falseretries = retries - 1if retries < 0:raise ValueError('invalid user response')print(reminder)
这个函数可以通过几种方式调用:
- 只给出必需的参数(参数prompt):
ask_ok('Do you really want to quit?')
- 给出一个可选的参数(参数prompt和retries):
ask_ok('OK to overwrite the file?', 2)
- 或者给出所有的参数(参数prompt、retries和reminder):
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
有两点需要注意!!
一、默认值是在 定义过程 中在函数定义处计算的,所以以下结果会打印5而不是6:
i = 5def f(arg=i): # 此处传入默认值i,所以arg=i=5print(arg)i = 6 # 不影响f的默认值
f()
二、默认值只会执行一次。这条规则在默认值为可变对象(列表、字典以及大多数类实例)时很重要。比如,下面的函数会存储在后续调用中传递给它的参数:
def f(a, L=[]):L.append(a)return Lprint(f(1))
print(f(2))
print(f(3))
打印结果为:
[1]
[1, 2]
[1, 2, 3]
如果你不想要在后续调用之间共享默认值,你可以这样写这个函数:
def f(a, L=None):if L is None:L = []L.append(a)return L
打印结果为:
[1]
[2]
[3]
4.7.2. 关键字参数
4.7.3. 特殊参数
这两节已经在我之前的文章中介绍过了,感兴趣的小伙伴可以去看看:
python函数参数那些事,关键字参数与位置参数
4.7.4. 任意的参数列表
最后,最不常用的选项是可以使用任意数量的参数调用函数。这些参数会被包含在一个元组里(参见 元组和序列 )。在可变数量的参数之前,可能会出现零个或多个普通参数。:
def write_multiple_items(file, separator, *args):file.write(separator.join(args))
一般来说,这些可变参数 将在形式参数列表的末尾,如上面代码中的*args
参数(和C语言区分一下,注意不是指针)。因为它们收集传递给函数的所有剩余输入参数,简单来说,就是捡破烂的,剩下的参数都归他了。
但也有例外,它不在参数列表的末尾。此时,出现在 *args
参数之后的任何形式参数都是 仅关键字参数,也就是说它们只能作为关键字参数而不能是位置参数:
>>> def concat(*args, sep="/"):
... return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
4.7.5. 解包参数列表
如果我们的参数已经在列表或元组里了,但是想把里面的元素作为单独的参数传入函数,应该怎么做呢?此时称为对参数列表进行解包。
例如,内置的 range()
函数需要单独的 start
和 stop
参数。如果它们不能单独使用,可以使用 *
操作符 来编写函数调用以便从列表或元组中解包参数:
>>> list(range(3, 6)) #正常的调用,向range函数传入两个单独的参数3和6
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args)) #解包调用,从列表args中解包出数字3和6,再传入range函数
[3, 4, 5]
如果参数在字典里,则用**
操作符解包出字典的值value,来提供关键字参数:
>>> def parrot(voltage, state='a stiff', action='voom'):
... print("-- This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.7.6. Lambda 表达式
可以用 lambda
关键字来创建一个小的匿名函数。Lambda函数可以在需要函数对象的任何地方使用。它们在语法上限于单个表达式。从语义上来说,它们只是正常函数定义的语法糖。与嵌套函数定义一样,lambda函数可以引用所包含域的变量。
简单来说,Lambda函数有两个作用:返回一个函数,或者传递一个小函数作为参数。
作用1:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
作用2:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.7. 文档字符串
4.7.8. 函数标注
这两节介绍的是关于函数帮助文档和注释内容和格式的一些约定,这里不详细展开了。
每天一小时python官方文档学习(三)————函数相关推荐
- 每天一小时python官方文档学习(一)————python的简单介绍
我们都知道,python的官方文档写得十分详尽,也是每一个学习python的人都绕不开的. 所以从今天开始,我每天都会用一小时学习python的官方文档,按照文档目录的顺序,摘录一些有用的语句,写下一 ...
- 每天一小时python官方文档学习(七)————模块与包
6. 模块 模块是一个包含Python定义和语句的文件,实际上就是一个正常的.py文件.但是作用和普通需要运行的程序不一样,它实际上有点像函数.如果说函数实现了代码的重用,模块则是实现了函数的重用.我 ...
- 每天一小时python官方文档学习(四)————数据结构之列表
终于进入到第五章数据结构部分了,python中常用的容器有列表.元组.集合和字典,今天主要了解的是最为常用的列表. 5. 数据结构 5.1. 列表的更多特性 对于列表的操作有很多,具体操作看官方文档就 ...
- 每天一小时python官方文档学习(六)————循环和条件控制的进阶用法
学习完数据结构之后,我们就能够对之前在第二天中讲过的流程控制工具,添加更多的用法了,这里主要介绍的是for循环语句和if与while条件判断语句. 5.6. 循环的技巧 我们学过的遍历序列for i ...
- 每天一小时python官方文档学习(五)————数据结构之元组、集合与字典
昨天介绍完了最常用的列表,之后就是次常用的元组.集合与字典了. 5.3. 元组和序列 元组和之前讲过的列表有很多共同特性,例如索引和切片操作.实际上,他们是 序列 数据类型(list, tuple, ...
- 每天一小时python官方文档学习(二)————流程控制工具
4. 其他流程控制工具 4.1. if 语句 大多数人都很熟悉的if语句: if condition1:pass elif condition2:pass else condition3:pass 注 ...
- python文档整理,Python官方文档内置函数整理Word版
<Python官方文档内置函数整理Word版>由会员分享,可在线阅读,更多相关<Python官方文档内置函数整理Word版(6页珍藏版)>请在人人文库网上搜索. 1.传播优秀W ...
- Python官方文档学习心得(第五篇)
1.模块 一个模块是包含 python 定义和语句的文件.文件名称是由模块名加上后缀名.py 组成的.在 模块中,模块的名字(可以作为一个字符串)是一个作为全局变量_name_的值的变量 fibo是模 ...
- Python官方文档学习心得(第三篇)
1.定义方法 关键字 def 是方法定义的标志.接下来紧跟方法名和被圆括号所包围的参数列表.方法的主 体语句将在下一行开始并且必须缩进. 方法主体的首句可选择性地是一句字符,用来说明方法的主要功能 例 ...
最新文章
- Android调试错误-No resource identifier found for attribute 'showAsAction'
- centos7 yum 安装 redis
- TCP/IP总结(4)TCP之4次挥手
- 使用Memcached提高.NET应用程序的性能
- 【C语言简单说】三:变量总结ASCII码扩展(5)
- 上海教师计算机等级要求,计算机考试阅卷教师谈等级考试
- C#面向对象设计模式第二讲:Singleton Pattern单件模式(创建型模式)
- arm b bl 地址无关码_32位和64位下的arm_pwn初探
- 信息学奥赛一本通(1210:因子分解)
- 算法科普:有趣的霍夫曼编码
- 机器学习笔记——逻辑回归(Logistic Regression)
- Poj2826 An Easy Problem
- 论文笔记_S2D.46_2013-3DV_基于点融合的动态场景实时三维重建
- mysql redo 结构_MySQL redo log 格式解析
- 资产配置神器--美林时钟帮你获取超额收益
- 禅道 upgrade.php,zentao禅道安装升级
- Discuz!安全防护之注册机防护插件免费发布
- 树莓派3强大很多--相比树莓派2
- xml文件导入wps_#WPS表格怎么导入XML数据?#excel怎样导入wps表格数据
- 国密SM3加密算法工具类(非对称)
热门文章
- C# DataTable笔记
- 哪一个不是linux常用的shell,Linux下查看使用的是哪种shell的方法汇总
- oracle 网关下载,oracle透明网关访问sqlserver2000
- java中 有没有方法将浏览器标签栏去掉_用JS去掉IE窗口的标题栏,工具栏,地址栏...
- c语言创建新指针,如何用c语言创建一个指针
- nx二次开发c语言,NX二次开发-UFUN API函数编程基础
- 软件配置管理(四)代码味道与重构
- linux怎么看是否安装kde桌面,ubuntu 7上安装kde桌面
- NP完全性理论与近似算法
- 国庆中秋活动——超强AR/3D地球仪!带你领略世界风光!我们未必能环游世界,但都该有个地球仪