大爽Python入门教程 4-1 初识函数Function

大爽Python入门公开课教案 点击查看教程总目录

1 情景回顾

在之前的第一章 第三节 第三部分 第三题 有趣的极限中,

\[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值,就会得到对应的不同的结果。

要实现这样的机制,我们往往会使用函数。

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 场景示例

函数常用来解决一类事。

举例如下,以下是四个同学ABCD
三门课程英语(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
posted @ 2021-11-18 09:49  大爽歌python编程辅导  阅读(226)  评论(0编辑  收藏  举报