- 现在开始深入我们提到的第四种基本模式:存储与重用。
核心思想是“不要重复你自己”
四种基本模式是什么呢?
循环执行,条件判断,循环迭代,以及存储与重用。
存储与重用就是不要重复自己理念,(Don't Repeat Yourself),函数正是我们存储并重用的工具。
使用函数
def是definite(定义)的缩写,它是一个关键字,它以冒号结尾,就像许多开启缩进代码块的语句一样。用来告诉Python,“记住这个函数的含义!下次说到的时候就是让你做这个重复操作。”所以实际上不会执行。当调用时,它会回到定义的地方并执行定义函数中缩进的代码,执行完之后又回到你调用的地方继续往下执行。
示例1
为存储的内容命名,如图的thing,然后括号,内部可以有一些可选的参数,关键要理解,当python解析或者查看这段代码时,它事实上不会执行,下面两个可以执行的语句,分别是print print,但是它所做的,只是记住这些内容。(很像把这些内容存储到一个类似变量的区域中)
thing()(无参)就是调用函数的语法,当调用的时候,它会回到定义的地方并执行那两行代码,因此输出结果是Hello Fun,然后再回来执行print(‘zip’),输出zip,然后再运行一遍,就和上图右侧结果一样
小结一下:函数是一段可重复使用的代码,我们def
保留字来定义函数,当你调用函数时,往往还需要提供一些信息:函数名、括号,有时还需要参数。之后我们会讨论如何创建并使用我们自己定义的函数。就像是你创建了新的保留字或变量名称,因此需要避免使用保留字或其他类似的名称。
Python有一些内置的函数,max
是一个我们还没见过的。
示例2
我们传入一个字符串,并询问:‘max’函数用于找到某个序列中最大值,在这里它会扫描这个字符串并找到最大的字母,于是判定w是最大的字母。显然,小字母比大字母的数值更大。接着,它执行所谓的返回操作,将结果交还给我们。于是,w就被赋值给了变量‘big’.同理,min函数就是反过来的。(出于某种原因,空格字符被判定为最小的字符)
内置函数也遵从自定义函数一样的逻辑,有输入,有调用,有输出。
max函数某种程度可以看作:python内置的一段代码块,我们传入一个参数,这个参数是一个字符串,在这段代码的内部,陈旭会运行并遍历传入的参数,逐一检查内容,w的值就会被赋给赋值语句的左侧变量big,就是max函数执行后返回的值。
类型的转换
下图中,python会判断打印之前有哪些函数要先执行。
float转化;type说明一下i的类型,是整数.....
💡看完后要理解:函数调用就像是暂时暂停我们当前的操作,稍等一下,随后函数会返回一个值来替换它。
字符串函int()
和上面的浮点函float()
也是类似的。但函数本身也可能会出错:
input函数,它总是返回一个字符串,我们可能需要将其作为数字来使用。因此字符串“1-2-3”与数字123是不一样的,比如我们在给它加1(如第四行),我们就会得到回溯错误,应为无法将字符串和整数拼接在一起,仅仅是因为类型不匹配。如果我们处理同样的123,这里就会有int函数的一小段代码,最终就会得到123被赋值给ival。就可以加1了
常用的12种内置函数,作为新手,你并不需要记忆所有,能看懂就行。
构建函数
我们已经简单讨论过一点def
的语法结构:仅用于定义函数。
def 函数名(参数1, 参数2, ..., 参数n):
"""写一下函数文档字符串说明函数是在干嘛防止人类看不懂(可选)"""
#函数体代码
#往往是一些内置函数比如:
print("Hello,Datawhale")
return 返回值 # 可选
def的没有执行是因为没有调用该函数
如何调用:print_lyrics()会执行其内部代码。
调用函数时会发生什么?
-
一旦我们定义了一个函数,我们可以根据需要调用(或调用)它任意多次。这就是存储和重用模式。
-
参数值(Arguments)是我们调用函数时作为输入传递给函数的值。我们使用参数值,以便在不同时间调用函数时可以指示函数执行不同类型的工作。我们将参数值放在函数名称后面的括号内,就像是给变量赋值。
=(代表:箭头指向) 'Hello world'
,表示这是参数。
>>> def greet(lang): # lang 是参数,可以理解为一个别名。
... if lang == 'es':
... print('Hola')
... elif lang == 'fr':
... print('Bonjour')
... else:
... print('Hello')
...
>>> greet('en') # 'en' 是参数值
Hello
>>> greet('es') # 'es' 是参数值
Hola
>>> greet('fr') # 'fr' 是参数值
Bonjour
参数(Parameters)是我们定义函数时给输入参数值留的位置,
-
我们可以对比一下Argument(参数值,又叫实参)和Parameter(参数)的区别。
打个比方来对比:参数值(A)与参数(P)
-
返回值:
返回值实际是在做两件事:
-
停止函数
-
输出一个值
再次回到max函数,理解return的工作原理
无返回值函数(无效函数)
当函数不返回任何值时,我们称其为“无返回值”函数,会返回值的函数称为“有返回值”函数,无返回值函数是“不产生结果”的。
要不要用函数呢?函数化还是不函数化...
-
将代码组织成"段落"形式 - 捕捉完整逻辑并"命名封装"
-
避免重复造轮子 - 实现一次功能即可重复调用
-
当代码过长或过于复杂时,应将其拆分为逻辑块并通过函数封装
-
建立常用功能库 - 你甚至可以与伙伴们共享这些封装好的函数...
练习
1.在你的系统上运行程序,看看你得到什么数。多次运行程序,看看你得到什么数。random 函数只是处理随机数函数中的一个。函数 randint 接受参数 low 和 high ,并返回一个介于 low 和 high 之间的整数(包括两端)。
>>>import random
>>> random.randint(5, 10)
2.将这个程序的最后一行repeat_lyrics()移到顶部,使函数调用出现在定义之前。运行程序并看看你得到什么错误消息。
def print_lyrics():
print("I'm a lumberjack, and I'm okay.")
print('I sleep all night and I work all day.')
def repeat_lyrics():
print_lyrics()
print_lyrics()
repeat_lyrics()
# Code: https://www.py4e.com/code3/lyrics.py
3.将函数调用移回底部,并将 print_lyrics 的定义移到 repeat_lyrics 的定义之后。运行这个程序会发生什么?
def print_lyrics():
print("I'm a lumberjack, and I'm okay.")
print('I sleep all night and I work all day.')
def repeat_lyrics():
print_lyrics()
print_lyrics()
repeat_lyrics()
4.“def” 关键字在 Python 中的目的是什么?
A.它是一种俚语,意思是“接下来的代码真的很酷”
B.它表示函数的开始
C.它表示接下来的缩进代码段将被存储以供以后使用
D. b 和 c 都为真
E. 以上皆非
5.以下 Python 程序将输出什么?
def fred():
print("Zap")
def jane():
print("ABC")
jane()
fred()
jane()
A.Zap
ABC
jane
fred
jane
B.
Zap
ABC
Zap
C.
ABC
Zap
jane
D.
ABC
Zap
ABC
6.使用加班一倍半的工资重新编写你的工资计算程序,并创建一个名为 computepay 的函数,该函数接受两个参数( hours 和 rate )。
Enter Hours: 45
Enter Rate: 10
Pay: 475.0
7.编写一个程序,使用名为 computegrade 的函数,接收一个表示分数的浮点数作为参数,并根据下表返回对应的等级字符串:
此外,如果输入的值不是合法的数字,或者不在 0 到 1.0 的范围内,程序应输出 "Bad score"。
版权所有:知识共享署名 3.0 - 查尔斯·R·塞维森