我有一个简单的函数,我喜欢调用它并返回一些值。在函数内部有一个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
我希望保持语句和返回值的原样。谢谢你的帮忙
发布于 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
的原因。您希望从函数中获得一个元组,但什么也得不到,因为程序退出函数时根本没有返回值。
发布于 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)
https://stackoverflow.com/questions/53640519
复制相似问题