6 函数(一)

前面写的程序都是很小的,假设我们要编写一个很大的程序,并且要重复使用很多遍相同的代码,直观的想法,自然就是把这些代码装到一个“箱子”里,给这个“箱子”编上号,等到用的时候,告诉电脑“箱子”里面的就是所需要的代码。

函数就可以实现这样的功能。函数是Python中最主要也是最重要的代码组织和复用手段。

假设我们想求出两个数相加的结果,就可以写如下的函数:

In [1]: def add(x,y):

...: z = x + y

...: return(z)

其中def是声明函数的关键字,是必须要写的;add是函数的名称;在圆括号里面的x,y是参数,可以理解为数学函数的自变量,并且圆括号也是必须写的;z可以理解为函数的因变量;最后,我们通过return函数,将结果z输出来。

如果我们要求1+2,20+30的值,就可以这样写:

In [2]: add(1,2)

Out[2]: 3

In [3]: add(20,30)

Out[3]: 50

相当于我们把1和2代到自变量那里,就可以得到了结果。需要注意的是,add函数只有两个参数,如果带入参数的个数不为2,会引起错误:

In [4]: add(1,2,3)

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 add(1,2,3)

TypeError: add() takes 2 positional arguments but 3 were given

6.1 参数

从前面可以看到,参数相当于数学上函数的自变量。Python也有很多种参数的写法,通过不同的参数,可以实现不同的功能。位置参数

前面例子使用的参数就是位置参数。位置参数的位置很重要,比它的名称要重要得多。我们考虑下面两个函数:

In [5]: def divide1(a,b):

...: return(a/b)

In [6]: def divide1(b,a):

...: return(a/b)

我们定义了两个函数divide1和divide2,除了圆括号中参数a和b的位置,它们都是一样的。接下来我们把数字1和2带入:

In [10]: divide1(1,2)

Out[10]: 0.5

In [11]: divide2(1,2)

Out[11]: 2.0

在函数divide1里面,a和数字1的位置是一样的,此时a等于1;b和数字2的位置是一样的,此时b等于2。所以结果为1/2,即0.5。对于divide2来说,a等于2,b等于1,结果自然为2。关键字参数

如果参数个数很多的话,参数的位置我们很难记住。为了简化工作,我们也可以指定参数的名称:

In [12]: divide2(a=1,b=2)

Out[12]: 0.5

我们指定a的值为1,b的值为2,这样divide2的结果也是0.5了。

像这样使用名称指定的参数就是关键字参数,主要的优点是有助于澄清各个参数的作用,并且参数的位置不一样也不影响结果。

In [13]: divide2(b=2,a=1)

Out[13]: 0.5

关键字参数最大的优点是可以指定默认值。考虑新的函数divide3:

In [14]: def divide3(a=1,b=1):

...: return(a/b)

在这个函数里面,我们默认a和b的值为1,如果我们不往函数里面输入值的话,Python就按照a和b的值为1进行计算:

In [16]: divide3()

Out[16]: 1.0

但如果没有指定默认值,就会报错:

In [17]: divide2()

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 divide2()

TypeError: divide2() missing 2 required positional arguments: 'b' and 'a'可变参数

在前面我们知道,值的个数和参数个数不一样就会报错。但是如果在某个问题里面,参数个数是不固定的怎么办。这就要用到可变参数了。

我们考虑求几个数的和,但数字的个数是不固定的。

如果我们括号里面写成位置参数,只需要定义一个参数,然后在参数前面写个*号:

In [22]: def add2(*number):

...: sum = 0

...: for i in number:

...: sum = sum + i

...: return(sum)

In [23]: add2(1,2,3)

Out[23]: 6

In [24]: add2(1,2,3,4)

Out[24]: 10

工作原理是这样的:Python把我们输入的任意的参数转化为元组,我们利用元组的操作,就可以得到结果了。

对于关键字参数,需要在参数前面写**号:

In [25]: def add3(**number):

...: sum = 0

...: for i in number.values():

...: sum = sum + i

...: return(sum)

...:

...:

In [26]: add3(a=1,b=2,c=3)

Out[26]: 6

Python把我们输入的关键字参数转化为字典,其中参数名称为字典的键,参数值为字典的值。我们再利用字典的相关操作,就可以得到结果了。

需要注意的是,这两种可变参数不可混用,否则会报错:

In [27]: add2(a=1,b=2,c=3)

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 add2(a=1,b=2,c=3)

TypeError: add2() got an unexpected keyword argument 'a'

In [28]: add3(1,2,3)

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in ()

----> 1 add3(1,2,3)

TypeError: add3() takes 0 positional arguments but 3 were given参数组合

前面介绍的几种参数是可以混用的,但是顺序是固定的,必须是(从前往后):位置参数、关键字参数、可变参数(对应位置参数)、可变参数(对应关键值参数),在使用函数的时候,Python自动按照参数位置和参数名把参数带入到函数里面。

考虑如下的函数:

In [29]: def f1(a,b,c=1,*args,**kw):

...: print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

这个函数里面有五个不同类型的参数,并分别输出参数结果。对于不同的赋值方式,也就有不同的结果:

In [30]: f1(1,2,3,4,5)

a = 1 b = 2 c = 3 args = (4, 5) kw = {}

In [31]: f1(1,2,3,4,e = 5)

a = 1 b = 2 c = 3 args = (4,) kw = {'e': 5}

In [32]: f1(1,2,3)

a = 1 b = 2 c = 3 args = () kw = {}

6.2 返回多个值

这也是Python一个比较特别的功能。在前面的例子当中,函数的结果只有一个,但我们也可以输出多个结果。记得没错的话,R语言并没有这样的功能,对于R语言来说,如果要输出多个结果,需要把这些结果聚合到一个数据结构里面,在返回这个数据结构。参见下面的例子:

In [33]: def ff(a,b):

...: return(a+b,a-b)

In [34]: ff(1,2)

Out[34]: (3, -1)

只需要在return函数里面写上多个值,函数就可以输出多个结果。

python3.4教程_Python教程(四)相关推荐

  1. python九九乘法表教程_python教程九九乘法表

    刚学数学乘法,首先就是要背诵九九乘法表,想必现在没人不会背诵了吧,而现在还有很多家长在催促着自己的孩子学习九九乘法表,但要是将其做成一个表格,是不是就很容易了呢?今天小码王少儿编程培训机构就为大家分享 ...

  2. python导入模块教程_Python教程——导入自定义模块

    #Python 教程 -- 导入自定义模块 导入自定义模块之前我们先创建一个自己的模 块,功能可以随便写,比如下面所示定义了两个功能模块,一个是输出调用的名字, 一个是计算九九乘法表 在项目下创建一个 ...

  3. python搭建环境教程_python教程(一)·python环境搭建

    如前所述,python是一种解释语言,需要一个翻译,或者虚拟机,将python代码并运行它.因此,我们需要一个翻译,现在去官方网站.或者使用一个搜索引擎,如百度搜索,搜索关键字\u201Cpython ...

  4. python绘制分形图形教程_Python教程之绘制Mandelbrot集合

    原标题:Python教程之绘制Mandelbrot集合 一. 分形与混沌 自然界的很多事物,如树木.云彩.山脉.雪花.海岸线等,都呈现出传统几何学所不能描述的形状,这些形状都有如下的特性: 有着十分精 ...

  5. 手机python教程_python教程下载

    python教程是一款非常实用的python编程学习软件平台,这里有着超多实用python课程,帮助小白学习python编程,了解各种函数以及代码运用,这里的课程非常完善,覆盖了基础框架,函数设计,文 ...

  6. python代码编辑教程_python教程:pycharm编写代码的方式教学

    python可以说是新的编程语言,虽说是新编程,但一出来,就受到很长程序员的关注,而且刚出现和java进行对比,很多人就拿python和java进行比较,想python到底好不好,他和java有什么区 ...

  7. python数据库教程_python教程:数据库

    在web开放中,经常会把一些数据存储起来.这时你可以选择数据库.常见的数据库有 mysql.oracle.sql server.mongodb等.今天我介绍下用python如何操作数据库. 工具/原料 ...

  8. pythonnumpy教程_Python教程:numpy的基本介绍

    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3],需要有3个指针和三个 ...

  9. python读取json数据教程_Python教程之解析json数据

    这里先说一下什么是json,其实json是一种跨语言通用的数据格式,它的本质是一个字符串,然而几乎所有的计算机语言都可以将这种json格式的数据转为自己能使用的数据类型,例如在PHP中json字符串可 ...

最新文章

  1. python 时间戳 字符串_python time模块 字符串 时间戳互转
  2. Vue子组件与父组件之间的通信
  3. 2d 背包_和平精英:小黄脸表情头套和背包上架,这个价格真的值得买吗?
  4. iOS CoreTelephony框架介绍与使用案列
  5. 【学习笔记】我命由天不由我之随机化庇佑 —— 爬山法 和 模拟退火法
  6. https开头的网址是什么意思_我想打这个面试官,他给我挖坑,问我:URI中的 “//” 有什么用?...
  7. wpgcms---列表页数据渲染
  8. YYKit源码学习——YYMemoryCache
  9. 【图解算法】最小生成树
  10. java阿里云短信验证码发送
  11. 斐讯路由器k2编程器救砖教程
  12. 股票行情图的绘制,分时图和闪电图
  13. C++中cin,cin.get()和cin.getline()的区别
  14. 利用K8S技术栈打造个人私有云(连载之:私有云客户端打造)
  15. 百度服务器状态异常,百度抓取异常连接超时是什么意思
  16. 硬件改造:新型涂鸦智能暖风机!
  17. 激活后服务器无限重启,服务器无限重启
  18. 例题5-3 安迪的第一个字典 UVa10815
  19. 博士毕业答辩会上的感言——余子濠
  20. 网络舆情信息工作怎么做的解决方案

热门文章

  1. Blender图解教程:高仿版超级马里奥(一)帽子建模(附模型下载)
  2. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]路由交换部分答案详解
  3. IDEA的主题样式20种
  4. Swoole WebSocket服务使用Task任务详解 (面向对象方法)
  5. java modbus 规约_Modbus RTU的规约详细资料详解
  6. ubuntu20.04+noetic Roboware 安装问题
  7. 从零开始做手机云台/稳定器
  8. 【数理统计】学习笔记05:区间估计
  9. PAT 10341114(并查集)
  10. [又值奥运季] 2016年里约奥运会--8月6日赛事