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库,好像有点问题,后边我再调调搜搜康康啥问题吧。