【发布时间】:2009-06-12 06:48:02
【问题描述】:
我正在处理一个循环问题。在这个问题中,我们将对象放在大小为 MAX 的环上,并分配了从 (0 到 MAX-1) 的 ID。
我有三个简单的函数来测试范围包含。 inRange(i,j,k) 测试 i 是否在循环区间 [j,k[ (助记符为 i inRange(j,k))。我对范围 ]j,k[ 和 ]j,k] 也有同样的情况。
这三种方法中的代码看起来从一种方法复制到另一种方法:
def inRange(i,j,k):
"""
Returns True if i in [j, k[
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j <= i < k
# j > k :
return j <= i or i < k
def inStrictRange(i,j,k):
"""
Returns True if i in ]j, k[
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j < i < k
# j > k :
return j < i or i < k
def inRange2(i,j,k):
"""
Returns True if i in ]j, k]
* 0 <= i, j, k < MAX
* no order is assumed between j and k: we can have k < j
"""
if j <= k:
return j < i <= k
# j > k :
return j < i or i <= k
你知道实现这三种方法的更简洁的方法吗?毕竟只有运营商在变?!
在想了一个更好的解决方案后,我想出了:
from operator import lt, le
def _compare(i,j,k, op1, op2):
if j <= k:
return op1(j,i) and op2(i,k)
return op1(j,i) or op2(i,k)
def inRange(i,j,k):
return _compare(i,j,k, le, lt)
def inStrictRange(i,j,k):
return _compare(i,j,k, lt, lt)
def inRange2(i,j,k):
return _compare(i,j,k, lt, le)
好些了吗?你能想出更直观的东西吗? 简而言之,编写这三个运算符的 Python 方式是什么?
另外,我讨厌 inRange、inStrictRange、inRange2 名称,但我想不出清晰的名称。有什么想法吗?
谢谢。
【问题讨论】: