Python语法之函数

简介: 假设你编写了可以完成某个特定任务的一组代码,记为 block A。随着开发的推进,你发现 block A 在很多地方都能用到。这时候,你该怎么办?一种简单粗暴的解决方案便是将 block A 复制粘贴到需要的地方。过了一段时间之后,你发现需要对 block A 进行改动,改动的原因可能是发现了 bug,也可能是想优化 block A。这时候,如果 block A 的副本散落在程序的各个角落,你需要对每一处的 block A 进行修改。这种修改方式不仅易于出错,而且容易引入难以发现的 bug。另外,对于后期的程序维护来说简直就是噩梦。

在 Python 中,函数是一组相关的语句,这些语句完成一个特定的任务。为了完成任务,我们只要调用相应的函数即可。在前面的章节中,对内容进行打印的 print() 就是一个函数,它的作用是将内容打印到屏幕上。

1.为什么需要函数

假设你编写了可以完成某个特定任务的一组代码,记为 block A。随着开发的推进,你发现 block A 在很多地方都能用到。这时候,你该怎么办?一种简单粗暴的解决方案便是将 block A 复制粘贴到需要的地方。过了一段时间之后,你发现需要对 block A 进行改动,改动的原因可能是发现了 bug,也可能是想优化 block A。这时候,如果 block A 的副本散落在程序的各个角落,你需要对每一处的 block A 进行修改。这种修改方式不仅易于出错,而且容易引入难以发现的 bug。另外,对于后期的程序维护来说简直就是噩梦。

一种比较好的解决方案是定义一个函数来完成指定的任务。函数的定义完成后,在程序的任何地方如果需要完成相同的任务,只需要调用函数即可。如果以后的某个时间点,需要优化完成任务的方法,只需要在一处进行更改,也就是定义函数的地方。函数的定义修改之后,其他调用函数的地方会随之更改。效率大大提升,而且不容易出错。

2.函数的定义

2.1 语法

网络异常,图片无法展示
|

  1. 关键字 def 标识函数头的开始。
  2. function_name 为函数名,命名规则和变量相同。
  3. parameters 以逗号分隔的参数列表,用来接收传递给函数的值,参数列表是可选的。虽然参数列表是可选的,但是函数名后面的括号是必须的。
  4. : 标识函数头的结束。
  5. statement(s) 组成函数体的一条或多条语句,这些语句必须是相同的缩进(一般是缩进 4 个空格)。

一般我们看到关键字 def 开始的语句,就表示这是一个函数。

2.2 实例

很久很久以前,洪水经常泛滥。大水淹没了田地,冲毁了房屋,毒蛇猛兽到处伤害百姓和牲畜,人们的生活痛苦极了。

洪水给百姓带来了无数的灾难,必须治好它。当时,一个名叫鲧的人领着大家治水。他只知道筑坝挡水,九年过去了,洪水仍然没有消退。他的儿子禹继续治水。

禹离开了家乡,一去就是十三年。这十三年里,他到处奔走,曾经三次路过自己家门口。可是他认为治水要紧,一次也没有走进家门看一看。

禹吸取了鲧治水失败的教训,采取疏导的办法治水。他和千千万万的人一起,疏通了很多河道,让洪水通过河道,最后流到大海里去。洪水终于退了,毒蛇猛兽被驱赶走了,人们把家搬了回来。大家在被水淹过的土地上耕种,农业生产渐渐恢复了,百姓重新过上了安居乐业的生活。

现在定义一个函数 greet(),函数语句为打印大禹治水。

函数定义语句如下:

def greet():
    print("大禹治水")

我们现在只是定义函数,运行上述语句是没有任何结果显示的,如果想打印出函数定义的语句内容 print("大禹治水"),则需要调用函数。也就是说,关于函数的使用,包含两个步骤,第一步是定义函数,第二步是在函数定义好之后,调用函数,我们一起继续来看下函数是如何被调用的?

3.函数的调用

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

3.1 语法

function_name(parameters)

3.2 实例

我们再来看下定义的函数 greet(),按照函数调用的语法,只需要在定义函数语句之后,使用调用函数语句    greet() 即可完成函数的调用,运行下方语句,看下运行效果:

def greet():
    print("大禹治水")
greet()

我们看到结果显示出了大禹治水这四个字,表示我们完成了对函数 greet() 的调用。

我们在函数定义和函数调用的介绍中,都提到了函数的参数,下面,我们就一起来了解下,如何进行函数参数的传递。

4.传递参数

虽然不带参数的函数也可以完成某些特定任务,但是,大多数时候,我们需要给函数传递值,这样的话,每次调用函数的行为都会因为传递的值不同而变得不同。

参数的传递分为不同的情况,我们现在就为大家逐一介绍各种情况:

4.1 位置参数

我们先来看下位置参数,所谓的位置参数,就是表示参数的位置对于函数的结果是有影响的,同样的参数值,在不同的位置,会有不一样的结果表达,我们一起看下方实例:

因为古人大禹治水的成功,才使得子孙后辈进入到了美好的生活中。

小明妈妈让小明去买 6 个香蕉,共花费了 5.74,我们一起来看下,如果用函数实现上述信息的输出,该如何实现呢?我们运行下方语句:

def cal(qty, item,price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(6, 'bananas', 5.74)

我们首先定义了一个函数 cal(),函数 cal() 中有三个参数,分别是参数 qty、参数 item 和参数price,当调用函数 cal() 时,传递三个参数的值 6,'bananas',5.74 给函数,最终运行结果为 6 bananas cost $5.74

网络异常,图片无法展示
|

小贴士: print(f'{qty} {item} cost ${price:.2f}') 语句中的 f' 表示格式化输出,格式化 {}中的内容,不在 {}内的语句照常展示输出!其中的 {:.2f} 表示保留两位小数,如果是 {:.0f} 则不保留小数位。

现在小明妈妈让小明去买苹果,小明买好后回来和妈妈说,2 个苹果花费 8.18,还是调用上方函数,只需要在调用函数时,修改参数值即可:

def cal(qty, item,price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(2, 'apples', 8.18)

在上面的例子中,参数 qty 的值为 2item 的值为 'apples'price 的值为 8.182,'apples',8.18 的顺序和个数必须要和 qty,item,price 相同。如果顺序不同,将会得到错误的结果(程序没有错误,只不过表达出的含义和我们最终想要实现的不一致,即得到错误的结果)。

def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal('apples', 8.18, 2)  # 得到错误的结果

如果个数不同,调用函数的时候会报错。

def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(2, 'apples')  # 参数过少
def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(2, 'apples', 8.18, 'bananas')  # 参数过多

4.2 关键字参数

在传递值的时候,还可以带上参数的名字,具体形式为 keyword = value,这里的 keyword 必须匹配上一个函数定义中的参数名,也就是说是 参数名1=值1参数名2=值2参数名3=值3 这种形式。

我们一起运行下方语句:

def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(qty=6, item='bananas', price=5.74)

我们看到语句和之前的对比,区别在于调用函数传递参数值时,参数的名字和值进行了对应。

这种情况下,如果指定的 keyword 在函数定义中没有出现,将会报错。

def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(qty=6, item='bananas', cost=5.74)  # 会报错

在指定了参数名之后,值的顺序和函数定义中的参数顺序可以不用保持一致。

def cal(qty, item, price):
    print(f'{qty} {item} cost ${price:.2f}')
cal(item='bananas', price=5.74, qty=6)

4.3 默认参数

在定义函数时,我们还可以指定参数的默认值。

指定默认值之后,在调用函数时如果没有指定某个参数的值,就用参数的默认值。

我们分别来看下面几种不同情况:

1.调用时,每个参数都给出了值,这时候便用调用时指定的值。

def cal(qty=6, item='bananas', price=5.74):
    print(f'{qty} {item} cost ${price:.2f}')
cal(4, 'apples', 2.24)

2.调用时,只给出了部分参数的值,这时候没有给出值的参数,使用的就是其默认值。

def cal(qty=6, item='bananas', price=5.74):
    print(f'{qty} {item} cost ${price:.2f}')
cal(4, 'apples')

3.调用时,也可以不给出参数的值,这时候全部使用默认的值。

def cal(qty=6, item='bananas', price=5.74):
    print(f'{qty} {item} cost ${price:.2f}')
cal()

4.调用时,也可以指定参数名。

def cal(qty=6, item='bananas', price=5.74):
    print(f'{qty} {item} cost ${price:.2f}')
cal(item='kumquats', qty=9)

5.return 语句

Python 函数中的 return 语句有两个作用:

  1. 立即结束本函数的执行,将程序的执行控制权交还给调用者。
  2. 返回数据给调用者。
def f(x):
    if x < 0:
        return
    if x > 100:
        return
    print(x)
f(-3)
f(105)
f(64)

当调用函数 f(-3) 时,传递参数值 -3,回到函数 f(x) 中,符合语句 x < 0,执行 return 语句,立即返回;执行调用函数 f(105) 语句,符合语句 x > 100,执行 return 语句,立即返回;执行调用函数f(64) 语句,64 既不 < 0,也不 > 100,执行 print(x) 语句,打印出 64。

f(-3)f(105) 由于条件成立,会立即返回,而不会执行后面的 print() 语句,f(64) 条件不成立,执行 print() 语句,打印出 64。

def absolute_value(num):
    if num >= 0:
        return num
    else:
        return -num
print(absolute_value(2))
print(absolute_value(-4))

我们首先定义一个求绝对值的函数 absolute_value(num),参数为 num,函数语句块为当参数大于等于 0时,返回参数值 num,当参数小于 0 时,返回参数值 -num

第二步为打印调用函数 absolute_value(num) 值,当参数值为 2 时,absolute_value(2) 调用返回 2;当参数值为 -4 时,absolute_value(-4) 调用返回参数值 --4,即为 4。

6.试一试

  1. 编写一个函数返回两个数中的较大值。
  2. 编写一个函数计算圆的面积。
相关文章
|
2月前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
41 7
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
143 67
|
1天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
14 3
|
5天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
19 2
|
1月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
50 18
|
24天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
47 8
|
1月前
|
Python
Python中的函数
Python中的函数
45 8
|
2月前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
2月前
|
存储 索引 Python
Python 的基本语法
这些是 Python 的基本语法要素,掌握它们是学习和使用 Python 的基础。通过不断地实践和应用,你将能够更深入地理解和熟练运用这些语法知识,从而编写出高效、简洁的 Python 代码
81 5
|
2月前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
55 5