2026/1/14 类3

2 阅读4分钟

昨晚做了实验,9点半的时候吃了炸串,然后第二天早上看血糖,直接飙到了9.5,到凌晨3点血糖才降到6,天知道这些年我的破嘴有多对不起我的胰腺啊,必须道歉。 然后今天看了剩下的类的内容,发现有一些隐藏的坑 很容易跳进去。笔记如下:

4.导入类

为了遵循Python的整体理念,让文件尽量整洁,在确定了类的大致内容后,应将其单独撰写并存储入模块,之后再导入所需的模块。
  • 导入单个类 针对上述Car类,单独存储为模块car.py。后续导入使用,就可以专注于主程序的高级逻辑。
from car import Car

my_new_car = Car('audi','a4',2024)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

# 》2024 Audi A4
This car has 23 miles on it.
  • 导入多个类:用逗号隔开 from car import Car , Battery

  • 导入整个模块 import car

  • 导入模块中的所有类(不推荐) from module_name import *

  • 使用别名 from electric_car import ElectricCar as EC

5.Python 标准库

  • 可以利用import 函数调用标准库里的模块

  • randian( ) 返回参数之间的一个随机整数: from random import randiant randint(1,6)

  • choice( )随机返回列表或元组中的一个元素 from random import choice players = ['charles','martina','michael'] first_up = choice(players) first_up 'charles'

练习

骰子
class Die:
    """一个投掷1-6随机数的游戏"""
    def __init__(self,sides=6):
        """设置属性sides的默认值"""
        self.sides = sides
        print(f"骰子有{self.sides} 面")
    
    def roll_die(self):
        """针对不同面数的骰子投掷10次,取随机数"""
        from random import randint
        i=0
        while i < 10:
            num = randint(1,self.sides)
            print(f"这是第 {i+1} 次投掷,得出的随机数是 {num}")
            i += 1
die1 = Die()
die1.roll_die()
print()

die2 = Die(10)
die2.roll_die()
print()

die3 = Die(20)
die3.roll_die()
彩票(写的报错)
class Ticket:
    """彩票中奖游戏"""
    def __init__(self,ticket=[]):
        self.ticket = ticket
    
    def the_ticket(self):
        """随机选择4个数或字母作为中奖号码"""
        from random import choice
        ticket_all =[232,458,858,654,555,478,524,157,952,471,'a','d','e','f','g']
        while True:
            if len(self.ticket) < 4:
                self.ticket_now = choice(ticket_all)
                if self.ticket_now not in self.ticket:
                    self.ticket.append(self.ticket_now)
                else:
                    continue
            else:
                break
        print(f"如果打印出的彩票上的信息是{self.ticket},你就中大奖啦!")
    
yes_or_no = Ticket()
yes_or_no.the_ticket()

# 》如果打印出的彩票上的信息是[654, 'f', 555, 'd'],你就中大奖啦!

class My_ticket(Ticket):
    """验证中奖难度"""
    def __init(self,ticket=[]):
        """初始化父类属性"""
        super.__init__(ticket=[])
    

my_ticket = My_ticket()
n=0
while True:
    now_ticket = my_ticket.the_ticket()
    if now_ticket == yes_or_no.the_ticket():
        print("你中大奖了,抽奖次数为n次")
        break
    else:
        n +=1
        continue
      
 ==修正版==
from random import choice

class Ticket:
    """彩票中奖游戏"""
    def __init__(self):
        self.ticket_all =[232,458,858,654,555,478,524,157,952,471,'a','d','e','f','g']
        self.winning_ticket = []
    
    def generate_winning_ticket(self):
        """随机选择4个数或字母作为中奖号码"""
        self.winning_ticket = []
        while len(self.winning_ticket) < 4:
                self.item= choice(self.ticket_all)
                if self.item not in self.winning_ticket:
                    self.winning_ticket.append(self.item)
                else:
                    continue
        return self.winning_ticket


    def the_ticket(self):
        """打印中奖号码"""
        if not self.winning_ticket:
            self.generate_winning_ticket()
        print(f"如果打印出的彩票上的信息是{self.winning_ticket},你就中大奖啦!") #方法执行得到的属性值,可以直接引用
    
yes_or_no = Ticket()
yes_or_no.the_ticket()

# 》如果打印出的彩票上的信息是[654, 'f', 555, 'd'],你就中大奖啦!

class My_ticket(Ticket):
    """获取我的彩票号码"""
    def __init__(self,my_ticket_number=None):
        """初始化父类属性"""
        super().__init__()
        if my_ticket_number is None:
            #如果没有提供我的彩票号码,随机生成一个
            self.my_ticket=[]
            while len(self.my_ticket) < 4:
                item = choice(self.ticket_all)
                if item not in self.my_ticket:
                    self.my_ticket.append(item)
        else:
            self.my_ticket = my_ticket_number

        print(f"我的彩票号码:{self.my_ticket}")


    def compare_tickets(self, ticket1, ticket2):
        """比较两个彩票是否相同(顺序不重要)"""
        # 转换为字符串进行比较,避免数字和字符串的混合类型问题
        ticket1_str = [str(item) for item in ticket1]
        ticket2_str = [str(item) for item in ticket2]
        return sorted(ticket1_str) == sorted(ticket2_str)

    def simulate_until_win(self):
        """模拟抽奖直到中奖,返回尝试次数"""
        attempts = 0
        print(f"目标中奖号码:{self.winning_ticket}")

        while True:
            attempts += 1

            #生成一个新的随机彩票
            random_ticket = []
            while len(random_ticket) < 4:
                item = choice(self.ticket_all)
                if item not in random_ticket:
                    random_ticket.append(item)

            #每10000次显示一次进度
            if attempts % 10000 ==0:
                print(f"已尝试{attempts:,}次...")


            #检查是否中奖
            if self.compare_tickets(random_ticket, self.winning_ticket):
                print(f"\n在第{attempts:}次尝试时中奖了!")
                print(f"中奖号码:{random_ticket}")
                return attempts


#创建我的彩票(可以指定号码,或随机生成)
my_lottery = My_ticket()


#显示中奖号码
print("正在生成中奖号码...")
my_lottery.generate_winning_ticket()
my_lottery.the_ticket()


#开始模拟
print("\n开始模拟抽奖...")
total_attempts = my_lottery.simulate_until_win()


#计算概率
 total_possible = 15*14*13*12
 probability = 1 / total_possible
 print(f"\n理论概率: 1/{total_possible:,}{probability:.8f}")
 print(f"实际尝试次数: {total_attempts:,}")

==**这里有几个问题,第一号码组合为数字和字母,不能用sorted;类的属性使用后,可以用作变量直接使用。