#python #if-statement #logic
Вопрос:
Есть ли простой способ проверить 2 переменные с 3 условиями или 3 переменные с 7 условиями и так далее?
def checkXYZ():
if x==1 and y==0 and z==0:
doX()
elif x==0 and y==1 and z==0:
doY()
elif x==0 and y==0 and z==1:
doZ()
elif x==1 and y==1 and z==0:
doXY()
elif x==0 and y==1 and z==1:
doYZ()
elif x==1 and y==0 and z==1:
doXZ()
elif x==1 and y==1 and z==1:
doXYZ()
Ответ №1:
Это конкретный ответ на вопрос, но вы можете реализовать checkXYZ()
функцию, как показано ниже:
def checkXYZ():
if x==1:
print("x", end='')
if y==1:
print('y', end='')
if z==1:
print('z', end='')
print() # new line
x = 1
y = 0
z = 1
checkXYZ()
xz
end
параметр, заданный print()
функции, указывает последний символ в конце строки. По умолчанию, end='n'
, но вы можете установить его ''
равным, чтобы не вводить новые строки.
Альтернативное решение, вдохновленное @Sujay и @Yu-Sheng Li
a = b = y = z = 1
c = x = 0
variables = [a,b,c,x,y,z]
strs = "abcxyz"
print(''.join(s for var, s in zip(variables, strs) if var))
abyz
Для реализации методов:
def doA():
pass
def doB():
pass
def doC():
pass
def doAB():
pass
def doAC():
print("AC")
def doBC():
pass
def doABC():
pass
dict_ = {'a' : doA, 'b': doB, 'c': doC, 'ab': doAB, 'ac': doAC, 'bc': doBC, 'abc': doABC}
variables = [a,b,c]
strs = "abc"
b = 0
a = c = 1
dict_[''.join(s for var, s in zip(variables, strs) if var)]()
пт
Комментарии:
1. что делать, если это не оператор печати, а для вызова другой функции?
2. @Mehteva Я просто спросил из любопытства, потому что, если бы было больше переменных, то у нас должно было бы быть больше операторов if, и я проверял, есть ли способ сократить его (например, 4 переменные, будет 15 операторов).
3. Я добавил один способ сделать это, вы можете поместить функции в
dict
.4. Я думаю, что это не работает, так как doAC() уже напечатал и не вернул ни одного при создании
dict_
. Вам нужноdict_ = {'a': doA, ...}
и в конце концовdict_[...]()
5. Вы правы, исправлено. Спасибо вам за исправление.
Ответ №2:
ОТРЕДАКТИРОВАНО: для запуска методов (хотя exec
это не рекомендуется)
def check_vars(variables, strs, prefix="do"):
method = prefix "".join(s for var, s in zip(variables, strs) if var)
exec(f"{method}()")
# in your case
check_vars([x, y, z], "XYZ")
Общее решение:
def check_vars(variables, strs):
ans = ""
for var, s in zip(variables, strs):
if var:
ans = s
print(ans)
# in your case
check_vars([x, y, z], "xyz")
Комментарии:
1. что делать, если это не оператор печати, а для вызова другой функции?
2. Это можно сократить как
''.join(s for var, s in zip(vars, strs) if var)
. Сцепление строк происходит медленнее, чем приведенное выше3. @Sujay Приятно, я тоже об этом думал
4. @свазиленд В этом случае, я думаю, вам нужно передать другое отображение dict из (1, 1, 0) в doXY, например.
5. @свазиленд обновлен, без необходимости предоставления сопоставления, но имеет предположение об именах методов