如何让函数仅首次调用时打印值?Hangman游戏函数优化需求
嗨,这两个问题在做小游戏的时候挺常见的,我来给你详细说说解决方案!
问题1:让函数仅在首次被调用时打印值
这里有几种实用的实现方式,你可以根据场景选择:
- 方法1:利用函数的自定义属性(最直观)
Python里函数是对象,能直接给它加属性记录状态,代码简单易懂:
def print_first_time(): # 检查函数是否有已调用的标记 if not hasattr(print_first_time, 'has_been_called'): print("这是首次调用才会显示的内容") # 标记为已调用 print_first_time.has_been_called = True # 测试效果 print_first_time() # 会打印内容 print_first_time() # 啥也不输出
- 方法2:用闭包封装状态(更隐蔽)
如果不想给函数本身加属性,用闭包把状态藏在内部,避免全局污染:
def create_print_once_func(): called = False def inner(): nonlocal called if not called: print("只有第一次调用才打印") called = True return inner # 创建实例 my_printer = create_print_once_func() my_printer() # 打印 my_printer() # 不打印
- 方法3:装饰器(复用性强)
如果多个函数都需要这个“仅首次执行打印”的功能,写个装饰器就能批量复用:
def only_first_print(func): def wrapper(*args, **kwargs): if not wrapper.has_run: # 执行原函数(里面的打印逻辑) result = func(*args, **kwargs) wrapper.has_run = True return result # 初始化标记 wrapper.has_run = False return wrapper # 给需要的函数加装饰器 @only_first_print def game_start_tip(): print("欢迎来到Hangman游戏!") game_start_tip() # 打印欢迎语 game_start_tip() # 无输出
问题2:修改myFunction,让第二次调用时不打印值c
结合你给的代码和Hangman游戏的场景,我准备了两种适配不同需求的修改方案:
场景A:函数第二次被调用时,进入elif分支就不打印c
给函数加一个调用次数的属性,每次调用时计数,只有第一次调用才打印:
def myFunction(first, second, third): # 初始化调用次数,首次调用时创建属性 if not hasattr(myFunction, 'call_count'): myFunction.call_count = 0 myFunction.call_count += 1 if first == True: # 这里写你的first分支逻辑 print("执行first分支操作") elif second == True: c = third * 3 # 只有第一次调用函数时才打印c if myFunction.call_count == 1: print(c) return c else: print("Error") # 测试 myFunction(False, True, 2) # 第一次调用,打印6,返回6 myFunction(False, True, 2) # 第二次调用,不打印,返回6
场景B:只要进入过一次elif分支,之后再进入就不打印c
如果中间可能调用其他分支(比如first为True的情况),但只要触发过一次elif的打印,之后就不再打印,那可以专门记录这个分支的执行状态:
def myFunction(first, second, third): # 初始化elif分支的打印标记 if not hasattr(myFunction, 'elif_printed'): myFunction.elif_printed = False if first == True: # 这里写你的first分支逻辑 print("执行first分支操作") elif second == True: c = third * 3 # 只有没打印过的时候才输出 if not myFunction.elif_printed: print(c) myFunction.elif_printed = True return c else: print("Error") # 测试 myFunction(False, True, 2) # 第一次进入elif,打印6,返回6 myFunction(True, False, 2) # 执行first分支,不影响标记 myFunction(False, True, 3) # 再次进入elif,不打印,返回9
这个方案更贴合Hangman游戏的需求——比如第一次猜对某个字母时显示提示,之后重复猜同一个字母就不重复输出。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

