我有一个简单的函数,我喜欢调用它并返回一些值。在该函数内有一个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
我想保留语句并按需要返回值。谢谢您的帮助
答案 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
的原因。您希望从函数中获取元组,但什么也不会收到,因为程序退出函数时根本不返回任何值。