程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。
# 函数定义和默认参数
def func(x, y = 500):
print(x, y)
func(150)
func(100, 200)
func(y = 300, x = 100)
# 可变参数
def func(name, *numbers):
print(name)
print(numbers)
func('Tom', 1, 2, 3, 4)
# 关键字参数
def func(name, **kvs):
print(name)
print(kvs)
func('Jack', china = 'Beijing', uk = 'London')
# 命名关键字参数
def func(*, china, uk): # *用于和普通参数做分割,*args一样效果
print(china, uk)
func(china = 'Beijing', uk = 'London') # 必须传入参数名
# 复杂情况
def func(a, b, c = 0, *args, **kvs):
print(a, b, c, args, kvs)
func(1, 2)
func(1, 2, 3)
func(1, 2, 3, 'a', 'b')
func(1, 2, 3, 'a', 'b', china = 'Beijing', uk = 'London')
func(1, 2, 3, *('a', 'b'), **{'china':'Beijing', 'uk':'London'})
# 递归的经典例子!
def fib(n):
if n < 1:
raise ValueError
elif (n == 1) or (n == 2):
return 1
else:
return fib(n - 1) + fib(n - 2)
print(fib(1))
print(fib(2))
print(fib(3))
print(fib(4))
print(fib(5))
print(fib(6))
结果 :
150 500
100 200
100 300
Tom
(1, 2, 3, 4)
Jack
{'china': 'Beijing', 'uk': 'London'}
Beijing London
1 2 0 () {}
1 2 3 () {}
1 2 3 ('a', 'b') {}
1 2 3 ('a', 'b') {'china': 'Beijing', 'uk': 'London'}
1 2 3 ('a', 'b') {'china': 'Beijing', 'uk': 'London'}
1
1
2
3
5
8写的是一些传参数要注意的地方和一个递归的经典案例,也是求斐波那契数列的
def move(n, source, target, helper):
if n == 1:
print (source + ' -> ' + target)
else:
move(n - 1, source, helper, target)
print(source + ' -> ' + target)
move(n - 1, helper, target, source)
move(4, 'A', 'B', 'C')
结果 :
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
A -> B
C -> B
C -> A
B -> A
C -> B
A -> C
A -> B
C -> B不知道大家玩没玩过汉诺塔,这是一个汉诺塔的程序,传进去数字多少就会进行多少块的移动
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
思路
假设3根柱子分别为A、B、C,圆盘数目为n。
1:如果A有一个圆盘,则直接移动至c。
2:如果A有2个圆盘,则A->B,A->C,B->C。
好了这个时候已经可以解决问题了,结束条件为 n==1;
假设当我们在数目为n-1的时候已经解决了移动问题可以成功移动至C,如果又多了一个呢,即n,我们用同样的方法把圆盘移动至B(我们已经可以把n-1个盘子通过B移动至C了,那么通过C移动至B也一样),为什么移动至B了呢,因为多了个盘子(放在最底部的大盘子),我们要向步骤2一样把上面的n-1个盘子看成一个整体,用上一个方法即移动n-1个盘子的方法把上面的n-1个盘子移动至B,然后把新增的那个大盘子移动至C,然后再用移动n-1个盘子对应的方法把B中的n-1个盘子移动至C,就完成了。