第五周学习:函数和代码复用

1.函数的定义与使用

1>函数的理解与定义
降低编码难度,代码复用
def <函数名> (<参数(0个或多个)>):
<函数体>
return <返回值>

2>函数的使用和调用过程
调用时给出实际参数

3>函数的参数传递
可有参数,也可无参数,但()必须保留
def <函数名>():
<函数体>
return <返回值>
-函数定义时,可为某些参数指定默认值,构成可选参数。
def <函数名>(<非可选参数>,<可选参数>):#可选参数必须在非可选参数后边
<函数体>
return <返回值>
eg:

在这里插入图片描述
-函数定义时,可以设计可变数量参数,即不确定参数总数。
def <函数名>(<参数>,*b):
<函数体>
return <返回值>
eg:
在这里插入图片描述
-函数调用时,参数可以按照位置或者名称方式传递。
在这里插入图片描述

4>函数的返回值
0个或多个返回值
返回值可有可无,return也可有可无。
在这里插入图片描述

5>局部变量和全局变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6>lambda函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.实例:七段数码管绘制

#SevenDigitsDrawV1.py
import turtle as t
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)
    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)
    t.left(180)
    t.penup()#为绘制后续数字确定位置
    t.fd(20)#为绘制后续数字确定位置
def drawDate(date):#获得要输出的数字
    for i in date:
        drawDigit(eval(i))#通过eval函数将数字变为整数
def main():
    t.setup(800,350,200,200)
    t.penup()
    t.fd(-300)
    t.pensize(5)
    drawDate('20200802')
    t.hideturtle()
    t.done()
main()

在这里插入图片描述

#SevenDigitsDrawV2.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)
    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)
    t.left(180)
    t.penup()#为绘制后续数字确定位置
    t.fd(20)#为绘制后续数字确定位置
def drawDate(date):#data为日期,格式为'5Y-%m=%d+'
    t.pencolor("red")
    for i in date:
        if i=='-':
            t.write('年',font=("Arial",18,"normal"))
            t.pencolor("green")
            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))#通过eval函数将数字变为整数 
def main():
    t.setup(800,350,200,200)
    t.penup()
    t.fd(-300)
    t.pensize(5)
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
    t.hideturtle()
    t.done()
main()

在这里插入图片描述

3.代码复用与函数递归

1>代码复用与模块化设计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2>代码复用与函数递归
在这里插入图片描述
在这里插入图片描述

3>函数递归的调用过程

在这里插入图片描述

在这里插入图片描述
递归的调用过程
在这里插入图片描述

4>实例
字符串反转

def rvs(s):
    if s=="":
        return s
    else:
        return rvs(s[1:])+s[0]
 ss=rvs("ABCDEFGHI")   #例子
 print(ss)
     

斐波那契数列

def f(n):
    if n==1 or n==2:
        return 1
    else:
        return f(n-1)+f(n-2)
s=f(5)  #例子
print(s)

汉诺塔问题

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(3,"A","C","B")#例子
print(count)

4.PyInstaller库的使用

1>pyinstaller库基本介绍
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2>pyinstaller库使用说明
在这里插入图片描述
在这里插入图片描述

5.实例:科赫雪花小包裹

#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(800,400)
    t.penup()
    t.goto(-300,-50)
    t.pendown()
    t.pensize(2)
    koch(600,3)#3阶科赫曲线,阶数
    t.hideturtle()
main()
#KochDrawV1.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#3阶科赫曲线,阶数
    koch(400,level)
    t.right(120)
    koch(400,level)
    t.right(120)
    koch(400,level)
    t.hideturtle()
main()

在这里插入图片描述

6.练习们呗,还能是啥子嘛

1>实例8:科赫雪花小包裹
描述
这是"实例"题,与课上讲解实例相同,请作答检验学习效果。
科赫曲线,也叫雪花曲线。绘制科赫曲线。
请补充编程模板中代码,完成功能:获得用户输入的整数N,作为阶,绘制N阶科赫曲线。

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(level):
    turtle.setup(600,600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    koch(400,level)
    t.right(120)
    koch(400,level)
    t.right(120)
    koch(400,level)
    t.hideturtle()
try:
    level = eval(input("请输入科赫曲线的阶: "))
    main(level)
except:
    print("输入错误")

2>任意累积
描述
请根据编程模板补充代码,计算任意个输入数字的乘积。
注意,仅需要在标注…的地方补充一行或多行代码。

def cmul(*b):
    s=1
    for item in b:
        s*=item
    return s  
print(eval("cmul({})".format(input())))

3>汉诺塔实践
描述
汉诺塔问题大家都清楚,这里不再赘述。
请补充编程模板中代码,完成如下功能:
有三个圆柱A、B、C,初始时A上有N个圆盘,N由用户输入给出,最终移动到圆柱C上。
每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP是步骤序号,宽度为4个字符,右对齐。
请编写代码,获得输入N后,输出汉诺塔移动的步骤。
输入格式
一个整数
输出格式
每个步骤一行,每行参考格式如下:[STEP 10] A->C

steps = 0
def hanoi(src, des, mid, n):
    global steps
    if n == 1:
        steps+=1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
        
    else:
        hanoi(src,mid,des,n-1)
        steps+=1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
        hanoi(mid,des,src,n-1)
N = eval(input())
hanoi("A", "C", "B", N)

4>随机密码生成
描述
补充编程模板中代码,完成如下功能:
以整数17为随机数种子,获取用户输入整数N为长度,产生3个长度为N位的密码,密码的每位是一个数字。每个密码单独一行输出。
产生密码采用random.randint()函数。

import random
def genpwd(length):
    a = 10**(length-1)
    b = 10**length - 1
    return "{}".format(random.randint(a, b))
length = eval(input())
random.seed(17)
for i in range(3):
    print(genpwd(length))

5>连续质数计算
描述
补充编程模板中代码,完成如下功能:
获得用户输入数字N,计算并输出从N开始的5个质数,单行输出,质数间用逗号,分割。
注意:需要考虑用户输入的数字N可能是浮点数,应对输入取整数;最后一个输出后不用逗号。

def prime(m):
    for i in range(2,m):
        if m % i == 0:
            return False
    return True
n = eval(input())
n_ = int(n)
n_ = n_+1 if n_ < n else n_
count = 5
while count > 0:
    if prime(n_):
        if count > 1:
            print(n_, end=",")
        else:
            print(n_, end="")
        count -= 1 
    n_ += 1

**这个代码注意:
(1) 需要对输入小数情况进行判断,获取超过该输入的最小整数(这里没用floor()函数);
(2) 对输出格式进行判断,最后一个输出后不增加逗号(这里没用.join()方法)。

7.总结

嘿嘿~依然是水的一天,笔记没好好做,都是直接贴的图片!突然没有动力就是hin不想动。。。
(还有就是我电脑没下来那个pyinstaller库,好像有点问题,后边我再调调搜搜康康啥问题吧。

猜你喜欢

转载自blog.csdn.net/weixin_45800653/article/details/107741450