zoukankan      html  css  js  c++  java
  • 大爽Python入门教程 41 初识函数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
    
  • 相关阅读:
    报警界面
    09 | 基础篇:怎么理解Linux软中断?
    08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
    07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
    06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
    05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
    scrapy相关:splash安装 A javascript rendering service 渲染
    MongoDB 及 scrapy 应用
    scrapy相关 通过设置 FEED_EXPORT_ENCODING 解决 unicode 中文写入json文件出现`uXXXX`
    wb 黑名单批量操作
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15570869.html
Copyright © 2011-2022 走看看