Python语言程序设计_5

学习过程主要依照中国MOOC课程,感谢MOOC,感谢北理授课大佬。

函数的定义和使用

函数的理解与定义

两个作用:
-降低编码难度;
-代码复用;

1
2
3
def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>

函数的使用及调用过程

-调用时要给出实际参数;
-实际参数替换定义中的参数;
-函数调用后得到返回值;

函数的参数传递

-参数可有可无,但必须保留括号;
-非可选参数(必选参数)要放在可选参数前边;
-函数参数可以为可变数量参数,即不确定参数总数量;

1
def <函数名>(<参数>,*b):

函数的返回值

-return保留字用来传递返回值;
-函数可以有返回值,也可以没有,即可以有return,也可以没有;
-return可以返回一个,也可以返回多个;

局部变量和全局变量

-函数外部定义的为全局变量,函数内部定义的为局部变量,在函数内部可以使用保留字global定义全局变量。
-对于组合数据类型,如列表等,如果局部变量为真实创建,且函数内变量名与全局定义的变量相同,则它就是全局变量(原因:组合数据类型定义的是指针,在函数内部操作的也是指针);

lambda函数

-lambda函数使用lambda保留字定义,是一种匿名函数,即没有名字的函数,返回函数名作为结果;
-用于定义简单的、能够在一行内表示的函数;

1
<函数名> = lambda<参数>:<表达式>
1
2
3
4
5
6
>>> f = lambda x,y:x+y
>>> f(10,15)
25
>>> f = lambda:"lambda函数"
>>> print(f())
lambda函数

实例: 七段数码管绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#SevenDigitsDrawV1.py
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)) #通过eval()函数将数字变为整数
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#SevenDigitsDrawV2.py
import turtle, time
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(d): #根据数字绘制七段数码管
drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
# drawDate('2018-10=10+')
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done()
main()

代码复用和函数递归

代码复用与模块化设计

-函数和对象是代码复用的两种主要形式。
-模块化设计:分而治之。具体包括主程序、子程序和子程序之间的关系。

函数递归的理解

-函数定义中调用函数自身的形式。

函数递归的调用过程

函数+分支语句
-递归本身是一个函数,需要函数定义方式描述;
-函数内部,采用分支语句对输入参数进行判断;
-基例和链条,分别编写对应代码;

函数递归实例解析

1
2
3
4
5
6
#字符串反转
def rvs(s):
if s=="":
return s
else:
return rvs(s[1:]+s[0])
1
2
3
4
5
6
#斐波那契数列
def f(n):
if n==1 or n==2
return 1
else:
return f(n-1)+f(n-2)
1
2
3
4
5
6
7
8
9
10
11
12
13
#汉诺塔
count = 0
#n号小圆盘从src到dst,mid作为过渡
def hanoi(n,src,dst,mid):
global count
if n==1:
print("{}:{}->{}".format(1,src,dst))
countt +=1
else:
hanoi(n-1,src,mid,dst)
print("{}:{}->{}".format(n,src,dst))
count +=1
hanoi(n-1,mid,dst,src)

PyInstall库使用

PyInstall库概述

将 .py源代码转换成无需源代码的可执行文件,是一个第三方库。

PyInstall库使用

在文件目录下进入命令行: pyinstaller -F <文件名.py>

实例:科赫雪花小包裹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#科赫曲线绘制
#KochDrawV1.py
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(800,400)
turtle.penup()
turtle.goto(-300, -50)
turtle.pendown()
turtle.pensize(2)
koch(600,3) # 0阶科赫曲线长度,阶数
turtle.hideturtle()
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#科赫雪花绘制
#KochDrawV2.py
import turtle
def koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 3 # 3阶科赫雪花,阶数
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()

以上。

:转载文章请注明出处,谢谢~