首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

0基础学Python之十:函数初探(上)

Hi 大家好,我是王可乐,欢迎大家和我一起 0 基础学 Python。前面几节课程,可乐给大家介绍了数据类型,字符串等相关的内容。

在前面的课程中,我们虽然还没有深入讲解,但是大家已经看到过不少函数的例子。例如,在讲字符串的内容时,可乐提到了我们能用 Python 的内置函数 print() 来打印字符串,可以用内置函数 ord() 和 chr() 来进行字符和编码的转换,并且我们还可以调用不少字符串类型支持的函数,例如 startswith()、count() 等来进行字符串操作。也许大家会有疑问,那么函数究竟是什么呢?我又该怎么知道有哪些函数可以用呢?今天,可乐就来给大家讲解一下 Python 中函数的初步知识。

一听到函数,可能大家的第一反应是咱们从中学就开始学习的数学函数。常见的数学函数表达式是 y = f(x),其中,x 是函数的输入值,f 是函数的代号,而 y 则是函数运算后的输出值。根据不同的 x,计算出不同的 y,并且在平面直角坐标系中画图,这应该是大家对中学数学印象深刻的记忆之一。事实上,编程语言中函数的概念,和中学数学中所提到的函数概念有异曲同工之处。

简单地说,编程语言中的函数,实际上是一个代码片段。它的存在主要是为了满足几个需求:

第一、代码的重用。在我们的日常工作中,有很多工作是重复性的,这些工作往往能通过制作专门的工具,或者由专人负责来提高效率。比如说:洗衣机就是针对洗衣服这个重复性工作而设计的机器。我们在写代码的时候也是这样,有很多代码片段实现的功能,我们可能会重复用到。这种情况下,我们可以把代码放到函数里,任何地方,甚至是别人需要用到这个功能时,直接调用函数就可以了。

第二,封装性。封装性也是使用函数带来的一个好处。设想一下,我们在使用洗衣机的时候,不需要知道洗衣机是怎么设计的,只需要知道面板上的按钮怎么操作,就能使用洗衣机愉快地洗衣服了。我们在使用函数的时候也是这样,只需要知道函数需要输入什么数据,以及输出结果的含义怎么理解就可以了,不需要理解函数内部的逻辑。这样,我们就更容易快速地利用别人的成果,站在巨人的肩膀上,写出满足自己功能需求的程序 。

第三,由于前两个特性,有效使用函数的程序,会更加易于维护和更新。这对于程序员来说真是太重要了。设想一个场景,假设你平均每天写100行代码,要知道,这已经是一个非常高产的程序员了哦,一个月就得写两千多行代码。结果一个月后,你已经忘记了之前自己是怎么写的这些代码了。不要惊讶,这种事情常常发生哦。但是如果你之前的代码逻辑都被划分成了一个个函数,每个函数又有比较好的注释的话,那么你在看自己之前的代码时会感觉轻松愉快。否则,你可能会有一种想掐死自己的冲动 :-) 自己的代码自己都看不懂,更别说让别人来维护你的代码了。

好了,说了那么多,我们先来自己写一个小函数试试看吧:

这个函数非常简单,我们再来看一下。首先,def 是一个关键词,告诉 Python 我们将要开始定义一个函数;随后,add3 是函数名,大家可以自己定义,和变量命名的规则一样,可以使用字母、数字、下划线,由于下划线开头的函数名在 Python 里通常有特殊的作用,所以我们一般以字母开头。这里,我们给函数起名叫 add3,就是三个数相加的意思。函数名后面的括号里是函数的参数,a, b, c 被称为形式参数,简称形参。在这个例子里,我们的函数接受三个参数。

注意右括号后的冒号。和 IF 语句、WHILE 语句、FOR 语句等类似,冒号意味着后面的代码需要缩进,我们还是用四个空格作为缩进。函数内部的代码称作函数体,这个函数的函数体里只有一条语句,就是返回传入的三个参数的和。关键字 return 意味着把后面表达式的值作为返回值,返回给函数调用方。另外要注意的是,如果是在 Python Shell 里测试写函数,在函数定义输入完成之后,要再打一个回车,出现三个尖括号提示符才算函数定义完毕。

定义好函数后就可以使用了。我们的例子里,调用 add3 函数时传入了参数 1,2,3。这些参数被称为实际参数,简称实参。调用函数后,实参会赋值给对应的形参,也就是 1 赋给 a,2 赋给 b,3 赋给 c。大家可以看到,函数返回了 6,符合我们的预期。

除了按照顺序将实参赋予形参,我们还可以直接使用形参的名字来进行参数传递。例如我们的 add3 函数还可以这样使用:

我们直接在传递参数时使用形参的名字来赋值,使得参数传递的情况更加清晰了。值得注意的是,使用这种参数传递方式,我们可以忽略函数定义中形参的顺序,使用起来更加灵活。

此外,Python 函数还有一些其他有用的特性。

首先,函数可以设置默认参数。比如说咱们的这个函数例子里,需要传入三个参数,a, b, c,但是在某些场景中,某个参数并不常变化,这样我们可以在定义函数时,设置一个默认参数。即,如果这个参数有数据传入,则在函数计算时使用传入的值,否则就使用默认的值。我们再来看一个例子,这次我们只稍稍修改一下 add3 函数:

在上面的新函数 add3 中,我们通过在参数列表中指定 c=10 来设置参数 c 的默认值为 10。然后,我们在调用函数的时候,可以只传入两个数值,对应a, b两个变量,此时函数默认 c 的值就是 10。而如果我们调用函数的时候传入三个参数,1, b=2, c=3,那么函数就会使用我们传入的数字 3 作为 c 的值了。

函数的所有参数都可以有默认值,但是我们在定义函数默认值的时候,必须遵循从后向前的原则。即,有默认值的参数后面不能出现没有默认值的参数。比如,我们在 add3 这个函数里定义里,如果 c 没有默认值,而 b 有默认值的话,函数定义时 Python 解释器会报错。

我们看到,这里发生了一个语法错误,Syntax Error。

接下来,可乐给大家介绍一个程序设计中的重要概念:作用域。我们先来看一个例子。

大家可以看到,虽然函数体里并没有定义变量 d,但这段代码Python解释器没有报错,说明解释器认为这是一段语法正确的代码。显然函数在计算时使用了我们在函数外部定义的 d = 10,最终,a+b+c+d = 24,也符合大家的预期。现在我们来修改一下函数。

这段代码片段中,总共有两个变量 d。一个是函数外部定义的变量 d,值为 10;另一个是我们给函数 add4 增加的参数 d,这里 d 的默认值是 0。当我们用参数 a = 1, b = 3 来调用 add4 函数时,显然 add4 返回了 1, 3, c=10 和 d=0 四个数的加和,也就是 14。这时,我们在函数外部定义的变量 d 并没有发挥作用。

在 Python 里,我们把上面 d=10 这样的变量称为全局变量。全局变量的作用域是定义语句之后的整个程序。它能在所有在它后面定义的函数中访问。所以在第一段代码中,尽管 add3 函数中并不存在 d,但是在 add3 函数中还是能访问已经定义好的全局变量 d = 10。

但是,函数 add4 有一个名为 d 的参数,这个 d 被称为局部变量,他的作用域是这个函数内。在这个作用域里,局部变量 d 的优先级比全局变量 d 要高。所以在 add4 函数里,参加返回值 a+b+c+d 计算的 d 为 0。而在函数外访问变量 d 时,d 仍然为 10。

这就是编程中的作用域问题,它不仅存在于函数中,也存在于一切有缩进的语法里,如条件语句,循环语句等。这方面的细节可乐后续还会讲到。大家在后续编程的过程要非常注意作用域的问题,不然可能会出现一些奇怪的 Bug。可乐的建议是,大家在给变量取名的时候要特别小心,避免出现两个重叠的作用域中出现两个相同名字变量的问题。

最后,上面这些函数里,return 后面的表达式是函数的返回值,每次调用时函数都会把返回值返回。注意,只要一执行到 return 语句,函数就会立即返回。也就是说如果你在 return 语句后面还写了其他语句,这些语句是执行不到的。

如,这个例子,“We cannot get here.” 这句话是无法打印出来的,因为函数在此之前已经通过return 语句返回了。此外,函数还可以不返回任何东西。如果你调用一个不返回值的函数来给一个变量赋值,那么这个变量最后会是 None,即,函数没有返回任何内容。另一方面,函数其实也可以返回多个值,只需要用逗号分隔即可,返回的多个值会被保存在一个元组中。

好了,本节课的内容我们就先介绍到这里。今天我们初步地讲解了函数相关的知识,包括函数的作用,函数的参数,变量的作用域,函数的返回值等。今天下课以后,希望大家试着自己写一写小的函数,实践一下参数默认值,函数返回值等知识点。

下节课开始,可乐会为大家讲一些有趣的复杂数据类型。欢迎大家关注我们的公众号“可乐编程”,如果你觉得课程内容比较有趣,请转发给你的朋友们哦,可乐感谢大家的支持,我们下次课再见!

往期课程:

《0基础学Python之九:循环语句(下)》

《0基础学Python之八:循环语句(上)》

《0基础学Python之七:条件语句》

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180403G1NNMF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券