实验报告
第一次作业
实验内容
- 完成一个斗地主发牌器。
代码:
import random
# 定义一副扑克牌中每张牌所拥有的属性(花色与数字)
suits = ['黑桃', '红桃', '方块', '梅花']
numbers = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
jokers = ['小王', '大王']
# 创建一副完整的扑克牌
cards = [(suit, number) for suit in suits for number in numbers] #利用元组不可改变的特性,能保证每一张牌特有的花色与数字不会被改变
for joker in jokers:
cards.append((joker, None))
# 利用随机函数进行洗牌
random.shuffle(cards)#shuffle函数的作用是把列表中的元素打乱
# 进行发牌
player1_hand = cards[0:17]
player2_hand = cards[17:34]
player3_hand = cards[34:]
# 显示玩家的手牌的函数
def show(player, handcards):
print(player+"的牌为:")
for card in handcards:
if card[1] == None:
print(card[0], end=' ')
else:
print(card[0] + card[1], end=' ')
print()
# 显示每名玩家的牌
show("农民1", player1_hand)
show("农民2", player2_hand)
show("地主", player3_hand)
思路:
首先,需要定义一副扑克牌中每张牌所拥有的属性:四种花色、13个点数、以及大小王,然后在列表中添加牌(每一个牌自己的属性用元组来记录并添加到列表中),一共54张牌,然后用random.shuffle函数将牌堆中的所有牌打乱,再用切片方法将牌分发给玩家,因已经将列表中的元素打乱,则每个玩家的牌都是随机的,两农民各获得17张牌,地主获得20张牌,最后通过编写一个展示玩家手牌的函数展示各玩家手中的牌。
运行结果:
第一组:
第二组:
第三组:
- 对指定目录(运行时输入)的文件按后缀筛选,如.txt(运行时输入)文件,将所有筛选出的文件名和文件内容按文件创建时间排序,并按字典形式存入一个文件中(运行时指定)。
代码:
import os
from collections import OrderedDict
# 输入需要操作的路径和文件后缀
directory = input("输入要操作的目录: ")
while not os.path.exists(directory):
directory = os.path.join(input('该文件夹路径不存在,请重新输入:'))
file_extension = input("输入你要查询的文件后缀: ")
while not any([file.endswith(file_extension) for file in os.listdir(directory)]):
file_extension = input("不存在后缀为%s的文件,请重新输入:"%file_extension)
# 遍历目录,筛选文件
file_info_dict = OrderedDict()#file_info_dict是一个字典
for root, dirs, files in os.walk(directory):#遍历遍历文件夹下文件#
for file in files:
if file.endswith(file_extension):
file_path = os.path.join(root, file)#获取文件路径及文件名
create_time = os.stat(file_path).st_mtime# 获取文件的创建时间
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
file_info_dict[file] = {'create_time': create_time, 'content': file_content}
# 按文件创建时间排序
sorted_file_info = OrderedDict(sorted(file_info_dict.items(), key=lambda x: x[1]['create_time']))
# 输入要保存结果的文件名
output_file = input("请输入要保存结果的文件名: ")
# 将结果保存到文件
try:
with open(output_file, 'w', encoding='utf-8') as f:
for file, info in sorted_file_info.items():
f.write(f"文件名: {file}\n")
f.write(f"文件内容:\n{info['content']}\n\n")
print(f"结果已保存到文件: {output_file}")
except:
print("文件保存失败")
思路:
首先,获取用户输入的所想要查找的路径和文件后缀,确定操作的路径和筛选文件,若输入的路径或后缀错误时要求用户重新输入。
用os.walk()遍历指定路径(包括子目录),检查路径中的每个文件是否以指定的后缀结尾。如果是,获取文件的完整路径、创建时间和文件内容。
再用有序字典来存储文件信息。使用sorted函数根据文件的创建时间对字典内的元素进行排序,并将结果存储在sorted_file_info中。
获取用户输入的文件名,该文件将保存排序后的文件信息。以写入模式打开指定文件,遍历sorted_file_info中的文件信息,并将每个文件的名称和内容写入文件中。
运行结果:
第一组:
可见创建时间的文件顺序依次为new.txt , hello.txt , homework.txt,而保存到record.txt中也是这个顺序
第二组:
第三组:
当输入路径查询到输入的路径没有这个路径时,将重新输入。当查到该路径内无所输入文件后缀时,将重新输入。
- 说明super()方法和其两个可选参数的含义和用法,并举例。
super():
super() 是用于调用父类的方法。super() 是用来解决多重继承问题的,其可以让代码维护更加简单,解决多继承带来的重复调用(菱形继承)、查找顺序(MRO)问题。其通常在子类中使用,以便在子类中扩展或覆盖父类的方法,并在需要时调用父类的相同方法。
super() 其两个可选参数:
1. 第一个参数是当前子类的类名(通常是 super() 的类名),用于指定要调用父类方法的类。
2. 第二个参数是一个对象,通常是 self,表示实例对象,用于确定要调用的父类方法的解析顺序。若省略第二个参数,Python会根据方法调用的上下文自动确定。
举例:
代码:
class Father:
def __init__(self, name):
self.name = name
def show(self):
print("姓名:" ,self.name)
class Son(Father):
def __init__(self, name, age ,hobby):
super().__init__(name)
self.age = age
self.hobby=hobby
def show(self):
super().show()
print("学号:",self.age)
print("爱好:",self.hobby)
name=input("请输入儿子的姓名:")
age=int(input("请输入儿子的年龄:"))
hobby=input("请输入儿子的爱好:")
son=Son(name,age,hobby)
son.show()
此示例中,定义了一个父类 Father 和一个子类 Son。子类 Son 在其构造函数中使用 super() 来调用父类 Father 的构造函数。然后,子类 Son 重写了父类的 show 方法,在子类的方法中使用 super().show () 来调用父类的 show 方法,从而保留父类的行为。
测试: