• #1 为什么需要函数?">#1 为什么需要函数?
  • #2 函数的定义">#2 函数的定义
    • #2.1 语法">#2.1 语法
    • #2.2 实例">#2.2 实例
  • #3 函数的调用">#3 函数的调用
    • #3.1 语法">#3.1 语法
    • #3.2 实例">#3.2 实例
  • #4 传递参数">#4 传递参数
    • #4.1 位置参数">#4.1 位置参数
    • #4.2 关键字参数">#4.2 关键字参数
    • #4.3 默认参数">#4.3 默认参数
  • #5 <font style="color:rgb(71, 101, 130);">return</font> 语句">#5 <font style="color:rgb(71, 101, 130);">return</font> 语句
  • #6 总结">#6 总结
  • #7 练习题">#7 练习题

    10函数 - 图1

    首页

    课程地图 成长学园 创意集市 高校合作 企业服务 技术服务

    学习教程

    今天我们开始函数的学习,在函数内容开始之前,我们先来复习上一关集合的内容:

    10函数 - 图2

    下面,我们正式开始函数的学习: 在 Python 中,函数是一组相关的语句,这些语句完成一个特定的任务。为了完成任务,我们只要调用相应的函数即可。在前面的章节中,对内容进行打印的 <font style="color:rgb(71, 101, 130);">print()</font> 就是一个函数,它的作用是将内容打印到屏幕上。

    #1 为什么需要函数?

    假设你编写了可以完成某个特定任务的一组代码,记为 <font style="color:rgb(71, 101, 130);">block A</font>。随着开发的推进,你发现 <font style="color:rgb(71, 101, 130);">block A</font> 在很多地方都能用到。这时候,你该怎么办?一种简单粗暴的解决方案便是将 <font style="color:rgb(71, 101, 130);">block A</font> 复制粘贴到需要的地方。过了一段时间之后,你发现需要对 <font style="color:rgb(71, 101, 130);">block A</font> 进行改动,改动的原因可能是发现了 bug,也可能是想优化 <font style="color:rgb(71, 101, 130);">block A</font>。这时候,如果 <font style="color:rgb(71, 101, 130);">block A</font> 的副本散落在程序的各个角落,你需要对每一处的 <font style="color:rgb(71, 101, 130);">block A</font> 进行修改。这种修改方式不仅易于出错,而且容易引入难以发现的 bug。另外,对于后期的程序维护来说简直就是噩梦。 一种比较好的解决方案是定义一个函数来完成指定的任务。函数的定义完成后,在程序的任何地方如果需要完成相同的任务,只需要调用函数即可。如果以后的某个时间点,需要优化完成任务的方法,只需要在一处进行更改,也就是定义函数的地方。函数的定义修改之后,其他调用函数的地方会随之更改。效率大大提升,而且不容易出错。 下面,我们一起来认识下函数,首先呢,我们先来学习下如何定义函数:

    #2 函数的定义

    #2.1 语法

    10函数 - 图3

    1. 关键字 <font style="color:rgb(71, 101, 130);">def</font> 标识函数头的开始。
    2. <font style="color:rgb(71, 101, 130);">function_name</font> 为函数名,命名规则和变量相同。
    3. <font style="color:rgb(71, 101, 130);">parameters</font> 以逗号分隔的参数列表,用来接收传递给函数的值,参数列表是可选的。虽然参数列表是可选的,但是函数名后面的括号是必须的。
    4. <font style="color:rgb(71, 101, 130);">:</font> 标识函数头的结束。
    5. <font style="color:rgb(71, 101, 130);">statement(s)</font> 组成函数体的一条或多条语句,这些语句必须是相同的缩进(一般是缩进 4 个空格)。
    一般我们看到关键字 <font style="color:rgb(71, 101, 130);">def</font> 开始的语句,就表示这是一个函数。我们来看一个实例:

    #2.2 实例

    我们借用大禹治水的故事来学习函数。 很久很久以前,洪水经常泛滥。大水淹没了田地,冲毁了房屋,毒蛇猛兽到处伤害百姓和牲畜,人们的生活痛苦极了。 洪水给百姓带来了无数的灾难,必须治好它。当时,一个名叫鲧的人领着大家治水。他只知道筑坝挡水,九年过去了,洪水仍然没有消退。他的儿子禹继续治水。 禹离开了家乡,一去就是十三年。这十三年里,他到处奔走,曾经三次路过自己家门口。可是他认为治水要紧,一次也没有走进家门看一看。 禹吸取了鲧治水失败的教训,采取疏导的办法治水。他和千千万万的人一起,疏通了很多河道,让洪水通过河道,最后流到大海里去。洪水终于退了,毒蛇猛兽被驱赶走了,人们把家搬了回来。大家在被水淹过的土地上耕种,农业生产渐渐恢复了,百姓重新过上了安居乐业的生活。 我们现在定义一个函数 <font style="color:rgb(71, 101, 130);">greet()</font>,函数语句为打印大禹治水。 函数定义语句如下:
    1. def greet():
    2. print("大禹治水")
    1
    2 我们现在只是定义函数,运行上述语句是没有任何结果显示的,如果想打印出函数定义的语句内容 <font style="color:rgb(71, 101, 130);">print("大禹治水")</font>,则需要调用函数。也就是说,关于函数的使用,包含两个步骤,第一步是定义函数,第二步是在函数定义好之后,调用函数,我们一起继续来看下函数是如何被调用的?

    #3 函数的调用

    我们先来看下函数调用的语法规则:

    #3.1 语法

    1. function_name(parameters)
    1

    <font style="color:rgb(71, 101, 130);">parameters</font> 为传递给函数的值,是可选的。即便不需要传递值给函数,函数名后的括号也是必须的。

    #3.2 实例

    我们再来看下定义的函数 <font style="color:rgb(71, 101, 130);">greet()</font>,按照函数调用的语法,只需要在定义函数语句之后,使用调用函数语句 <font style="color:rgb(71, 101, 130);">greet()</font> 即可完成函数的调用,运行下方语句,看下运行效果:
    1. def greet():
    2. print("大禹治水")
    3. greet()
    1
    2
    3
    4 我们看到结果显示出了大禹治水这四个字,表示我们完成了对函数 <font style="color:rgb(71, 101, 130);">greet()</font> 的调用。 我们在函数定义和函数调用的介绍中,都提到了函数的参数,下面,我们就一起来了解下,如何进行函数参数的传递。

    #4 传递参数

    虽然不带参数的函数也可以完成某些特定任务,但是,大多数时候,我们需要给函数传递值,这样的话,每次调用函数的行为都会因为传递的值不同而变得不同。 参数的传递分为不同的情况,我们现在就为大家逐一介绍各种情况:

    #4.1 位置参数

    我们先来看下位置参数,所谓的位置参数,就是表示参数的位置对于函数的结果是有影响的,同样的参数值,在不同的位置,会有不一样的结果表达,我们一起看下方实例: 因为古人大禹治水的成功,才使得子孙后辈进入到了美好的生活中。 小明妈妈让小明去买 6 个香蕉,共花费了 5.74,我们一起来看下,如果用函数实现上述信息的输出,该如何实现呢?我们运行下方语句:
    1. def cal(qty, item,price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(6, 'bananas', 5.74)
    1
    2
    3
    4 我们首先定义了一个函数 <font style="color:rgb(71, 101, 130);">cal()</font>,函数 <font style="color:rgb(71, 101, 130);">cal()</font> 中有三个参数,分别是参数 <font style="color:rgb(71, 101, 130);">qty</font>、参数 <font style="color:rgb(71, 101, 130);">item</font> 和参数<font style="color:rgb(71, 101, 130);">price</font>,当调用函数 <font style="color:rgb(71, 101, 130);">cal()</font> 时,传递三个参数的值 <font style="color:rgb(71, 101, 130);">6,'bananas',5.74</font> 给函数,最终运行结果为 <font style="color:rgb(71, 101, 130);">6 bananas cost $5.74</font>

    10函数 - 图4

    小贴士: <font style="color:rgb(71, 101, 130);">print(f'{qty} {item} cost ${price:.2f}')</font> 语句中的 <font style="color:rgb(71, 101, 130);">f'</font> 表示格式化输出,格式化 <font style="color:rgb(71, 101, 130);">{}</font>中的内容,不在 <font style="color:rgb(71, 101, 130);">{}</font>内的语句照常展示输出!其中的 <font style="color:rgb(71, 101, 130);">{:.2f}</font> 表示保留两位小数,如果是 <font style="color:rgb(71, 101, 130);">{:.0f}</font> 则不保留小数位。 现在小明妈妈让小明去买苹果,小明买好后回来和妈妈说,2 个苹果花费 8.18,还是调用上方函数,只需要在调用函数时,修改参数值即可:
    1. def cal(qty, item,price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(2, 'apples', 8.18)
    1
    2
    3
    4 在上面的例子中,参数 <font style="color:rgb(71, 101, 130);">qty</font> 的值为 <font style="color:rgb(71, 101, 130);">2</font><font style="color:rgb(71, 101, 130);">item</font> 的值为 <font style="color:rgb(71, 101, 130);">'apples'</font><font style="color:rgb(71, 101, 130);">price</font> 的值为 <font style="color:rgb(71, 101, 130);">8.18</font><font style="color:rgb(71, 101, 130);">2,'apples',8.18</font> 的顺序和个数必须要和 <font style="color:rgb(71, 101, 130);">qty,item,price</font> 相同。如果顺序不同,将会得到错误的结果(程序没有错误,只不过表达出的含义和我们最终想要实现的不一致,即得到错误的结果)。
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal('apples', 8.18, 2) # 得到错误的结果
    1
    2
    3
    4
    5 如果个数不同,调用函数的时候会报错。
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(2, 'apples') # 参数过少
    1
    2
    3
    4
    5
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(2, 'apples', 8.18, 'bananas') # 参数过多
    1
    2
    3
    4
    5

    #4.2 关键字参数

    在传递值的时候,还可以带上参数的名字,具体形式为 <font style="color:rgb(71, 101, 130);">keyword = value</font>,这里的 <font style="color:rgb(71, 101, 130);">keyword</font> 必须匹配上一个函数定义中的参数名,也就是说是 <font style="color:rgb(71, 101, 130);">参数名1=值1</font><font style="color:rgb(71, 101, 130);">参数名2=值2</font><font style="color:rgb(71, 101, 130);">参数名3=值3</font> 这种形式。 我们一起运行下方语句:
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(qty=6, item='bananas', price=5.74)
    1
    2
    3
    4
    5 我们看到语句和之前的对比,区别在于调用函数传递参数值时,参数的名字和值进行了对应。 这种情况下,如果指定的 <font style="color:rgb(71, 101, 130);">keyword</font> 在函数定义中没有出现,将会报错。
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(qty=6, item='bananas', cost=5.74) # 会报错
    1
    2
    3
    4
    5 在指定了参数名之后,值的顺序和函数定义中的参数顺序可以不用保持一致。
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(item='bananas', price=5.74, qty=6)
    1
    2
    3
    4
    5 虽然顺序可以不用保持一致,但是值的个数还需要和参数的个数保持相同。不同的话会报错。
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(qty=6, item='bananas') # 会报错
    1
    2
    3
    4
    5
    1. def cal(qty, item, price):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(qty=6, item='bananas', price=5.74, cost=6) #会报错
    1
    2
    3
    4
    5

    #4.3 默认参数

    在定义函数时,我们还可以指定参数的默认值。 指定默认值之后,在调用函数时如果没有指定某个参数的值,就用参数的默认值。 我们分别来看下面几种不同情况:
    1. 调用时,每个参数都给出了值,这时候便用调用时指定的值。
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(4, 'apples', 2.24)
    1
    2
    3
    4
    5
    1. 调用时,只给出了部分参数的值,这时候没有给出值的参数,使用的就是其默认值。
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(4, 'apples')
    1
    2
    3
    4
    5 上述语句没有指定参数 <font style="color:rgb(71, 101, 130);">price</font> 的值,则使用参数 <font style="color:rgb(71, 101, 130);">price</font> 的默认值 <font style="color:rgb(71, 101, 130);">5.74</font>
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(4)
    1
    2
    3
    4
    5 上述语句没有指定参数 <font style="color:rgb(71, 101, 130);">item</font>、参数 <font style="color:rgb(71, 101, 130);">price</font> 的值,则使用参数 <font style="color:rgb(71, 101, 130);">item</font> 的默认值 <font style="color:rgb(71, 101, 130);">bananas</font>、参数 <font style="color:rgb(71, 101, 130);">price</font> 默认值 <font style="color:rgb(71, 101, 130);">5.74</font>
    1. 调用时,也可以不给出参数的值,这时候全部使用默认的值。
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal()
    1
    2
    3
    4
    5
    1. 调用时,也可以指定参数名。
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(item='kumquats', qty=9)
    1
    2
    3
    4
    5
    1. def cal(qty=6, item='bananas', price=5.74):
    2. print(f'{qty} {item} cost ${price:.2f}')
    3. cal(price=2.29)
    1
    2
    3
    4
    5

    #5 <font style="color:rgb(71, 101, 130);">return</font> 语句

    Python 函数中的 <font style="color:rgb(71, 101, 130);">return</font> 语句有两个作用:
    1. 立即结束本函数的执行,将程序的执行控制权交还给调用者。
    2. 返回数据给调用者。
    我们一起来看下方实例:
    1. def f(x):
    2. if x < 0:
    3. return
    4. if x > 100:
    5. return
    6. print(x)
    7. f(-3)
    8. f(105)
    9. f(64)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11 当调用函数 <font style="color:rgb(71, 101, 130);">f(-3)</font> 时,传递参数值 <font style="color:rgb(71, 101, 130);">-3</font>,回到函数 <font style="color:rgb(71, 101, 130);">f(x)</font> 中,符合语句 <font style="color:rgb(71, 101, 130);">x < 0</font>,执行 <font style="color:rgb(71, 101, 130);">return</font> 语句,立即返回;执行调用函数 <font style="color:rgb(71, 101, 130);">f(105)</font> 语句,符合语句 <font style="color:rgb(71, 101, 130);">x > 100</font>,执行 <font style="color:rgb(71, 101, 130);">return</font> 语句,立即返回;执行调用函数<font style="color:rgb(71, 101, 130);">f(64)</font> 语句,64 既不 < 0,也不 > 100,执行 <font style="color:rgb(71, 101, 130);">print(x)</font> 语句,打印出 64。

    <font style="color:rgb(71, 101, 130);">f(-3)</font> <font style="color:rgb(71, 101, 130);">f(105)</font> 由于条件成立,会立即返回,而不会执行后面的 <font style="color:rgb(71, 101, 130);">print()</font> 语句,<font style="color:rgb(71, 101, 130);">f(64)</font> 条件不成立,执行 <font style="color:rgb(71, 101, 130);">print()</font> 语句,打印出 64。

    我们再来看一个实例,求任意数字的绝对值:
    1. def absolute_value(num):
    2. if num >= 0:
    3. return num
    4. else:
    5. return -num
    6. print(absolute_value(2))
    7. print(absolute_value(-4))
    1
    2
    3
    4
    5
    6
    7
    8
    9 我们首先定义一个求绝对值的函数 <font style="color:rgb(71, 101, 130);">absolute_value(num)</font>,参数为 <font style="color:rgb(71, 101, 130);">num</font>,函数语句块为当参数大于等于 0时,返回参数值 <font style="color:rgb(71, 101, 130);">num</font>,当参数小于 0 时,返回参数值 <font style="color:rgb(71, 101, 130);">-num</font> 第二步为打印调用函数 <font style="color:rgb(71, 101, 130);">absolute_value(num)</font> 值,当参数值为 2 时,<font style="color:rgb(71, 101, 130);">absolute_value(2)</font> 调用返回 2;当参数值为 -4 时,<font style="color:rgb(71, 101, 130);">absolute_value(-4)</font> 调用返回参数值 —4,即为 4。

    #6 总结

    下面,我们一起来总结下函数的知识:

    10函数 - 图5

    #7 练习题

    1. 编写一个函数返回两个数中的较大值。
    2. 编写一个函数计算圆的面积。

    更新于: 12/30/2021, 2:46:39 AM