5.函数和代码

2018-07-06  本文已影响11人  颜斶

函数是一段代码的表示.具有特定功能,可重用.

两个作用:降低编程难度和代码复用.

def <函数名>(参数<0个或多个>) #输入
<函数体> #处理
return <返回值> #输出

可变参数传递

def <函数名>(<参数>,*b): #b可变参数
<函数体>
return <返回值>

函数调用时,可以按照位置或者名称方式传递.


函数的返回值

局部变量和全局变量

如果一个函数在内部调用自身本身,这个函数就是递归函数.
计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

lambda函数返回函数名作为结果.是一种匿名函数.

<函数名>= lambda <参数> :<表达式>

一般情况,建议使用def定义普通函数.


例:七段数码管绘制

import turtle
def drawline(draw):
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)
def drawdigit(digit):
    drawline(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawline(False)
    drawline(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawline(False)
    drawline(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawline(False)
    drawline(True) if digit in [0, 2, 6, 8] else drawline(False)
    turtle.left(90)
    drawline(True) if digit in [0, 4, 5, 6, 8, 9] else drawline(False)
    drawline(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawline(False)
    drawline(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawline(False)
    turtle.left(180)
    turtle.penup()
    turtle.fd(20)
def drawdate(date):
    for i in date:
        drawdigit(eval(i))
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawdate('20180705')
    turtle.hideturtle()
    turtle.done()
main()


模块内部紧耦合,藕块之间松耦合.

函数递归的几个练习

1.字符串反转

def rvs(s):
    if rvs == "":
        return s
    else:
        return rvs(s[1:])+s[0]

2.斐波那契数列

def f(n):
    if n == 1 or n == 2:
        return 1
    else:
        return f(n - 1) + f(n - 2)

3.汉诺塔问题

count = 0
def hanoi(n, src,dst, mid):  #n是圆盘数,src是起始,dst是目标,mid是过度
    global count
    if n== 1:
        print("{}:{}->{}".format(1, src, dst)) #当圆盘是1时,从起始柱子移到目标柱子
        count += 1
    else:
        hanoi(n - 1, src, mid, dst)  #剩余的圆盘从A移到B柱子
        print("{}:{}->{}".format(n, src, dst))  #最大的圆盘从A移到C柱子
        count += 1
        hanoi(n - 1, mid, dst, src) #剩余的圆盘从B柱子到C柱子

上一篇 下一篇

猜你喜欢

热点阅读