大爽Python入门公开课教案 点击查看教程总目录
1 情景回顾
在之前的第一章 第三节 第三部分 第三题 有趣的极限中,
我们求过n在三个不同的值100,1000,10000时S的值。
当时的代码是这样的:
n = 100
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
n = 1000
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
n = 10000
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
其中
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
这段代码重复了三遍。
如果我们要展示,n在更多不同的值时,S的值。
那么这段代码还会重复更多次。
遇到这种需要重复的代码的时候,
我们希望有一种机制。
把这段重复的代码打包收纳起来,
并起一个相对简短的名字标识它。
就像给一个名字特别长的人,起一个简短的昵称。
以后每次叫他时就省事很多。
更准确一点,就像是把这些指令压缩折叠成一个小工具箱。
往箱子里面传入不同的n值,就会得到对应的不同的结果。
要实现这样的机制,我们往往会使用函数。
2 使用函数
函数是一段代码,或者说一串代码块,特点为:
- 执行一种任务,或者说承担一种功能
- 只在调用时运行
- 可以传进去不同的参数,然后得到对应的结果。
现在将第一部分中重复的代码放入一个函数里,
并起名为calculate_sum
, 代码如下
def calculate_sum(n):
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
其中
def
为关键字(keyword),用于声明这是一个函数,def
后面接一个空格,空格后为函数名calculate_sum
,- 函数名后接
()
, 圆括号中定义这个函数接受的参数。 - 圆括号后接
:
,然后回车并缩进,缩进中就是函数中的语句。
总的来讲,
首行是函数头(function head),写声明,
之后是函数体(function body),写具体要执行的语句。
使用函数,又称调用函数。
calculate_sum
函数必须接受一个参数作为n
, 其调用语句如下
n = 100
calculate_sum(n)
也可以写为
calculate_sum(100)
此时展示n在三个不同的值100,1000,10000时,S的值。
代码如下
def calculate_sum(n):
k = 1
s = 0
for i in range(n):
s += k / (i + 1)
k = -k
print("n=%s: S=%s" % (n, s))
calculate_sum(100)
calculate_sum(1000)
calculate_sum(10000)
输出如下
n=100: S=0.688172179310195
n=1000: S=0.6926474305598223
n=10000: S=0.6930971830599583
此时,要额外地求其他n值对应的S值,只需要使用一行代码即可。
比如要展示n为100000时S的值
只需在末尾添加一行
calculate_sum(100000)
3 场景示例
函数常用来解决一类事。
举例如下,以下是四个同学A
、B
、C
、D
,
三门课程英语(music)、历史(history)、语法(grammer)的成绩。
scores = {
"A": {"music": 80, "history": 70, "grammer": 75},
"B": {"music": 81, "history": 78, "grammer": 83},
"C": {"music": 85, "history": 81, "grammer": 81},
"D": {"music": 83, "history": 90, "grammer": 82},
}
现在需要程序计算并输出这些同学音乐的平均分。
这个时候推荐写一个函数,函数接受学科的名字作为参数,计算这个学科的平均分。
def show_course_average(course_name):
sum_score = 0
for student in scores:
student_scores = scores[student]
course_score = student_scores[course_name]
sum_score += course_score
aver_score = sum_score / len(scores)
print("Average score for %s course: %s" % (course_name, aver_score))
函数写好后,要展示音乐的平均分。
调用方法如下
show_course_average("music")
最后输出如下
Average score for music course: 82.25
编写这样一个函数的好处是,如果后续要输出他们其他科目的平均分,也很容易,只需要再调用函数就可。
比如输出他们历史和语法的平均分,调用代码如下。
show_course_average("history")
show_course_average("grammer")
输出如下
Average score for history course: 79.75
Average score for grammer course: 80.25
小结:函数让我们写的代码,可以重复的被使用,且有一定的灵活性,能够用同一逻辑 处理不同的输入。
让我们不用重复写代码或者做较多的修改。
4 组织代码
关于函数的作用:
函数不仅可以让一段代码逻辑能被重复使用,
函数还可以用来去组织我们的代码。
这个我们具体后面再展开讨论。
这里先介绍一下空函数。
空函数
写代码的时候,我们可以把要做的事情,先定义成一些对应的空函数。
就像是写文章的时候,先列一个大纲几个事件,
具体里面的内容到后面再去填充。
空函数,本质就是函数体里面什么都不执行。
但是:
后面如果什么都不写就退出函数(退出缩进),程序会报错。
比如这个代码
def simple_func():
会报错SyntaxError
之前的if ...:
和for ...:
也是如此(什么都不写就退出会报错)。
那么这个时候可以使用pass
。
pass
DOC: The pass statement does nothing. It can be used when a statement is required syntactically but the program requires no action.
pass
语句是一个空语句,它什么都不做。
当程序不需要执行操作,但语法上需要语句时,我们可以使用它。
可以说这是一个占位语句,保持程序语法结构的完整性。
比如,我们给上面那个函数加上pass
后
def simple_func():
pass
就不会报错了(但这个函数仍然啥都不做)
pass
可以用在任何地方。
但是一般用在:
后面,具体点,是用在:
后面还没有写具体内容的场景下。
比如写空函数时常会使用pass
。
等到函数可以写具体逻辑的时候,再删掉pass
。
这个具体可以通过我们后面的各种示例来理解。
5 函数注释
DocStrings
对于函数,为了让别人能看懂(也为了自己以后能看懂),常需要写注释来介绍函数功能。
这个时候推荐使用文档字符串DocStrings
来写注释。
在函数体的第一行使用一对三个单引号 '''
或者一对三个双引号"""
来定义文档字符串
示例如下
def simple_func():
""" describe the function here """
pass
DocStrings
还可以是多行的。
第一行一般简述函数功能。
第二行空行,
第三行具体展开描述。
示例如下
def simple_func():
""" simple function
do nothing"""
pass