嵩天老师Python语言程序设计第五周练习

注意一个IDLE使用的点:编辑用undo和redo可以实现撤销操作

关于if-else语句的简化使用https://www.cnblogs.com/xiexiaoxiao/p/7772441.html

单行if-else语句用法
True Fulse的使用

练习1 七段数码管绘制

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(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)
    t.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)
    t.left(180)
    t.penup()
    t.fd(20)
def drawDate(date):
    t.pencolor("red")
    for i in date:
            drawDigit(eval(i))
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.done()
main()

主要是注意当前时间怎么取,这一部分还没有掌握住

练习2 科赫雪花小包裹

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)     
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.hideturtle()

try:
    level = eval(input("请输入科赫曲线的阶: "))
    main(level)
except:
    print("输入错误")

一个非常好的函数递归的实例,主要注意用数学思想来拆解问题。
当n=1时,当n>1时分别是什么样的情况,有什么规律。
用数学来把问题形容出来,再用python语言表示出来。

练习3 任意累积

def cmul(a, *b):
    m = a
    for i in b:
        m *= i
    return m

print(eval("cmul({})".format(input())))

该程序需要注意两个内容:

  1. 无限制数量函数定义的方法,其中b在函数cmul中表达除了a之外的所有输入参数;

  2. 以字符串形式调用函数的方法,"cmul()"与eval()的组合,提供了很多灵活性。

练习4 斐波那契数列计算

def fbi(n):
    if n == 1 or n == 2:
        return 1 
    else:
        return fbi(n-1) + fbi(n-2)

n = eval(input())
print(fbi(n))

注意return的使用,应该使用return返回值

练习5 汉诺塔问题

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)

非常经典的问题,将移动圆盘的整个流程拆解为3步

  1. 将n-1个圆盘移动到中间过渡柱子上
  2. 然后将剩余的最大圆盘从A移动到C柱子上
  3. 最后将中间过渡柱子上的n-1个圆盘移动到C柱子上(进入下一次循环)

从n一直递归到1
注意函数的4个变量,位置一直在发生变化。
意思是函数后定义的多个变量,是以顺序来代表的?????

传参方式
(1) 位置传参
定义def fun(x,y,z),调用 fun(1,2,3),按照参数定义顺序传入实参.
(2) 关键字传参
定义时def fun(x, y, z),调用使用 fun(x=1, y=3, z=5),使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同
要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的

def fun(x, y, z):  
     pass
fun(1,2,3)  
fun(x=10,z=15,y=20)#  关键字传参不考虑传参的顺序,但个数要一致.可以用位置和关键字一同传参.
fun(12,y=20,z=10)# 关键与位置传参组合使用

def add(x=20,y):#  错误 关键字缺省值不能写前
     return x+y
add(y=10,10) #错误关键字传参不能写前面  

def函数的使用与相关操作参考https://blog.csdn.net/qq_40498551/article/details/89278247

你可能感兴趣的:(笔记)