社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

函数调用期间未调用Python input()

sovietcitrus • 3 年前 • 1471 次点击  

这是我为提高Python技能而编写的一个基于文本的简单游戏的代码片段。 我打算用 input_check() 为了简化我稍后将在项目中编写的许多代码,但我目前无法使其正常工作。我在最新的VS主代码上运行它,扩展名为Pylance,它不会在我的代码中标记任何错误。我已经进行了多次测试以确保 输入检查() 这就是问题所在,删除它并简单地多次运行代码就可以了。

import time

def rules():
  print("The rules of this game are:")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  input_check("Do you understand?\n", rules(), "Ok. Starting game...")
  
def input_check(question: str, function, confirmation: str):  
  yes_no = input(question)

  if yes_no.lower() == "n" or "no":
    function
  elif yes_no.lower() == "y" or "yes":
    print(confirmation)
    time.sleep(1)
  else:
    print("Invalid input.")
    input_check(question, function, confirmation)


input_check("Do you know the rules?\n", rules(), "Ok. Starting game...") 

我几乎是Python的新手,所以我不知道 function 参数,然后将其作为函数运行 输入检查() 行不行,但这不是问题所在。

应该有一个提示运行来定义 yes_no 具有 input() 但它从来没有达到这个程度。相反,它似乎跳到了跑步的前面 rules() (只有在用户输入“否”或“n”时才会发生这种情况),以及 规则() 连续运行直到停止,完全跳过 输入检查() .

我的问题是:

  1. 为什么 输入检查() 完全被忽视?
  2. 你能按原样运行作为参数的代码吗 作用 参数)或者我需要额外的步骤来运行它吗?
  3. 有没有更好/更有效的方法?(例如,一个解析输入的软件包,可以避免生成自己的函数)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129819
 
1471 次点击  
文章 [ 5 ]  |  最新文章 3 年前
FMc
Reply   •   1 楼
FMc    3 年前

对于代码的当前行为,您得到了很多解释,但没有 关于如何做我认为你想做的事情,有很多实用的建议。你没有 需要来回传递规则函数。你需要最重要的 获取用户输入的工具:while true循环。

def game():
    if not yesno('Do you know the rules'):
        rules()
    print("Ok. Starting game ...")

def rules():
    while True:
        print("The rules of this game are ... BLAH BLAH")
        if yesno('Do you understand'):
            break

def yesno(question):  
    while True:
        yn = input(f'{question}? [yes/no]: ').lower()
        if yn in ('y', 'yes'):
            return True
        elif yn in ('n', 'no'):
            return False
        else:
            print("Invalid input.")

Max Cheever
Reply   •   2 楼
Max Cheever    3 年前

除了其他答案之外,我还发现了另一个语义错误:第一个if语句的计算结果总是true,因为它将计算“no”的布尔值,如下所示

if yes_no.lower() == 'n' or 'no' == True:

由于非空字符串的计算结果为true,因此将始终执行此语句。你可以添加

yes_no.lower() == 'no'

给你

if yes_no.lower() == "n" or yes_no.lower() == "no":

只有当yes_no.lower是'n'或'no'时,才能使该语句计算为true

如需进一步澄清,请参阅

Why is my python if statement not working?

Toan Nguyen Phuoc
Reply   •   3 楼
Toan Nguyen Phuoc    3 年前
  1. 问题是你习惯了 rules() 就像传递函数的参数一样。您需要更改为: inputCheck("Do you know the rules?\n", rules, "Ok. Starting game...") .

规则():将调用函数规则()

规则:函数可以作为参数传递给另一个函数。

您可以来这里获取更多信息:

What is the difference between calling function with parentheses and without in python? .

笔记 :我看到你的示例代码有很多错误(当使用 def rules() 例如一个对象或函数)。你应该学习如何调试,它将帮助你有效地修复错误

I-am-developer-9
Reply   •   4 楼
I-am-developer-9    3 年前
inputCheck("Do you know the rules?\n", rules(), "Ok. Starting game...")

在运行函数时,不需要在规则之后使用任何paranthese(),而需要将函数作为参数传递。这样写:-

inputCheck("Do you know the rules?\n", rules, "Ok. Starting game...") 

这里还有:-

if yes_no.lower() == "n" or "no":
   function

您需要在函数后添加(),写:-

if yes_no.lower() == "n" or "no":
  function()

让我知道它是否解决了问题

Tim Roberts
Reply   •   5 楼
Tim Roberts    3 年前

看看这句话:

input_check("Do you know the rules?\n", rules(), "Ok. Starting game...")

当您这样做时,Python将调用 rules 立即运行,以便将结果传递给 input_check 你的 规则 函数打印出一堆东西,然后有完全相同的行,这将调用 rules() 一次又一次,一次又一次,一次又一次。。。它从来没有机会打电话 输入检查 .它还在处理参数。

如果要传递函数对象但不调用它,请不要使用参数:

input_check("Do you know the rules?\n", rules, "Ok. Starting game...")

请注意 输入检查 函数将继续调用传入的函数。你不需要在里面再打电话 规则 .

改善效果追踪

这和你想的不一样:

  if yes_no.lower() == "n" or "no":

解析为:

  if (yes_no.lower() == "n")   or "no":

既然“不”是真的,那么if将永远被接受。您应该使用以下选项之一:

  if yes_no.lower() in ("n" or "no"):
  if yes_no.lower()[0] == "n":

接下来,你有这个:

  if yes_no.lower() == "n" or "no":
    function

在这里,您确实想调用函数,因此需要添加参数:

  if yes_no.lower()[0] == "n":
    function()