Python HangMan游戏函数实现及return关键字运作规则咨询
Python函数return逻辑与HangMan代码问题解答
关于return的核心疑问解答
- return的本质是将函数内部计算产生的结果值「抛出」到函数调用的位置,完全不会自动把返回的变量加入全局命名空间,只有你主动把返回值赋值给全局(或者当前作用域)的变量时,这个值才会被保留下来。
- 你举的
add_one例子就是最标准的用法:def add_one(a): return a + 1 add_one(3) # 这里返回的4没有被接收,执行完就直接丢弃了,全局不会产生任何新变量 b = add_one(3) # 主动赋值给b,才会在当前作用域创建b变量,值为4 - 额外补充作用域规则:函数内部定义的变量默认是局部变量,函数执行完成后就会被销毁,除非你主动用
global声明该变量属于全局作用域,或者把值通过return抛出后外部接收。
你当前函数版代码的问题修复建议
你现在代码里滥用了大量global,就是因为没有搞懂return的用法,而且还有几个逻辑bug会导致游戏跑不起来:
- 输入校验逻辑错误:
input()返回的永远是字符串,不需要判断类型;你判断单字符的逻辑写错了,应该判断len(user_input) != 1而不是user_input !=1,修改后如下:def user_input_check(user_input): if len(user_input) != 1 or not user_input.isalpha(): print("请输入单个字母!(例如 F)") return False return True - 不可变类型修改问题:字符串、数字是不可变类型,你在
game_board里修改的blanks和lives都是局部变量,不会影响外部的全局变量,需要把修改后的值return出来,外部接收:def game_board(user_input, hidden_word, guessed_letters, blanks, lives): if user_input in guessed_letters: print("你已经猜过这个字母了,换一个!") elif user_input in hidden_word: for i, L in enumerate(hidden_word): if L == user_input: blanks = blanks[:i] + L + blanks[i+1:] print("猜对了!") else: guessed_letters.append(user_input) print("不对,这个字母不在单词里,再试试!") lives -= 1 print(f"剩余生命:{lives}") print(f"猜错的字母:{guessed_letters}") print(blanks) # 返回修改后的三个值 return blanks, lives, guessed_letters - 返回值拆包错误:
select_word返回两个值,你直接赋值给hidden_word会让它变成一个元组,需要拆包:hidden_word, blanks = select_word() - 完全可以去掉所有
global声明,所有变量通过参数传递、返回值接收,代码可读性会高很多,也不容易出作用域bug。
内容的提问来源于stack exchange,提问作者Mo0rBy
相关产品推荐
相关产品推荐

