兰州大学python实验:第一次实验作业

实验报告

第一次作业

实验内容

  1. 完成一个斗地主发牌器。

代码:

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张牌,最后通过编写一个展示玩家手牌的函数展示各玩家手中的牌。

运行结果:

第一组:

第二组:

第三组:

  1. 对指定目录(运行时输入)的文件按后缀筛选,如.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中也是这个顺序

第二组:

第三组:

 

当输入路径查询到输入的路径没有这个路径时,将重新输入。当查到该路径内无所输入文件后缀时,将重新输入。

  1. 说明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 方法,从而保留父类的行为。

测试:

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值