实验一
[问题描述]
编写函数,接收一个十进制整数为参数,返回等值的二进制数。
[基本要求]
- 输入:十进制整数。
- 处理:采用“除2取余,逆序排列”法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
- 输出:二进制整数
- 要求编写异常处理
参考代码
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 | 以十进制数表示的微秒,在左侧补零。 |
%z | UTC 偏移量,格式为±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()
运行结果
实验四
[问题描述]
采用递归方式绘制科赫曲线。
[基本要求]
- 使用五阶科赫曲线绘制雪花图案。
- 修改代码,使得科赫曲线反向绘制。
- 修改科赫曲线的绘制颜色,随机取一个颜色。
- 为代码添加注释。
参考代码
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()