【问题标题】:Function only returning first input of a list and not continuing in the input is outside a range函数仅返回列表的第一个输入并且不在输入中继续超出范围
【发布时间】:2020-10-30 13:04:55
【问题描述】:

我真的是编码新手(大约 3 周后),我正在编写一个代码,要求用户输入 0 到 100 之间的数字,然后将该数字添加到列表中。一旦列表达到 10 个数字的长度,它应该打印列表。我正在为此使用一个函数。

我可以得到它,所以它打印一个列表,但它只打印输入的第一个数字。例如,如果我输入 5,它仍然会询问其他数字,但它会将列表打印为 [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]。此外,如果我输入 0-100 范围之外的数字,它确实会要求您输入不同的数字,但随后它会停止并将列表打印为“无”。

下面是我的代码:

def getUser(n):
    mylist = []
    while 0 < n < 100:
        mylist.append(n)
        int(input("Please enter a number between 0 and 100: "))
        if len(mylist) == 10:
            return(mylist)
    else:
        int(input("This number is not in the range of 0-100, please input a different number: "))
    
    
n = int(input("Please enter a number between 0 and 100: "))
print("The numbers you have entered are: ", getUser(n))

我猜它与 while/else 循环有关,但正如我所说,我是新手,这一切都让人感到不知所措,尝试用谷歌搜索这似乎会带来我不知道的超级复杂的事情'不懂!!谢谢

【问题讨论】:

  • 你为什么在while循环中再次询问输入,而不是在任何变量中使用/捕获?

标签: python python-3.x list


【解决方案1】:

首先:为什么你会得到 [5, 5, 5, 5, 5, 5, 5, 5, 5, 5] :

int(input("Please enter a number between 0 and 100: "))

你应该先把这个给 n :

n=int(input("Please enter a number between 0 and 100: "))

然后,它会退出循环,因为您进入 else,然后您不会返回 while。然后你的函数结束了,没有return,所以none

老实说,我不明白为什么你的代码超出了while 循环,如果你给出一个超出范围的数字,因为值没有给n。如果有人可以在评论中解释,那就太好了!

我会那样做的:

def getUser():
    mylist = []
    while len(mylist) < 10:
        n = int(input("Please enter a number between 0 and 100: "))
        
        if (0 < n < 100):
            mylist.append(n)
        else:
            print('This is not between 0 and 100 !')

    return mylist
    
    
print("The numbers you have entered are: ", getUser())

然后你会被问到从 0 到 100(不包括)的数字,直到你得到 10 的大小。

【讨论】:

  • 以防 OP 无法判断,这是迄今为止提供的最佳答案(尽管我确实想鼓励他努力做到这样的事情,所以他明白为什么这是最佳答案并习惯于通过指导而不是直接解决方案来解决较小的问题,因此他对更大/更困难的问题更满意)
  • 我想你解决了!!我想我只是让自己更加困惑,但这非常简单,正是我所需要的。谢谢!!
  • @JackofSpades 我理解 - 对我来说,最好自己尝试弄清楚如何在别人的提示下自己做,但我认为这没关系,因为我理解这段代码的每一行以及为什么我米使用它。编码太难了!
【解决方案2】:

这就是你做错了什么

def getUser(n):
    mylist = []
    while 0 < n < 100:
        mylist.append(n)
        n = int(input("Please enter a number between 0 and 100: "))
        if len(mylist) == 10:
            return(mylist)
    else:
        int(input("This number is not in the range of 0-100, please input a different number: "))
    
    
n = int(input("Please enter a number between 0 and 100: "))
print("The numbers you have entered are: ", getUser(n))

您注意到编辑后的代码有什么不同吗?

您从未重新分配变量 n 的值 因此,您只需添加您每次传递给 getUser 的任何值(每次都是相同的值)

如果遇到困难,不要害怕寻求帮助!

附: 如果你能接受挑战,你也可以将一条线移到其他地方,让它表现得更好;)

【讨论】:

  • 根据else:input 中的文本,可能还应该指出else: 的情况会导致整个函数结束,这可能不是预期的结果。整个while 循环可能应该被if 替换,并用while True: 包裹。
  • 是的!为 OP 解决该问题的一种方法的提示是,您可以将 mylist 设为具有默认值的参数并简单地删除一行:)
  • 使用默认参数有很大的缺陷,我必须警告你。在 python 中,强烈建议不要使用None 以外的默认参数。
  • 真的吗?除了 None 之外,我认为我没有使用任何默认参数,但您介意将我链接到更详细说明的资源吗?
  • ahhh,我认为这是因为这种行为x=[] ; y = x ; y.append('test') ; print(x) ; &gt; ['test'] 如果我理解正确,当您创建分配给现有列表变量的列表变量时,它们都引用内存中的相同对象/地址,所以他们都有相同的价值观。我相信你会做这样的事情来创建一个具有自己单独内存空间的列表的实际副本 x = [1,2,3] ; y = x[:] ; y.append(4) ; print(x) iirc 应该可以创建一个副本
【解决方案3】:
def getUser(n):
mylist = []
t = True
while t:
    n =int(input("Please enter a number between 0 and 100: "))
    if n >0 and n<=100:
        mylist.append(n)
    if len(mylist) == 10:
        return(mylist)
        t = False
    elif n < 0  or n >100:
        print('This number is not in the range of 0-100, please input a different number:')
    
        

【讨论】:

  • 应该可以,但是您不需要任何参数,并且 t = False 没有用,因为您已经返回。而且我真的不喜欢在循环中返回,但这完全是个人的。
【解决方案4】:

好的,您正在尝试使用while 而不是if。 这就是我要做的——我会尽快解释:

def get_user():
    mylist = []
    for i in range(5):
        n = int(input("Please enter a number between 0 and 100: "))
        if n <= 100 and 0 <= n:
            mylist.append(n)
            
        else:
            print("This is not between 0 and 100 !")
            i = i - 1

    return mylist

浏览代码

for i in range(5)

这里我们使用for 来遍历range 数字 (0 - 5)。 for 会将i 分配给最小的 范围内的数字并在每次迭代时不断将 1 添加到 i 直到 i 不在 range 范围内。有关range 的更多信息,请参阅this

if n &lt;= 100 and 0 &lt;= n:

这里and 检查2 表达式是否为真。 在这种情况下,如果 n 小于或等于 100 且大于或等于 0。 您可以像这样使用and 任意次数:

if 1 < 100 and 100 > 200 and 20 < 40:
   print("foo!")

现在看看else

else:
    i = i - 1

在这里,我们从i 中减去 1,从而使我们的进度减一。 另请注意,我的函数称为get_user() 而不是getUser()。 在python中,我们使用snake case而不是camel case。

我希望这个答案会有所帮助。我在回答中给出了一些小提示。 你应该谷歌他们!我也没有直接给你逻辑。 试着弄清楚!这样你就可以很好地理解我的所作所为。

【讨论】:

  • 你为什么要贬低n?这会误导 OP
  • @JackofSpades 我呃,打错了。我的意思是i = i - 1。我同意n = n - 1 没有任何意义。我已经更新了答案
  • for i in range(10): print(i) if i == 7: i = i -1 尝试在您的解释器中运行该代码。更改 i 的值不会影响 for 循环的行为。此代码对 OP 具​​有误导性。
  • 这是因为i 被重新分配给range(10) 的下一次迭代,有效地使i 的递减无效
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2023-04-02
  • 1970-01-01
  • 2017-10-24
  • 2022-11-12
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多