一、 理论部分
这次的blog是关于函数的,函数本身就是一个很大的主题,展开写的话三天三夜都说不完,那还是写简单点吧。
首先,python的函数还是一如既往的灵活。定义函数的时候不必指明函数的返回类型,而且返回值也可以有多个。参数表可以写的很灵活,且同样不必指明类型。
而Lambda表达式则提供了一种不用专门定义函数就可以直接使用函数的功能,个人认为这个有点像C语言中的宏。具体用法为:
lambda 参数1,参数2,…: 要返回值的表达式(表达式可以是求值的也可以是条件判断的。
比如:x ** 2或 x % 2 == 1 均可)
二、练习
1.分别根据每一行的首元素和尾元素大小分别对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
思路:sort()函数中提供了key参数,可以设定比较对象。这里就用lambda函数的返回值提供比较对象,该函数接受一个列表作为参数,返回列表的首元素或尾元素。
a = [[6, 5], [3, 7], [2, 8]]
a.sort(key = lambda lst: lst[0]) #根据首元素排序,函数返回列表首元素给key
print(a)
a.sort(key = lambda lst: lst[1]) #根据尾元素排序,函数返回列表尾元素给key
print(a)
output:
[[2, 8], [3, 7], [6, 5]]
[[6, 5], [3, 7], [2, 8]]
2.利用python解决汉诺塔问题
有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)
思路:经典的递归问题,不多做解释了,用python写注意细节即可。
def hanota(n):
def move(des, temp, goal, n):
if n > 0: #注意递归边界
move(des, goal, temp, n - 1)
global step #使用外部定义好的全局变量
step += 1
print("第%d步:将%d号圆盘从%s柱移至%s柱" % (step, n, des, goal))
move(temp, des, goal, n - 1)
move('A', 'B', 'C', n)
n = input("请输入汉诺塔问题的规模(建议不要超过10): ")
step = 0
hanota(int(n))