首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用不同的条件语句返回函数

使用不同的条件语句返回函数
EN

Stack Overflow用户
提问于 2018-12-06 04:49:09
回答 2查看 2.7K关注 0票数 1

我有一个简单的函数,我喜欢调用它并返回一些值。在函数内部有一个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)

Input with 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

我希望保持语句和返回值的原样。谢谢你的帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-09 13:34:28

试一试

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的原因。您希望从函数中获得一个元组,但什么也得不到,因为程序退出函数时根本没有返回值。

票数 1
EN

Stack Overflow用户

发布于 2018-12-06 05:15:11

我在这里看到了问题,多亏了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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53640519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档