实验一

[问题描述]

编写函数,接收一个十进制整数为参数,返回等值的二进制数。

[基本要求]

  1. 输入:十进制整数。
  2. 处理:采用“除2取余,逆序排列”法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
  3. 输出:二进制整数
  4. 要求编写异常处理

参考代码

def decimal_to_binary(decimal: int):
    binary_str = []                                     # 初始化存放二进制的列表
    negative_num = True if decimal < 0 else False       # 判断是否为负数
    if decimal == 0:                                    # 参数为0则直接返回
        return '0'
    while decimal != 0:
        binary_str.insert(0, int(decimal % 2))          # 将每次除2取余的结果放在列表首位
        decimal = int(decimal / 2)                      # 将十进制数除以2
    binary_str.insert(0, '-' if negative_num else '')   # 如果十进制为负数,则在转换结果中添加负号
    return ''.join([str(i) for i in binary_str])        # 将转换结果连接成字符串再返回


if __name__ == '__main__':
    try:
        my_input = int(input('请输入整型数字:'))          # 将输入转换为整型
    except ValueError:                                    # 如果转换过程中产生异常,则输出提示信息
        print('异常:输入的数据类型有误')
    else:
        print('转换结果:' + decimal_to_binary(my_input)) # 调用函数并打印转换结果

运行结果

请输入整型数字:20
转换结果:10100

请输入整型数字:-20
转换结果:-10100

请输入整型数字:20.21
异常:输入的数据类型有误

请输入整型数字:gdf
异常:输入的数据类型有误

实验二

[问题描述]

使用DateTime库输出自己的出生日期。

[基本要求]

对自己的生日输出不少于10种日期格式。

参考代码

from datetime import datetime


def birthday_output(birthday_str):
    birthday = datetime.strptime(birthday_str, '%Y%m%d')
    print(birthday.strftime('%Y/%m/%d %A'))
    print(birthday.strftime('%m/%d/%Y'))
    print(birthday.strftime('%Y年%m月%d日'))
    print(birthday.strftime('%A, %d %B %Y'))
    print(birthday.strftime('%Y-%b-%d'))
    print(birthday.strftime('%Y %B %d'))
    print(birthday.strftime('%x'))
    print(birthday.strftime('%c'))
    print(birthday.isocalendar())       # 返回一个元组 (ISO 年份, ISO 周序号, ISO 周日期)
    print(birthday.isoformat())         # ISO 8601标准时间
    print(datetime.timestamp(birthday))  # 时间戳


if __name__ == '__main__':
    my_birthday = '20000221'
    birthday_output(my_birthday)

运行结果

2000/02/21 Monday
02/21/2000
2000年02月21日
Monday, 21 February 2000
2000-Feb-21
2000 February 21
02/21/00
Mon Feb 21 00:00:00 2000
datetime.IsoCalendarDate(year=2000, week=8, weekday=1)
2000-02-21T00:00:00
时间戳 951062400.0

补充知识点

类名描述
datetime.date日期类
datetime.time时间类
datetime.datetime日期与时间类
datetime.timedelta表示两个 date、time、datetime 实例之间的时间差
datetime.tzinfo时区相关信息对象的抽象基类
datetime.timezone实现 tzinfo 抽象基类的类,表示与 UTC 的固定偏移量

属性或方法描述
datetime.today()返回一个表示当前本期日期时间的 datetime 对象
datetime.now([tz])返回指定时区日期时间的 datetime 对象,如果不指定 tz 参数则结果同上
datetime.utcnow()返回当前 UTC 日期时间的 datetime 对象
datetime.fromtimestamp(timestamp[, tz])根据指定的时间戳创建一个 datetime 对象
datetime.utcfromtimestamp(timestamp)根据指定的时间戳创建一个 datetime 对象
datetime.combine(date, time)把指定的 date 和 time 对象整合成一个 datetime 对象
datetime.strptime(date_str, format)将时间字符串转换为 datetime 对象
dt.year, dt.month, dt.day年、月、日
dt.hour, dt.minute, dt.second时、分、秒
dt.microsecond, dt.tzinfo微秒、时区信息
dt.date()获取 datetime 对象对应的 date 对象
dt.time()获取 datetime 对象对应的 time 对象,tzinfo 为 None
dt.timetz()获取 datetime 对象对应的time对象,tzinfo 与 datetime 对象的 tzinfo 相同
dt.replace()生成并返回一个新的 datetime 对象,如果所有参数都没有指定,则返回一个 与原 datetime 对象相同的对象
dt.timetuple()返回 datetime 对象对应的 tuple (不包括 tzinfo)
dt.utctimetuple()返回 datetime 对象对应的 utc 时间的 tuple(不包括 tzinfo)
dt.timestamp()返回datetime对象对应的时间戳,Python 3.3才新增的
dt.toordinal()同 date 对象
dt.weekday()同 date 对象
dt.isocalendar()同 date 对象
dt.isoformat([sep])返回一个“%Y-%m-%d”字符串
dt.ctime()等效于 time 模块的 time.ctime(time.mktime(d.timetuple()))
dt.strftime(format)返回指定格式的时间字符串

指令意义
%a当地工作日的缩写。
%A本地化的星期中每日的完整名称。
%w以十进制数显示的工作日,其中0表示星期日,6表示星期六。
%d补零后,以十进制数显示的月份中的一天。
%b当地月份的缩写。
%B本地化的月份全名。
%m补零后,以十进制数显示的月份。
%y补零后,以十进制数表示的,不带世纪的年份。
%Y十进制数表示的带世纪的年份。
%H以补零后的十进制数表示的小时(24 小时制)。
%I以补零后的十进制数表示的小时(12 小时制)。
%p本地化的 AM 或 PM 。
%M补零后,以十进制数显示的分钟。
%S补零后,以十进制数显示的秒。
%f以十进制数表示的微秒,在左侧补零。
%zUTC 偏移量,格式为±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串)。
%Z时区名称(如果对象为简单型则为空字符串)。
%j以补零后的十进制数表示的一年中的日序号。
%U以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。
%W以十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周。
%c本地化的适当日期和时间表示。
%x本地化的适当日期表示。
%X本地化的适当时间表示。
%%字面的'%' 字符。


实验三

[问题描述]

通过turtle库函数绘制七段数码管形式的日期。

[基本要求]

1.输入:当前日期的数字形式。

2.处理:根据每个数字绘制七段数码管显示。

3.输出:绘制当前日期的七段数码管表示

4.要求:通过设计函数复用数字的绘制过程。请适当为代码添加注释。

参考代码

import datetime
import turtle
import random


def drawGap():  # 绘制数码管间隔
    turtle.penup()      # 抬起画笔
    turtle.fd(5)        # 在当前方向上前进5像素


def drawLine(draw):  # 绘制单段数码管
    drawGap()           # 绘制数码管每段之间的间隔
    turtle.pendown() if draw else turtle.penup()    # 需要绘制时就落下画笔,否则抬起画笔
    turtle.fd(40)       # 当前方向前进40像素
    drawGap()
    turtle.right(90)    # 画笔方向顺时针旋转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)
    turtle.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)
    turtle.left(180)    # 将画笔方向调为水平
    turtle.penup()      # 抬起画笔
    turtle.fd(20)       # 前进20像素


def draw_date(date):
    word_list = ['时', '分', '秒', '', '年', '月', '日']
    for i in range(0, len(date), 2):
        turtle.pencolor(random.random(), random.random(), random.random())      # 随机画笔颜色
        drawDigit(eval(date[i]))
        turtle.pencolor(random.random(), random.random(), random.random())
        drawDigit(eval(date[i + 1]))
        if word_list[int(i/2)] != '':
            turtle.write(word_list[int(i/2)], font=("Arial", 28, "normal"))
            turtle.fd(40)
        if i == 4:      # 画完时间后换行再画日期
            turtle.right(180)
            turtle.fd(610)
            turtle.left(90)
            turtle.fd(120)
            turtle.left(90)


if __name__ == '__main__':
    now_time = datetime.datetime.now().strftime('%H%M%S%Y%m%d')
    turtle.setup(800, 400)
    turtle.penup()
    turtle.speed(8)  
    turtle.left(90)
    turtle.fd(100)
    turtle.right(90)
    turtle.fd(-280)
    turtle.pensize(5)
    draw_date(now_time)
    turtle.done()

运行结果

七段数码管绘制


实验四

[问题描述]

采用递归方式绘制科赫曲线。

[基本要求]

  1. 使用五阶科赫曲线绘制雪花图案。
  2. 修改代码,使得科赫曲线反向绘制。
  3. 修改科赫曲线的绘制颜色,随机取一个颜色。
  4. 为代码添加注释。

参考代码

import turtle
import random


def koch(size, n):
    if n == 0:
        turtle.fd(size)     # 在当前方向前进size距离
    else:
        for angle in [0, 60, -120, 60]:     # 遍历list
            turtle.right(angle)             # 箭头顺时针旋转一定角度
            koch(size / 3, n - 1)           # 递归


if __name__ == '__main__':
    turtle.setup(600, 600)      # 设置画布大小
    turtle.speed(0)             # 设置绘制速度 0为最快
    turtle.delay(0)             # 设置延迟,也是用来加快绘制速度
    turtle.penup()              # 抬起画笔
    turtle.goto(-200, 100)      # 画笔向左移动200像素,向上移动100像素
    turtle.right(60)            # 画笔顺时针旋转60度
    turtle.pencolor(random.random(), random.random(), random.random())  # 给画笔随机设置颜色
    turtle.pendown()            # 落下画笔
    turtle.pensize(2)           # 画笔大小
    level = 5                   # 科赫曲线阶数
    koch(400, level)            # 调用函数
    turtle.left(120)            # 画笔逆时针旋转120度
    koch(400, level)
    turtle.left(120)
    koch(400, level)
    turtle.done()

运行结果

5阶科赫曲线

最后修改:2022 年 04 月 13 日
愿君多打钱,此物最相思