函数是一段代码的表示
编程难度
和代码复用
def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>
调用是运行函数代码的方式
函数的调用过程大致如下:
当调用一个函数时,Python 会在当前作用域中查找该函数的定义。如果找到了,就会开始执行该函数的代码。
在执行函数之前,Python 会创建一个新的局部作用域。该作用域包含函数的参数、函数内部定义的变量以及任何在函数内部创建的变量。
在函数内部,Python 会按照顺序执行函数体中的语句。在执行函数体中的语句时,所有的变量引用都会在当前作用域中解析。
当遇到 return 语句时,函数会终止执行,并将 return 后面的值返回给调用者。如果函数没有 return 语句,则会返回 None。
在函数执行完毕后,Python 会删除该函数的局部作用域,并将控制权返回给调用者。
函数个数:
def <函数名>():
<函数体>
return <返回值>
可选参数传递:
def <函数名>(<非可选参数>, <可选参数>):
<函数体>
return <返回值>
函数调用时,参数可以按照位置或名称方式传递
函数可以返回0个或多个结果
局部变量和全局变量是指变量的作用域。
局部变量是在函数内部定义的变量,只能在该函数内部访问。当函数执行完毕后,局部变量的作用域就会结束,这些变量也就被销毁了。
全局变量是在函数外部定义的变量,可以在任何地方被访问,包括函数内部。
如果在函数内部尝试修改全局变量的值,需要使用 global
关键字声明变量,否则 Python 会将其视为一个新的局部变量。
局部变量为组合数据类型且未创建,等同于全局变量
lambda函数返回函数名作为结果
语法:
<函数名> = lambda <参数>: <表达式>
示例:
my_list = [1, 2, 3, 4, 5]
new_list = list(map(lambda x: x * 2, my_list))
print(new_list) # 输出 [2, 4, 6, 8, 10]
# 结果
[2, 4, 6, 8, 10]
开发思路:
步骤一:绘制单个数码管
步骤二:获取一段数字,绘制多个数码管
步骤三:获得当前系统时间,绘制对应的数码管
代码:
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()
效果:
代码复用:
把代码当成资源进行抽象
函数 和 对象 是代码复用的两种主要方式
函数:将代码命名在代码层面建立了初步抽象
对象:属性和方法,在函数之上再次组织进行抽象
模块化设计:
分而治之
紧耦合和松耦合
紧耦合(Tight coupling)指的是模块之间的依赖关系非常强,一个模块的修改会直接影响到其他模块的运行。这种情况下,模块之间的耦合度很高,代码难以维护和修改。
在Python中,紧耦合的例子可能是实例化一个类时,需要显式地传递其他类的实例对象作为参数,或者在类的方法中直接引用其他类的实例对象。
松耦合(Loose coupling)指的是模块之间的依赖关系相对较弱,一个模块的修改不会对其他模块造成太大的影响。这种情况下,模块之间的耦合度较低,代码更容易维护和修改。
在Python中,松耦合的例子可能是使用接口或回调函数来实现模块之间的通信,或者使用中间件或框架来解耦模块之间的依赖。
递归的定义:
递归是指函数直接或间接地调用自身的过程。在一个递归的过程中,函数会不断地调用自身,直到满足某个条件才停止递归。
有两个关键特征:
递归的实现:
需要函数+分支语句
示例:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5))
该函数接受一个整数参数n,如果n为0,则返回1;否则返回n与factorial(n-1)的乘积。
例如,factorial(5)的计算过程如下:
factorial(5)
= 5 * factorial(4)
= 5 * 4 * factorial(3)
= 5 * 4 * 3 * factorial(2)
= 5 * 4 * 3 * 2 * factorial(1)
= 5 * 4 * 3 * 2 * 1 * factorial(0)
= 5 * 4 * 3 * 2 * 1 * 1
= 120
递归函数需要注意以下几点:
PyInstaller是第三方库
官网:https://pyinstaller.org/
使用前要先安装
安装第三方库可以使用pip安装
pip install pyinstaller
将.py源代码转换成无需源代码的可执行文件
.py——>PyInstaller——>{Linux、Winodws、Mac OS}
在命令行模式输入:
pyinstaller -F
常用参数:
代码:
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()
turtle.done()
main()
效果:
生成小包裹:注意名称
pyinstaller -i test.ico -F test1.py