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
相关产品推荐
相关产品推荐

