大爽Python入门公开课教案 点击查看教程总目录
在之前的第一章 第三节 第三部分 第三题 有趣的极限中,
\[S = 1 - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \frac{1}{5} - \frac{1}{6} + ... + \frac{(-1)^{n-1}}{n} \]我们求过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值,就会得到对应的不同的结果。
要实现这样的机制,我们往往会使用函数。
函数是一段代码,或者说一串代码块,特点为:
现在将第一部分中重复的代码放入一个函数里,
并起名为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)
函数常用来解决一类事。
举例如下,以下是四个同学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
小结:函数让我们写的代码,可以重复的被使用,且有一定的灵活性,能够用同一逻辑 处理不同的输入。
让我们不用重复写代码或者做较多的修改。
关于函数的作用:
函数不仅可以让一段代码逻辑能被重复使用,
函数还可以用来去组织我们的代码。
这个我们具体后面再展开讨论。
这里先介绍一下空函数。
写代码的时候,我们可以把要做的事情,先定义成一些对应的空函数。
就像是写文章的时候,先列一个大纲几个事件,
具体里面的内容到后面再去填充。
空函数,本质就是函数体里面什么都不执行。
但是:
后面如果什么都不写就退出函数(退出缩进),程序会报错。
比如这个代码
def simple_func():
会报错SyntaxError
之前的if ...:
和for ...:
也是如此(什么都不写就退出会报错)。
那么这个时候可以使用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
。
这个具体可以通过我们后面的各种示例来理解。
对于函数,为了让别人能看懂(也为了自己以后能看懂),常需要写注释来介绍函数功能。
这个时候推荐使用文档字符串DocStrings
来写注释。
在函数体的第一行使用一对三个单引号 '''
或者一对三个双引号"""
来定义文档字符串
示例如下
def simple_func(): """ describe the function here """ pass
DocStrings
还可以是多行的。
第一行一般简述函数功能。
第二行空行,
第三行具体展开描述。
示例如下
def simple_func(): """ simple function do nothing""" pass