函数是一段代码的表示.具有特定功能,可重用.
两个作用:降低编程难度和代码复用.
def <函数名>(参数<0个或多个>) #输入
<函数体> #处理
return <返回值> #输出
可变参数传递
def <函数名>(<参数>,*b): #b可变参数
<函数体>
return <返回值>
函数调用时,可以按照位置或者名称方式传递.
函数的返回值
- 函数可以有0个或多个返回值
- 可以有return也可以没有
- return可以传递0个也可以传递任意多个返回值
局部变量和全局变量
- 局部变量和全局变量是完全不同的变量
- 使用global保留字在函数内部声明使用全局变量
- 局部变量为组合数据类型且未被创建,等同于全局变量
如果一个函数在内部调用自身本身,这个函数就是递归函数.
计算阶乘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柱子