一、函数的定义
来想象一下,如果你想用榨汁机做一杯美味的猕猴桃汁,需要哪些步骤呢?
- 将猕猴桃去皮;
- 将猕猴桃切块;
- 将切碎的猕猴桃放进榨汁机;
- 将果汁倒进杯子中。
经过上面的 4 步,一杯愉悦味蕾的猕猴桃汁就可以呈上来,端给朋友们了!
我们把这四步用代码表示,打印在屏幕上,再多打印一句“制作完成!”:
print('将猕猴桃去皮')
print('将猕猴桃切块')
print('将切碎的猕猴桃放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
用函数表示呢
def make_juice():
print('将猕猴桃去皮')
print('将猕猴桃切块')
print('将切碎的猕猴桃放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
上面的代码,第一行使用了 def make_juice():
这样的格式,def
是 define(中文含义:定义)的缩写,表示你要向 Python 传授做事流程了,make_juice
是你定义的流程暗号名。在这一行的末尾,一定要加上一对 英文括号 和一个 英文冒号 哦。
这就是完整的教 Python 做事的代码结构,要注意以下几点:
- 用 def 引导出要定义的“暗号”,后面加上一对括号和冒号作结尾;
- 具体的做事代码直接写在下面,前面统一加缩进。
在编程中有个专门的名字:函数。我们用严谨的语言来描述一下什么是 函数:
- 组织好的:做猕猴桃汁的过程代码预先写在了教 Python 做事的过程中;
- 可重复使用的:我们可以和 Python 对无数次暗号,Python 就会乖乖执行无数次;
- 用来实现特定功能:做猕猴桃汁。
前面教 Python 做事,并设定好“暗号”的过程,叫作 定义函数。其中缩进的几行表示具体处理过程的代码,叫 函数体。
def make_juice():
print('将猕猴桃去皮')
print('将猕猴桃切块')
print('将切碎的猕猴桃放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
而后面让 Python 真正根据暗号做事的过程,叫作 调用函数,我们可以让 Python 执行无数次暗号,也就是说,函数一旦定义,就可以任我们随意调用
make_juice()
二、函数的参数
我们通过定义函数,教会了 Python 榨猕猴桃汁,那可不可以教它榨苹果汁?当然可以。我们可以稍微修改一下代码,再定义一个 make_apple_juice()
函数。
# 定义函数时,括号中写进预设的变量 fruit
def make_juice(fruit):
# 把 fruit 写进函数体中
print('将' + fruit + '去皮')
print('将' + fruit + '切块')
print('将切碎的' + fruit + '放进榨汁机')
print('将果汁倒进杯子中')
print('制作完成!')
# 做苹果汁
make_juice('苹果')
# 做桃子汁
make_juice('桃子')
预设的临时变量 fruit
,要放进第 1 行定义函数部分的括号中,用以向 Python 事先声明,具体的水果需要视情况而定;在函数体中,水果该出现的地方也换成 fruit
。定义完毕后,Python 虽然不知道到底要遇到什么水果,但至少是把流程给牢牢记住了。
根据这个逻辑,Python 读到 make_juice('桃子')
时,也自然可以打印出榨桃子汁的正确流程。
定义函数时预设的临时变量,有个专门的名称:参数。定义过程所用的样板 fruit
,叫作 形式参数,简称 形参,只起示范作用;而实际调用函数时 make_juice('桃子')
中的 '桃子'
,叫作 实际参数,简称 实参。
有了 参数,函数就更加灵活而强大了。定义函数时,我们只要专心总结出固定的操作流程,至于具体根据场景而变化的元素,只要交给 参数 去统一表示就可以啦。
这种“预设临时变量,写进固定流程”的思路,想必我们早就不陌生了,在学数学和物理公式时,用的都是这种思路。比如圆的周长公式 C = 2πr,我们只要用 π 乘以半径乘以 2,就能得出周长,具体的半径是多少,实际运算中代入就好。
三·、函数的返回值
return 语句
学到这里,你有没有想过,函数的运行结果,在内部按指定的格式打印,是不是有点太死板?可不可以把运算结果拿出来自己任意使用呢?
我们以刚刚的定义的函数 circle()
为例,现在的写法是这样的:
def circle(r):
c = 2 * 3.14 * r
print('该圆的周长是' + str(c))
每次运行时,只能按照既定格式打印出 “该圆的周长是xxx”,如果要换一个打印格式,只改动一点,改成“圆的周长:xxx”,要怎么办?
def circle(r):
c = 2 * 3.14 * r
# 函数体最后一行加上 return 语句
return c
result = circle(2)
print(result)
print('该圆的周长为' + str(result))
经过修改的代码,就能正确地打印出计算结果了:
函数体中, return c
的意思是,将 c
指定为唯一可以和外界交流的数据,外面的代码想要获取内部运行结果,就丢个 c
的值给他。至于外面如何处置,函数就管不着了。
被 return
语句传到函数外的值,叫作函数的 返回值。返回值 要么被外部代码直接打印,要么赋值给变量,要么参与运算等。总之,每一次 circle()
函数的调用,都会和其它代码联系在一起,而 返回值 c
就是唯一的纽带。
circle(r):
c = 2 * 3.14 * r
# 函数体最后一行加上 return 语句
return c
# 直接打印返回值
print(circle(1))
# 输出:6.28
# 将返回值赋值给变量
result = circle(3)
print(result)
# 输出:18.84
# 返回值参与运算
print(circle(1) * -1)
# 输出:-6.28
# 返回值参与字符串的拼接
print('本次的运算结果为' + str(circle(1)))
# 输出:本次的运算结果为6.28
四、函数的要点
典型的函数
现在的 circle()
函数,是一个典型的函数:既有 参数,又有 返回值。我们来分析一下它的结构:
它代表了一个函数的通用思路:
- 告诉 Python,要定义一个函数;
- 暗号名,即函数的名字是什么;
- (非必要)这个函数需要什么 参数;
- 处理过程是什么样的;
- (非必要)把什么样结果 返回 给外部。
五、函数的命名
函数的命名和变量的命名是一样的,由数字、字母、下划线组成,并且不可以用数字作为名称的开头。另外,名称本身要表达自己的功能,要简单易读,并且中间不能有空格。如果有多个单词,要用下划线 _
连接。
下面的几个函数名是规范的:
函数格式易错点
在定义函数的过程中,新手程序员们最容易犯的错误有以下几点:
第一行定义函数时,括号和冒号不小心写成了中文的。这会导致程序报错 (SyntaxError
):
# 我们故意把括号和冒号改成中文
def circle(r):
c = 2 * 3.14 * r
# 函数体最后一行加上 return 语句
return c
# 输出:
# SyntaxError: invalid character in identifier
# 语法错误:识别到无效字符
中文的括号和冒号会被识别为无效字符。所以我们要注意,不要犯这种低级错误哦。
另一个,就是忘记在函数体前统一加缩进。这样也会导致程序报错 (IndentationError
):
return 语句的陷阱
return
语句有一个特别要注意的点,return
语句是函数执行结束的标记,运行完 return
语句,就会退出函数的执行,不管后面还有没有其它代码。所以我们一般都要把 return
语句放在最后。