第五周

一、函数的定义与使用

函数的理解与定义

def <函数名>(参数,可以没有参数则用空括号):
	<函数体>
	return <返回值>

函数的参数传递
必选与可选参数

def <>(<必选参数>,<可选参数>):
	<>
	return <>
可选参数的意义在于如果调用时没有给就按默认
def fact(n,m=1)

可变参数数量

def <>(<>,*b)

def fact(n,*b):
	s=1
	for i in range(1,n+1):
		s*=i
	for item in b:
		s*=item
	return s
输入:fact(10,3,5,8)
返回:435456000

函数的参数名称传递

对于函数:
def fact(n,m=1):
调用时可以使用:
def fact(m=10,n=1)与顺序无关

函数的返回值
可以有也可以没有(return+空或者没有return)
多返回值以元组类型返回

局部变量和全局变量

  • 可以用global保留字在函数内部使用全局变量
n,s = 10,100
def fact(n):
	global s
	...(此处对s进行各种运算)
	return s
以上在函数中出现的所有s都是全局变量s了
  • 局部变量为组合数据类型且未创建,等同于全局变量
ls = ['F','f']
def func(a):
	ls.append(a)
	return
func("C")
#result:['F','f','C']
如果在def内部加一句 
ls = []
则局部变量被真实创建了,则代码的输出无C

lambda函数
定义:lambda函数为没有名字的函数;函数名是返回结果;用于定义简单的,能够在一行内表达的函数

<函数名> = lambda<参数>:<表达式>
注意该紧凑形式后面加的是表达式而不是完整语句

>>f = lambda x,y : x+y
>>f(10,15)
25

常用与某些特殊的固定搭配

二、实例:七段数码管

python嵩天第二版答案第八章 python嵩天第二版答案第五章_递归

规则化思维:没有根据不同的数字走不同的路径,而是无论什么数字都走七步,将这种过程变成规则
模块化思维:大程序化成小函数,分而治之

三、代码复用与函数递归

代码复用与模块化设计
函数是对代码的抽象
紧耦合:两个部分交流很多,无法独立存在
松耦合:两个部分交流(参数和返回值)很少,可以独立存在

函数递归
链条:n和n-1之间的关系
基例:存在一个或者多个不需要再次递归的基例

def fact(n):
	if n == 0:
		return 1
	else:
		return n*fact(n-1)

特征:

  • 递归是一个函数,需要调用
  • 创建递归逻辑时考虑:函数&分支结构 + 链条 + 基例
  • 实例:
#字符串反转
法1:
s[::-1]
法2:
def rvs(s):
	if s == '':
		return s
	else:
		return rvs(s[1:])+s[0]
		
#汉诺塔问题
将n个圆盘化简为n-1个盘在中间柱,1个在目标柱
count = 0
def hanoi(n,src,dst,mid):
	global count
	if n == 1:
		print("{}:{}->{}".format(1,src,dst))
		count += 1
	else:
		hanoi(n-1,src,mid,dst)
		print("{}:{}->{}".format(n,src,dst))
		count += 1
		hanoi(n-1,mid,dst,src)
#hanoi函数没有返回值,包含的操作是打印移动的步骤!所以要理解else里面那几步

四、PyInstaller库的使用

功能:源代码(.py)-> 可执行程序(.exe)
方式:

在.py所在目录中打开命令行,输入
>pyinstaller -F <文件名.py>即可

常用参数:
.ico后缀的图标文件可以用来作为可执行文件的图标,代码如下:

pyinstaller -i curve.ico -F DrawDigit.py