具有不同条件语句的函数返回

时间:2018-12-05 20:49:09

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

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

问题是:

1-函数调用时,它只返回其他条件下的值。尽管满足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

我想保留语句并按需要返回值。谢谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

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

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)

答案 1 :(得分: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。您的意图是遍历循环中的所有可能值,如果循环中所有的可能值不满足条件,则只会引发错误。

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

相关问题