美文网首页2019--Python
Python第五堂笔记--函数

Python第五堂笔记--函数

作者: 六个周 | 来源:发表于2019-01-03 19:00 被阅读56次

    1️⃣、Python之什么是函数

    函数就是最基本的一种代码抽象的方式。

    2️⃣、Python之调用函数

    要调用一个函数,需要知道函数的名称参数 ,比如求绝对值的函数 abs,它接收一个参数。

    任务
    sum()函数接受一个list作为参数,并返回list所有元素之和。请计算 1*1 + 2*2 + 3*3 + ... + 100*100。(tips:使用list添加数组方法)

    3️⃣、Python之编写函数

    在Python中,定义一个函数要使用 def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。

    4️⃣、Python函数之返回多值

    任务
    一元二次方程的定义是:ax² + bx + c = 0
    请编写一个函数,返回一元二次方程的两个解。
    注意:Python的math包提供了sqrt()函数用于计算平方根。

    5️⃣、Python之递归函数

    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

    任务
    汉诺塔 (http://baike.baidu.com/view/191666.htm) 的移动也可以看做是递归函数。
    我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:
    如果a只有一个圆盘,可以直接移动到c;
    如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。
    请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:
    move(n, a, b, c)
    例如,输入 move(2, 'A', 'B', 'C'),打印出:
    A --> B
    A --> C
    B --> C

    //代码
    def move(n, a, b, c):
        if n ==1:
            print a, '-->', c
            return
        move(n-1, a, c, b)
        print a, '-->', c
        move(n-1, b, a, c)
    move(4, 'A', 'B', 'C')
    

    延伸阅读-可跳过

    汉诺塔是什么

    汉诺塔(港台:河内塔)是根据一个传说形成的数学问题:
    有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

    1. 每次只能移动一个圆盘;
    2. 大盘不能叠在小盘上面。
      提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。
      问:如何移?最少要移动多少次?

    image

    常见玩具版汉诺塔有8个圆盘

    image

    3个圆盘的汉诺塔的移动

    image

    4个圆盘的汉诺塔的移动

    传说

    最早发明这个问题的人是法国数学家爱德华·卢卡斯。

    传说越南河内某间寺院有三根银棒,上串 64 个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。

    若传说属实,僧侣们需要 264-1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要 5845 亿年才能完成。整个宇宙现在也不过 137 亿年。

    这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定.

    解答

    如取 N=64,最少需移动 264-1 次。即如果一秒钟能移动一块圆盘,仍将需 5845.54 亿年。目前按照宇宙大爆炸理论宇宙大爆炸理论")的推测,宇宙的年龄仅为 137 亿年。

    在真实玩具中,一般 N=8;最少需移动 255 次。如果 N=10,最少需移动 1023 次。如果N=15,最少需移动32767次;这就是说,如果一个人从 3 岁到 99 岁,每天移动一块圆盘,他最多仅能移动 15 块。如果 N=20,最少需移动 1048575 次,即超过了一百万次。

    算法求解

    解法的基本思想是递归。假设有 A、B、C 三个塔,A 塔有 N块盘,目标是把这些盘全部移到 C 塔。那么先把 A 塔顶部的N-1 块盘移动到 B 塔,再把 A 塔剩下的大盘移到 C,最后把 B 塔的 N-1块盘移到 C。
    如此递归地使用下去, 就可以求解。

    Python 实现,上面代码已给出。

    def move(n, a, b, c):
        if n ==1:
            print a, '-->', c
            return
        move(n-1, a, c, b)
        print a, '-->', c
        move(n-1, b, a, c)
    move(4, 'A', 'B', 'C')
    

    6️⃣、Python之定义默认参数

    函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。
    注意:由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面.

    任务
    请定义一个 greet() 函数,它包含一个默认参数,如果没有传入,打印 'Hello, world.',如果传入,打印 'Hello, xxx.'

    7️⃣、Python之定义可变参数

    如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

    def fn(*args):
        print args
    

    可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数.
    在函数内部,直接把变量 args 看成一个tuple就好了。

    任务:
    请编写接受可变参数的 average() 函数。

    def average(*args):
        sum = 0.0
        if len(args) == 0:
            return sum
        for x in args:
            sum = sum + x
        return sum / len(args)
    print average()
    print average(1, 2)
    print average(1, 2, 2, 3, 4)
    

    上一节:Python第四堂笔记--Dict和Set类型

    下一节:Python第六堂笔记--待更新

    总目录

    相关文章

      网友评论

        本文标题:Python第五堂笔记--函数

        本文链接:https://www.haomeiwen.com/subject/pzctrqtx.html