Python 给定整数n,如果n在100或200的10范围内,则返回True

Python 给定整数n,如果n在100或200的10范围内,则返回True,python,range,Python,Range,对于上述问题,两种解决方案是否提供相同的结果 def almost_there(n): return n in range(90,111) or n in range(190,211) def几乎在那里(n): return((abs(100-n)是的,这两个函数是等价的。你得到了范围函数的“棘手”位,它排除了结束值。文档是 将来,SO通常不用于确认解决方案,它通常用于更多的开放式问题。请查看。您必须决定什么是“等效的”是。如果一个是快的,一个是慢的,但它们都返回正确的答案,那么它们是

对于上述问题,两种解决方案是否提供相同的结果

def almost_there(n):
    return n in range(90,111) or n in range(190,211)
def几乎在那里(n):

return((abs(100-n)是的,这两个函数是等价的。你得到了
范围
函数的“棘手”位,它排除了结束值。文档是

将来,SO通常不用于确认解决方案,它通常用于更多的开放式问题。请查看。

您必须决定什么是“等效的”是。如果一个是快的,一个是慢的,但它们都返回正确的答案,那么它们是否仍然相等?如果一个返回的答案与另一个不同,而这些答案是你从未期望它们看到的数字,那么它们是否仍然相等?如果一个容易阅读,而另一个则不相同

def at_a(n): return n in range(90,111) or n in range(190,211)
def at_b(n): return ((abs(100 - n) <= 10) or (abs(200 - n) <= 10))
def at_c(n): return (90 <= n <= 110) or (190 <= n <= 210)
                       
if __name__ == "__main__":
    import timeit
    setup = "from __main__ import at_a, at_b, at_c"

    print('testing same results for integers between -1000 and 1000.')
    print(f'same?: {all([at_a(n) == at_b(n) == at_c(n) for n in range(-1000,1000)])}')

    print('testing for speed with input = 0.')
    n = 0
    print(f'a: {timeit.timeit("at_a(0)", setup=setup)}')
    print(f'b: {timeit.timeit("at_b(0)", setup=setup)}')
    print(f'c: {timeit.timeit("at_c(0)", setup=setup)}')

    print('testing same results for float inputs between -500 and 500 in 0.5 increments.')
    print(f'all same?: {all([at_a(n/2) == at_b(n/2) == at_c(n/2) for n in range(-1000,1000)])}')
    print(f'a & b same?: {all([at_a(n/2) == at_b(n/2) for n in range(-1000,1000)])}')
    print(f'b & c same?: {all([at_b(n/2) == at_c(n/2) for n in range(-1000,1000)])}')

自动测试可能看起来像这样:
assert all(对于范围(1000)中的n,几乎等于几乎等于几乎等于2(n))
(如果将这两个函数重命名为
几乎等于1
几乎等于2
).return 90独立验证逻辑的一般方法是使用测试。例如,在这种情况下,您可以枚举一些小于90的N个数字,并验证
几乎所有的
都返回
False
,对于大于210的数字返回相同的值,依此类推其他三个范围。。
def at_a(n): return n in range(90,111) or n in range(190,211)
def at_b(n): return ((abs(100 - n) <= 10) or (abs(200 - n) <= 10))
def at_c(n): return (90 <= n <= 110) or (190 <= n <= 210)
                       
if __name__ == "__main__":
    import timeit
    setup = "from __main__ import at_a, at_b, at_c"

    print('testing same results for integers between -1000 and 1000.')
    print(f'same?: {all([at_a(n) == at_b(n) == at_c(n) for n in range(-1000,1000)])}')

    print('testing for speed with input = 0.')
    n = 0
    print(f'a: {timeit.timeit("at_a(0)", setup=setup)}')
    print(f'b: {timeit.timeit("at_b(0)", setup=setup)}')
    print(f'c: {timeit.timeit("at_c(0)", setup=setup)}')

    print('testing same results for float inputs between -500 and 500 in 0.5 increments.')
    print(f'all same?: {all([at_a(n/2) == at_b(n/2) == at_c(n/2) for n in range(-1000,1000)])}')
    print(f'a & b same?: {all([at_a(n/2) == at_b(n/2) for n in range(-1000,1000)])}')
    print(f'b & c same?: {all([at_b(n/2) == at_c(n/2) for n in range(-1000,1000)])}')
testing same results for integers between -1000 and 1000.
same?: True

testing for speed with input = 0.
a: 0.3811636749887839
b: 0.1633004400646314
c: 0.11968454602174461

testing same results for float inputs between -500 and 500 in 0.5 increments.
all same?: False
a & b same?: False
b & c same?: True