很快我需要验证是否验证了3个条件,如果没有执行有关失败条件的事情。我知道我可以使用多个if / else语句迭代3个条件,但我想知道是否有更简单,更简洁的方法。
以更通用的方式:
if condition1 and condition2 and condition3: pass
else: print which condition has failed
对于应用案例:
if file_exist("1.txt") and file_exist("2.txt") and file_exist("3.txt"):
pass
else:
#find which condition has failed
#for file of the failed condition
create_file(...)
我不打算解决上面的例子!我的问题是如何找到在单个if / else语句中的一系列条件中未验证哪个条件!
此致
答案 0 :(得分:5)
I know I can iterate through the 3 files with multiple if/else statements
每当你在编程问题中发现这样的重复时,这是一个很好的迹象,你可以使用一个循环:
for filename in ("1.txt", "2.txt", "3.txt"):
if not file_exist(filename):
create_file(...)
你也可以使用列表理解:
[create_file( filename ) for filename in ("1.txt", "2.txt", "3.txt") if not file_exist(filename)]
这更接近你用英语阅读它的方式,但是有些人会对它不屑一顾,因为你使用列表理解来引起副作用,而不是实际创建列表
答案 1 :(得分:2)
不,这是不可能的。 if
语句只有一个条件,在这种情况下条件为condition1 and condition2 and condition3
。它不会“记住”该表达式中子表达式的结果,所以除非它们有副作用,否则你运气不好。
另请注意,如果condition1
为false,则根本不会评估condition2
。因此,如果您想知道哪些条件(复数)失败,那么and
将完全是错误的工具。你可以改为做:
results = (condition1, condition2, condition3)
if all(results):
pass
else:
# look at the individual values
但实际上,如果你在查看单个值时要为每个错误值“做某事”,那么你不需要特殊情况下它们都是真的。只需执行相同的代码,每一步都不执行任何操作。
我想,为了证明一点,你可以做一些特别的事情来记录第一次失败:
def countem(result):
if result:
countem.count += 1
return result
countem.count = 0
if countem(condition1) and countem(condition2) and countem(condition3):
pass
else:
print countem.count
或者摆脱if
更简洁一点:
conditions = (lambda: condition1, lambda: condition2, lambda: condition3)
first_failed = sum(1 for _ in itertools.takewhile(lambda f: f(), conditions))
当然这对你的例子来说不是明智的代码,但就它而言,它处理的是一般情况。
答案 2 :(得分:1)
而不仅仅使用if / else解决方案:
for file_name in('1.txt', '2.txt', '3.txt'):
try:
with open(file_name): # default mode 'r' to read file
#do something... or not
except IOError:
with open(file_name, 'w') as f:
#something to do...
#modes can be 'w', 'a', 'w+', 'a+' for writing, appending,write/read, append/read respectively. There are others...
还有:
import os.path
file_path = '/this path if all files/ have the same path.../'
for file_name in('1.txt', '2.txt', '3.txt'):
if os.path.exists(file_path/file_name):
continue
else:
#create the file
# though os.path.exists this will return True for directories also
答案 3 :(得分:0)
我只是说它看起来像一个for循环来满足某些条件。
尝试输入打印语句,看看是否满足每个条件......简单但有效。