我正在尝试学习python,我正在使用的其中一个网站有以下问题之一: 给定两个int值a和b,如果其中任何一个为6,则返回True。或者如果它们的总和或差为6。
这是我的代码
def love6(a, b):
diff = a-b
sum = a+b
if a==6 or b==6:
return True
elif sum==6 or abs(diff)==6:
return True
else:
return False
这很好并且工作得很完美 - 只是想知道这是否可以进一步压缩?
答案 0 :(得分:7)
由于#include <cassert>
#include <memory>
#include <unordered_set>
struct Deref {
struct Hash {
template <typename T>
std::size_t operator() (std::shared_ptr<T> const &p) const {
return std::hash<T>()(*p);
}
};
struct Compare {
template <typename T>
size_t operator() (std::shared_ptr<T> const &a,
std::shared_ptr<T> const &b) const {
return *a == *b;
}
};
};
int main() {
std::unordered_set<std::shared_ptr<int>> sp;
auto p = std::make_shared<int>(42);
sp.insert(p);
assert(sp.find(p) != sp.end()); // same pointer works
assert(sp.find(std::make_shared<int>(42)) == sp.end()); // same value doesn't
// with the correct hash & key comparison, both work
std::unordered_set<std::shared_ptr<int>, Deref::Hash, Deref::Compare> spd;
spd.insert(p);
assert(spd.find(p) != spd.end());
assert(spd.find(std::make_shared<int>(42)) != spd.end());
}
的两个分支执行相同的操作,您可以将它们与另一个if
相关联,将它们合并为一个:
or
但这只是:
if a==6 or b==6 or sum==6 or abs(diff)==6:
return True
else:
return False
但由于所有这些都在测试相同的等式,你可以使用return (a == 6 or b == 6 or sum==6 or abs(diff)==6)
运算符,如下所示:
in
值得避免使用变量名return 6 in (a,b,sum,abs(diff))
,因为它有一个带有该名称的内置函数。在这里,您只使用一次,操作非常简单,因此您可以完全删除变量,而不会明显损失:
sum
答案 1 :(得分:6)
为什么浪费时间预先计算总和&amp;可能不需要时的绝对差异?
def love6(a, b):
return a==6 or b==6 or a+b==6 or abs(a-b)==6
Python or
运算符短路,因此上述测试从左到右进行评估,一旦找到True值,就不再执行测试。例如,如果a
或b
等于6,则不计算总和,并且仅在a
和b
均不等于6时计算绝对差值,并且总和不是6。