Python_note5 函数和代码复用+PyInstaller库+数码管绘制

本文深入探讨了函数的定义、使用及其在代码复用中的作用,解析了参数传递、返回值、局部与全局变量的概念,介绍了lambda函数和递归的应用,并讨论了模块化设计的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的定义与使用
  • 函数定义时,参数是输入、函数是处理、结果是输出IPO
  • 实参代替形参—调用;可以有参数,也可以没有参数,必须有括号
  • 有默认值的可选参数在非可选参数之后def fun(<非可选参>,<可选参>):
  • 可变参数传递
#计算n!再乘未知个数的数
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)   #10!*3*5*8
  • 参数传递
    def fact(n,m=1):位置传递fact(10,5);名称传递fact(m=5,n=10)
  • 函数返回值
    可返回0或多个结果 return s//m,n,m返回形式(73223,10,5)元祖类型(,)
  • 局部和全局变量
    局部变量是函数内部的占位符,函数结束后释放,基本数据类型无论是否重名都不同
    使用global保留字在函数内部使用全局变量
    局部变量为组合数据类型且未真实创建,等同于全局变量ls
ls = ['s','dd']#使用[]真实创建一个全局变量列表ls
def func(a):
	ls.append(a)
	return
func("C");print(ls)
lambda函数[特殊]

lambda函数返回函数名作为结果,没有名字的函数(匿名函数)—一般用def
使用lambda保留字定义简单的、在一行内表示的函数 <函数名>=lambda<参数>:<表达式>

f = lambda x , y : x + y
#>>>f(10,15)#得25
f = lambda : “lambda函数”
print(f())
实例7:七段数码管绘制

起点处海龟朝向x轴正方向

#sevenDigtial.py
import turtle as t
import time
def drawGap():#为了美观增加间隔
    t.penup()
    t.fd(5)
def drawLine(draw):
    drawGap()
    t.pendown() if draw else t.penup()
    t.fd(40)
    drawGap()
    t.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)
    t.left(90)#走完第四段回到起点头仍转向X轴正方,左手边转90海龟朝Y轴正向
    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)#走完第七段方向为X负轴
    t.left(180)#海龟转向X正轴
    t.penup()
    t.fd(20)#向右跳一段距离绘制下个数字
def drawDate(date):#date为日期格式"%Y-%m+%d="对应于-+=绘制年月日汉字t.write
    t.pencolor("green")
    for i in date:
        #t.pencolor("green")此处设置red导致后续颜色设置失效
        if i == '-':
            t.write('年',font=("Arial",18,"normal"))#输出到年都为红色
            t.pencolor("red")
            t.fd(40)
        elif i == '+':
            t.write('月',font=("Arial",18,"normal"))
            t.pencolor("blue")
            t.fd(40)
        elif i == '=':
            t.write('日',font=("Arial",18,"normal"))
        else:
            drawDigit(eval(i))#字符串转数字并画出
def main():
    t.setup(900,350,200,200)#画布大小,相对位置
    t.penup()
    t.fd(-400)#起点(300,0)
    t.pensize(5)
    drawDate(time.strftime("%Y-%m+%d=",time.gmtime()))#获取计算机格式时间并转换为固定格式
    t.hideturtle()#绘制完毕隐藏turtle
    t.done()
main()

模块化思维(确定模块接口封装功能);规则化思维(抽象过程为规则自动执行);化繁为简

代码复用与函数递归
  • 函数和对象是代码复用的两种主要形式;函数在代码层面建立初步抽象;对象在函数之上再次组织进行抽象,属性和方法<a>.<b>和<a>.<b>()
  • 模块化设计 分而治之
    通过函数或对象封装将程序划分为模块及模块间的表达;具体包括:主程序、子程序、和子程序间的关系;分而治之是一种分而治之,分层抽象,体系化的设计思想
    紧耦合:两部分间交流很多,无法独立存在;松耦合:两部分间交流很少,可独立存在
    模块内部紧耦合,模块之间松耦合
  • 递归 — 数学归纳法在编程中的体现
    关键特征存在链条(计算过程中递归链条)和基例(一个或多个不需要再次递归部分)
    字符串反转斐波那契汉诺塔
    切片 s[::-1]
    递归
def rvs(s):
	if s == "" :
		return s
	else :
		return rvs[1:] + s[0]#第一步看成第一个字符与后面所有的反转
count = 0
def hanoi(n,src,dst,mid):
	global count
	if n == 1 :#基例
		print("{}:{}->{}".format(1,src,dst))
	else :#链条
		hanoi(n-1,src,mid,dst)#n-1搬到mid
		print("{}:{}->{}".format(n,src,dst))#最下面的搬到dst
		count += 1
		hanoi(n-1,mid,dst,src)

在这里插入图片描述

模块4:PyInstaller库的使用

系统未安装idle或者解释器,将.py源代码转换成无需源代码的可执行文件,如exe(windows)
PyInstaller第三方库需要用pip工具安装 download
windows cmd命令行pip install pyinstaller
pyinstaller -i curve.ico -F <**.py>

实例8:科赫雪花小包裹

分形集合是一种迭代的几何图形,广泛存在。科赫曲线也叫雪花曲线
取一条直线,中间去掉三分之一,并由60°夹角的两条线连接原来断裂的两个三分之一线段(共4段三分之一线段);新的每条小线段继续做科赫曲线----二阶

#KochDraw.py
import turtle as t
def koch(size,n):
    if n == 0:
        t.fd(size)
    else :
        for angle in [0,60,-120,60]#递归
            t.left(angle)
            koch(size/3,n-1)
def main():
    t.setup(600,600)
    t.penup()
    t.goto(-200,100)
    t.pendown()
    t.pensize(2)
    level=3
    koch(400,level)#将一个400长度的等边三角形 每个边画出3阶科赫曲线
    t.right(120)#转动 等边三角形边长夹角
    koch(400,level)
    t.right(120)#等边三角形边长夹角
    koch(400,level)
    t.hideturtle()
main()

科赫曲线基础设置修改如修改成凸形,封闭基础图不选等边三角选五边形八边形形成变化

### 使用NuitkaPyInstaller一起打包Python应用程序 当考虑使用NuitkaPyInstaller打包Python应用时,主要目标是利用两者的优势以获得更优化的应用程序包。Nuitka是一个Python到C++的编译器,能够将Python源码转换成高效的机器代码;而PyInstaller则专注于创建独立可执行文件。 对于希望结合二者特性的开发者来说,通常先通过Nuitka编译部分关键模块或整个项目为二进制形式[^1]。这一步骤可以显著提升性能并保护知识产权。接着,在已经预处理过的代码基础上运行PyInstaller,从而构建最终分发版本。 具体操作流程如下: #### 准备工作 确保安装了最新版的Nuitka以及PyInstaller工具: ```bash pip install nuitka pyinstaller ``` #### 编译阶段 采用Nuitka对选定脚本进行静态编译,生成对应的`.exe`或其他平台特定格式的目标文件。这里假设有一个名为`main.py`的应用入口点。 ```bash nuitka --standalone main.py ``` 此命令会尝试把尽可能多的内容转化为本地代码,并放置在一个单独目录内。 #### 打包过程 随后借助PyInstaller进一步封装上述由Nuitka产生的成果物。需要注意的是,此时应指定正确的输入路径指向之前Nuitka输出的结果位置。 ```bash pyinstaller --onefile ./dist/main.dist/main.exe ``` 此处假定Nuitka默认情况下会在当前项目的根目录下建立一个叫做`dist`的新文件夹用于存放其产物,其中包含了被编译后的主程序副本以及其他依赖资源。 这种组合方式不仅有助于提高效率,还能增强安全性,因为经过Nuitka转化的部分难以反向工程解析原始逻辑结构[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值