2019--Python

Python第五堂笔记--函数

2019-01-03  本文已影响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第六堂笔记--待更新

总目录

上一篇下一篇

猜你喜欢

热点阅读