【问题标题】:Function return with different conditional statement具有不同条件语句的函数返回
【发布时间】:2019-05-07 12:10:55
【问题描述】:

我有一个简单的函数,我喜欢调用它并返回一些值。该函数内部有一个 if、elif 和 else 语句,目的是当 if 条件满足时,返回一些值,即当 if 和 elif 不满足时,运行并显示 else 语句下的内容。我已使用小部件警报来标记和说明问题。

问题是:

1- 当函数调用时,它只返回 else 下的内容。尽管 if 语句已完成。

2- 删除else下的所有代码行,只运行if和elif,满足条件返回某个值,否则返回TypeError: 'NoneType' object is not iterable

代码:

from PyQt5 import QtCore, QtWidgets, QtGui

def fun( x, y, z):
    X = x
    Y = y
    Z = z

    for i in range(0,Z):
        R = i * X/Y

        if R == 10:
            return R, i
        elif 10 < R <= 45:
            return R, i
        else:
            print('Error') 
            app = QtWidgets.QApplication([])
            error_dialog = QtWidgets.QErrorMessage()
            error_dialog.showMessage('Error!! change values')
            app.exec_() 
            return R, i

使用这些值来满足条件。

result, prod = fun(10, 60, 100)
result, prod = fun(105, 60, 100)
result, prod = fun(10, 600, 100)

用 else 语句输入:

result, prod = fun(10, 60, 100)
print( result, prod)

带有 else 语句的输出:

Error window shows up

Error
0.0 0

不带else语句的输入:

result, prod = fun(10, 60, 100)
print( result, prod)

不带else语句的输出:

10.0 60

我想保留所需的语句和返回值。感谢您的帮助

【问题讨论】:

  • "当函数调用时,它只返回 else 下的内容。尽管 if 语句已经完成。"那不是真的。几乎可以肯定的是,您对 if 语句的作用有误。
  • 您的 if 语句和 elif 语句返回相同的值,如果我可以问,它们有什么意义?你怎么确定你的 if 语句即使在填满时也没有被调用,当这种情况发生时你能否分享这样的输入和输出。
  • 我想我在这里遇到了问题。我运行了您的代码,发现 else 语句存在问题。我发布了一个答案,现在应该可以帮助您解决问题。干杯!
  • @FamousJameous 你错了。注意 python-3.x 标签。

标签: python python-3.x function if-statement


【解决方案1】:

试试

def fun( x, y, z):
   X = x
   Y = y
   Z = z

   R, i = 0, 0  # <- if Z<1 you will not enter the loop at all, and your original function will not return anything. 
   for i in range(0,Z):
       R = i * X/Y

       if R == 10:
           return R, i
       elif 10 < R <= 45:
           return R, i

   print('Error') 
   app = QtWidgets.QApplication([])
   error_dialog = QtWidgets.QErrorMessage()
   error_dialog.showMessage('Error!! change values')
   app.exec_() 
   return R, i

您的else 语句应应用于for,而不是if。您的意图是遍历循环中的所有可能值,如果循环中的 all 可能值不满足条件,则只会引发错误。

顺便说一句,将所有returns 放在ifs 中并不是一个好样式。这样,您可以忽略一些罕见的情况并获得不良行为。这正是您得到TypeError: 'NoneType' object is not iterable 的原因。您希望从函数中得到一个元组,但什么也得不到,因为程序退出函数时根本没有返回任何值。

【讨论】:

  • 非常感谢。您的解决方案对我有很大帮助。
【解决方案2】:

我在这里看到了问题,感谢 Tim B,虽然他没有添加如何解决它。所以你的if 语句工作正常。这里发生的事情是您在所有if elif else 的末尾都有一个return 语句。因此,在第一次使用 i = 0, R = 0 运行时,它将转到 else 并返回一个值。当这种情况发生时,for 循环停止执行。所以基本上你所有的代码都只运行一次 R = 0 值。

您可能想要做的是从else 子句中删除return 语句。或者不返回结果,而是将结果保存在两个列表或数组中。我希望这可以帮助您解决问题。

def fun( x, y, z):
X = x
Y = y
Z = z
results = []
related_indexes = []
R = i * X/Y
print(R)
if R == 10:
    return R, i
elif 10 < R <= 45:
    return R, i
else:
    print('Error') 
    #app = QtWidgets.QApplication([])
    #error_dialog = QtWidgets.QErrorMessage()
    #error_dialog.showMessage('Error!! change values')
    #app.exec_() 
    return R, i
x,y,z = (10, 60, 100)

for i in range(0,z):
    result,prod = fun(x,y,z)
    print(result, prod)

【讨论】:

  • 感谢您澄清问题并解释 for-loop 和 if 语句的调试。但不幸的是,它无助于解决我的问题。应该有一种方法可以在第一次不跳转的情况下运行 for 循环,并在错误消息显示类似 R = xxxi = 99 时返回偶数值。
  • 这样用return是不可能的,那我就这样解决你的问题。在主体中添加 for 循环,并在其中调用 fun 怎么样。应该这样解决你的问题吗?您可以在每次运行后返回。我认为这是你现在唯一的选择。如果你有这个想法,请告诉我
  • 我编辑并添加了演示答案,你现在喜欢吗?我评论了 Qt 代码,我没有。
  • 我已经通过重写上面的代码明白了这一点,正如你所建议的那样,聪明。返回每一次运行。但这不是我想要的,恐怕它不适合我的锻炼。无论如何谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2013-12-17
  • 2011-06-06
相关资源
最近更新 更多