5 Python函数和代码的复用

函数和代码的复用

一、函数的定义与使用

1.理解与定义

-函数是一段具有特定功能的、可重用的语句组

-函数的作用:降低编程难度和代码复用

2.使用及调用过程
def fact(n):                 #定义函数
    s=1
    for i in range(1,n+1):
        s*=i
    return s

fact(10)                     #调用函数
3.参数传递

①普通参数

②可选参数,赋初值

③可变参数

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)
10886400
>>> fact(10,3,5,8)
435456000
4.返回值
5.局部变量和全局变量
6.lambda函数

-lambda函数是一种匿名函数,返回值是函数名,紧凑表达方式

<函数名>=lambda<参数>:<表达式>

>>> f=lambda x,y:x+y
>>> f(2,7)
9
>>> f=lambda:"lambda函数"
>>> print(f())
lambda函数

二、实例7:七段数码管绘制

1.分析

①绘制单个数字对应的数码管

②获得一串数字,绘制对应数码管

③获得当前系统时间,绘制对应数码管

在这里插入图片描述

2.实例讲解
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))

def main():
    turtle.setup(800,350,200,200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20201022')
    turtle.hideturtle()
    turtle.done

main()

在这里插入图片描述

获取当前系统时间:

import time
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):      #date为日期,格式 '%Y-%m=%d+','-=+'分别对应年月日
    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(-300)
    turtle.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
    turtle.hideturtle()
    turtle.done
main()

在这里插入图片描述

三、代码复用与函数递归

1.代码复用与模块化设计

①可以使用函数或对象通过封装将功能进一步抽象

②模块化设计(分而治之)

-通过函数或对象封装将程序划分为模块及模块间的表达

-具体包括:主程序、子程序间的关系

-模块内部紧耦合,模块之间松耦合

  • 紧耦合:两个部分之间交流很多,无法独立存在
  • 松耦合:两个部分之间交流较少,可以独立存在
2.函数递归

递归的实现:函数+分支语句

①将字符串反转后输出

>>> s[::-1]
'54321'
#递归实现
>>> def rvs(s):
	if s =="":
		return s
	else:
		return rvs(s[1:])+s[0]    #将首字符放到其余字符之后
	
>>> rvs("abcdefg")
'gfedcba'
>>> s="12345"

②汉诺塔

>>> 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(3,'A','B','C')
1:A->B
2:A->C
1:B->C
3:A->B
1:C->A
2:C->B
1:A->B

四、模块4:PyInstaller库的使用

1.PyInstaller是第三方库

-官方网站:http://www.pyinstaller.org

-安装第三方库需要使用pip工具

-在cmd命令行中输入

pip install pyinstaller
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.使用pyinstaller
pyinstaller -F 文件名.py

① -h:查看帮助

② --clean:清理打包过程中的临时文件

③ -D,–onedir:默认生成dist文件夹

④ -F,–onfile:在dist文件夹中只生成独立的打包文件

⑤ -i <图标.ico>:指定打包程序使用的图标文件icon

五、实例8:科赫雪花小包裹

1.分析

①分形几何:具有迭代关系的几何图形(整体与局部具有很相似的特点)

②科赫曲线/雪花曲线:

在这里插入图片描述

2.三阶科赫雪花
#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(600,600)
    turtle.penup()
    turtle.goto(-200,100)
    turtle.pendown()
    turtle.pensize(2)
    level=3                   #三阶科赫雪花
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.hideturtle()

main()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值