一、定义函数
一般定义函数的格式为:
def 函数名(参数列表):
函数体
创建函数的规则:
1. 使用def来创建函数;
2. 函数名只包含字符和_ (下划线);
3. 在函数名后面放((左圆括号),左圆括号后面放参数(argument),参数之间以逗号隔开;
4. 每个参数都是唯一的;
5. 在参数后面放)(右圆括号)和 :(冒号);
6. 在与这个函数相关的代码行前面加上四个空格的缩进(不能多,也不能少);
7. 通过另起一行不缩进来结束函数。
赋值的几种不同方式:
def cheese_and_crackers(cheese_count, boxes_of_crackers):
print(f"You have {cheese_count} cheeses!")
print(f"You have {boxes_of_crackers} boxes of crackers!")
print("Man that's enough for a party!")
print("Get a blanket.\n")
print("We can just give the function numbers directly:")
cheese_and_crackers(20, 30) #可以直接给数字
print("OR, we can use variables from our script:")
amount_of_cheese = 10
amount_of_crackers = 50
cheese_and_crackers(amount_of_cheese, amount_of_crackers) #可以给变量
print("We can even do math inside too:")
cheese_and_crackers(10+20, 5+6) #可以是数学运算
print("And we can combin the two, variables and math:")
#甚至数学运算和变量的结合
cheese_and_crackers(amount_of_cheese + 100, amount_of_crackers + 100)
二、递归函数
若在一个函数内部调用自身本身。这个函数就是递归函数。
如计算阶乘n!=1*2*3*...*n,用函数fact(n)表示,可以看出:fact(n)=n!=1*2*3*...*(n-1)*n=(n-1)!*n=fact(n-1)*n,故fact(n)可表示为n*fact(n-1),只有n=1时需特殊处理,因此fact(n)用递归的方式写出来即为:
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归函数清晰。递归函数的优点就是是定义简单,逻辑清晰。
一个经典的小练习:
汉诺塔的移动可以用递归函数非常简单的实现,编写move(n, a, b, c),接收参数n表示3个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,如:
if n == 1:
print(a, '-->', c)
以下答案仅供参考:
def move(n, a, b, c):
if n == 1: #如果n=1,直接从a到c
print(a, '-->', c)
else:
move(n-1, a, c, b) #从A柱通过C柱移动n-1个到B柱
move(1, a, b, c) #将A柱最后一个移动到C柱
move(n-1, b, a, c) #从B柱通过A柱移动n-1个到C柱
return #至此移动完成return
move(3, 'A', 'B', 'C')