是否有更好,更短的代码?

时间:2015-09-16 15:49:22

标签: python

我正在尝试学习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

这很好并且工作得很完美 - 只是想知道这是否可以进一步压缩?

2 个答案:

答案 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值,就不再执行测试。例如,如果ab等于6,则不计算总和,并且仅在ab均不等于6时计算绝对差值,并且总和不是6。