一、系列缘由
作为一名运维工程师,也一直有一个学习开发的想法,值此之际,不知道博客的下一期目标在哪里,在这思考和犹豫的间隙想着学习和充实一下自己,学习一下python语言,python随着大数据和人工智能的兴起而日益火爆。边学习边实践的原则学习python,希望自己更上一层楼。我的目标是创建一个自己的网站——太阳站点(sun-site.com),一个自娱自乐的自由空间。
二、学习笔记
1、函数的定义和规则
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数,函数规则如下:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
def 函数名(参数列表):
函数体
2、函数参数
- 必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,你必须传入一个参数,不然会出现语法错误:
def printme( str ):
- 关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
printme(str=“hello”)
- 默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
def printinfo( name, age = 35 ):
- 不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。基本语法如下:
def functionname([formal_args,] *var_args_tuple ):
- 关键字参数的**运算
加了两个星号 ** 的参数会以字典的形式导入。
def printinfo( arg1, **vardict ):
调用的时候需要使用关键字参数形式
printinfo(1, a=2,b=3)
3、递归函数
函数调用是指函数定义完成后,在函数外可以被别的语句执行。在特殊情况下我们在定义中的语句执行函数本身,这就是递归函数。递归函数我们需要指定结束递归的判定条件。
4、匿名函数
python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,…argn]]:expression
三、实践练习
1、游戏代码
(base) [root@s186 python]# cat hnt.py
#!/root/anaconda3/bin/python
# This is a python program.
'''
这是一个汉诺塔游戏,一共有三根金刚石柱子
A柱子上有N个黄金圆盘,需要全部移动到C柱子
小盘只能放到大盘上面,一次只能移动一个圆盘
'''
count=0
def move(n,a,b,c):
global count
if (n == 1):
print(a,"柱->最上层圆盘移动到->",c,"柱")
count+=1
return
move(n-1,a,c,b) #把n-1个圆盘从a移动到b
move(1,a,b,c) #把最后一个圆盘从a移动c
move(n-1,b,a,c) #把n-1个圆盘从b移动到c
x=int(input('您想玩几层汉诺塔?请如下对应数字:'))
move(x,'a','b','c')
print("一共需要执行",count,"步才可以移动完成!")
2、设计思路
- 定义一个全局变量用于记录需要移动的步数
- 使用人类推理的逻辑分解移动方案:
首先需要将(n-1)个盘子移动到B柱
然后将最大圆盘从A柱移动到C柱
然后将(n-1个盘子从B柱移动到C柱) - 记录n=1的时候的移动步骤
- 打印总共需要移动盘子的次数。
3、游戏测试