Возврат функции с другим условным оператором - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть простая функция, которую я люблю вызывать и возвращать некоторые значения.Внутри этой функции есть оператор if, elif и else, цель - когда выполняется условие, возвращать некоторые значения, это когда if и elif не выполняются, запускать и отображать то, что когда-либо находится под оператором else.Я использовал оповещение виджета, чтобы отметить и заявить о проблеме.

Проблема заключается в следующем:

1 - Когда вызывается функция, она возвращает то, что когда-либо находилось в другом месте.несмотря на то, если заявление выполнено.

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 голосов
/ 09 декабря 2018

Попробуйте

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.Вы ожидаете получить кортеж от функции, но ничего не получите, поскольку программа выходит из функции, не возвращая значение вообще.

0 голосов
/ 06 декабря 2018

Я вижу проблему здесь, благодаря Тиму Б, хотя он не добавил, как это исправить.Так что ваши if заявления работают нормально.То, что здесь происходит, это то, что у вас есть return утверждение в конце всех if elif else.Так что для самого первого запуска с i = 0, R = 0 он перейдет к другому и вернет значение.Когда это происходит, цикл 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...