You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python教材抽奖代码布尔逻辑疑问及自定义代码排障求助

问题1:教材抽奖代码中won变量的布尔逻辑解析
  • 初始设为won=False的原因:程序启动时还未进行任何抽奖尝试,自然处于“未中奖”状态,用False初始化符合逻辑起点的事实。
  • 使用while not won而非while True的原因:这种写法更贴合业务逻辑——“只要没中奖,就继续抽奖”,代码可读性更强,一眼就能看懂循环的终止条件是“中奖”,比while True加内部判断退出更直观。
  • if won判断的写法:在Python中,布尔值本身可以直接作为条件表达式,if won等价于if won == True,这是Python的惯用简洁写法,符合PEP8编码规范,无需额外写== True来“明确”,反而会显得冗余。
问题2:自定义抽奖验证代码的问题排查与修正

你的代码存在多个语法和逻辑错误,导致无法运行,具体问题及修正如下:

错误点1:变量未赋值导致NameError

调用make_winning_ticket(possibilities)和make_new_ticket(possibilities)时,没有将返回值赋值给winning_ticket和new_ticket变量,后续调用check_ticket(winning_ticket, new_ticket)时会提示这两个变量未定义。

错误点2:全局变量修改未声明导致UnboundLocalError

play是全局变量,在check_ticket函数中尝试修改它时,必须先用global play声明,否则Python会将其视为局部变量,引发未绑定错误。

错误点3:check_ticket函数逻辑完全偏离需求

check_ticket的核心功能应该是判断当前生成的彩票是否中奖,而非在函数内部循环生成彩票。你的当前逻辑混乱,存在以下问题:

  • 错误使用new_ticket not in winning_ticket判断:两个都是列表,应该判断元素是否完全匹配(若不考虑顺序,可转为集合比较;若考虑顺序则直接比较列表)。
  • 生成新彩票后未赋值给变量,导致循环始终用旧彩票判断。
  • 函数结构错误,将循环生成彩票的逻辑放在了验证函数里,违背单一职责原则。

修正后的完整代码

from random import choice

possibilities=['1','2','3','4','5','6','7','8','9','10','a','b','c','d','e']

def make_winning_ticket(possibilities):
    winning_ticket=[]
    while len(winning_ticket)<4:
        new_number=choice(possibilities)
        if new_number not in winning_ticket:
          winning_ticket.append(new_number)
    return winning_ticket

def make_new_ticket(possibilities):
     new_ticket=[]
     while len(new_ticket)<4:
        new_number=choice(possibilities)
        if new_number not in new_ticket:
          new_ticket.append(new_number)
     return new_ticket

def check_ticket(new_ticket, winning_ticket):
    # 若不考虑彩票元素顺序,转为集合比较;若需严格顺序则直接return new_ticket == winning_ticket
    return set(new_ticket) == set(winning_ticket)

play = 0
max_try = 100000
winning_ticket = make_winning_ticket(possibilities)
new_ticket = make_new_ticket(possibilities)

while play < max_try:
    if check_ticket(new_ticket, winning_ticket):
        print(f"中奖了!尝试次数:{play+1}")
        print(f"中奖号码:{winning_ticket}")
        print(f"你的号码:{new_ticket}")
        break
    play += 1
    new_ticket = make_new_ticket(possibilities)
else:
    print(f"尝试了{max_try}次仍未中奖")
    print(f"中奖号码:{winning_ticket}")
    print(f"最后一次尝试的号码:{new_ticket}")

内容的提问来源于stack exchange,提问作者littlebeauty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:57:35