5.1函数的定义与使用
1.函数是一段代码的表示
- 特定功能的、可重用的语句组
- 两个作用:降低编码难度+代码复用
def <函数名>(<参数0个或多个>):
<函数体>
return <返回值>
- 函数是一种IPO的实现(输入-处理-输出)
- 调用是运行函数代码的方式
2.函数的参数
①可以有参数,也可以没有,但别必须保留括号
②可选参数:某些参数指定默认值,且可选参数要放在非可选参数后面,如下:(就是某些参数是函数内部设定了的,你可以在调用函数时对其进行更改设置,也可不操作,默认系统值)
③可选参数传递: 设计可变数量参数—即不确定参数总个数
*b也可以时*a、*c
max和min函数实际定义就使用了*b的方式。它的参数就是不确定的
④参数传递的两种方式:按照位置或名称方式传递参数
指的是调用函数时,实际参数到形式参数的传递
3.函数的返回值
返回值为多个时,如果只赋值给一个变量,则它为元组类型;也可分开赋值
4.局部变量和全局变量
对于组合类型,函数体内部的一个局部变量没有被创建,但它等同于一个全局变量名字,则它就是那个全局变量,即规则二
5.lambda函数
谨慎使用lambda来定义匿名函数
5.2 实例:七段数码管绘制
5.3 代码复用与函数递归
把子程序当作模块内部(例如函数),主程序当作模块间的关系
递归:函数定义中调用函数自身的方式
① 两个关键特征:链条+基例
+ 链条:计算过程中存在递归链条关系
+ 基例:存在一个或多个不需要再次递归的实例(递归的最末端)
②递归的实现:由函数+分支语句来实现
函数+分支结构
基例
链条
eg1:采用递归方式对字符串进行反转
def rvs(s):
if s == "":
return s
else:
return rvs(s[1:])+s[0]
a = rvs("abcde")
print(a)
eg2:斐波那契数列
def f(n):
if n == 1 or n == 2:
return 1
else:
return f(n-1)+f(n-2)
eg3:汉诺塔
count = 1
def hanoti(n,a,c,b): #本来完成的目标是把n个盘子都移过去
if n == 1 :
print("{}:{}->{}".format(n,a,c))
count += 1
else:
hanoti(n-1,a,b,c)# 假设先把上面n-1个盘子移到b盘,不管如何移动的,反正就是链条关系,让程序自己去推
count += 1 # 把a最下面的大盘子移到最终的C盘,由于一次只能移动一个盘子,因此此处程序计数为1,而不再是递归
hanoti(n-1,b,c,a)# 再把b柱剩余的N-1个大盘子全部移到c柱,此时调用本身的函数,再次递归
5.4 PyInstaller库的使用
作用:将python源代码(.py)转换成可无需源码的可执行文件(.exe),类似编译一次性生成目标代码。
生成后的文件可以直接在任何电脑上运行,不需要安装python解释器等任何软件
注意:pyinstaller不是在IDLE环境中执行的,而是cmd命令!!!
_pycache 和build是可以删除的
5.5 科赫雪花小包裹
eg1:科赫曲线
eg2:科赫雪花:其实就是对三角形的每一个边进行绘制
测验程序题:
def prime(m):
for i in range(2,m):
if m % i == 0:
return False
return True #注意此缩进。如果是放进for循环中,那么就相当于else。
#但这里应该判断所有的余数是否为0,因此放在for循环外部
n = eval(input())
N = int(n)
count = 0
while count < 5:
if prime(N):
if count == 4:
print(N,end="")
else:
print(N,end=",")
count = count + 1 # 还有count的对应关系
N = N + 1