Python 使用for循环比较整数

Python 使用for循环比较整数,python,Python,我是python新手,在做一些练习时遇到了一个问题 以下是我目前掌握的代码: def gt(nums, n): for c in nums: if n < c: return True elif c < n: return False else: break 这可能更好 def gt(nums, n): for c in nums:

我是python新手,在做一些练习时遇到了一个问题

以下是我目前掌握的代码:

def gt(nums, n):
    for c in nums:
        if n < c:
            return True
        elif c < n:
            return False
        else:
            break 
这可能更好

def gt(nums, n):
    for c in nums:
       if n < c:
            return True

    return False
def gt(nums,n):
对于NUM中的c:
如果n
更简单、更易读的解决方案如下:

def gt(lst, n):
    return max(lst) > n
使用一个班轮

def gt(nums, n):
    return any(e > n for e in nums)

当发现第一个大于n的元素时,这一点就中断了。

对Niklas B.评论的长时间回应:

我决定测试一下,结果如下。蓝点是你的功用,绿点是马里奥的功用;y轴是以秒为单位的运行时间,x轴是len(nums)。

正如你所说,两者都是O(n)。您的速度更快,最多可购买约45件物品;对于任何超过100件物品,他的速度大约是前者的两倍

这基本上是不相关的——这似乎更像是一个初学者语法问题,而不是其他任何问题——而且,正如您所说,Python一开始就不是一个速度恶魔。另一方面,谁不喜欢更快一点(只要可读性不受影响)

对于那些感兴趣的人,下面是我为测试这一点而编写的代码:

from random import randint
from timeit import Timer
import matplotlib.pyplot as plt

def gt1(nums, n):
    # based on Niklas B.'s answer - NOTE comparison is corrected
    return n < max(nums)

def gt2(nums, n):
    # based on Mario Fernandez's answer
    return any(e > n for e in nums)

def make_data(length, lo=0, hi=None):
    if hi is None:
        hi = lo + length - 1
    elif lo > hi:
        lo,hi = hi,lo
    return [randint(lo, hi) for i in xrange(length)]

def make_args(d):
    nums = make_data(d)
    n = randint(0,d)
    return "{}, {}".format(nums, n)

def time_functions(fns, domain, make_args, reps=10, number=10):
    fns = [fn.__name__ if callable(fn) else fn for fn in fns]
    data = [[] for fn in fns]
    for d in domain:
        for r in xrange(reps):
            args = make_args(d)
            for i,fn in enumerate(fns):
                timer = Timer(
                    setup='from __main__ import {}'.format(fn),
                    stmt='{}({})'.format(fn, make_args(d))
                )
                data[i].extend((d,res) for res in timer.repeat(number=number))
    return data

def plot_data(data, formats=None):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    if formats is None:
        for d in data:
            ax.plot([x for x,y in d], [y for x,y in d])
    else:
        for d,f in zip(data, formats):
            ax.plot([x for x,y in d], [y for x,y in d], f)
    plt.show()

def main():
    data = time_functions([gt1, gt2], xrange(10, 501, 10), make_args)
    plot_data(data, ['bo', 'g.'])

if __name__=="__main__":
    main()
来自随机导入randint
从timeit导入计时器
将matplotlib.pyplot作为plt导入
def gt1(nums,n):
#根据Niklas B.的答案,注释比较被更正
返回n<最大值(nums)
def gt2(nums,n):
#根据马里奥·费尔南德斯的回答
返回任意值(对于nums中的e,e>n)
def make_数据(长度,lo=0,hi=None):
如果hi为无:
高=低+长度-1
elif lo>hi:
嗨,嗨=嗨,嗨
返回[randint(lo,hi)表示X范围(长度)中的i]
def make_参数(d):
nums=生成数据(d)
n=randint(0,d)
返回“{},{}”。格式(nums,n)
def时间函数(fns、域、make_参数、reps=10、number=10):
fns=[fn.\uuuu name\uuuuuu如果可调用(fn),则为fn中的fn指定fn]
数据=[]用于fn中的fn]
对于域中的d:
对于X范围内的r(重复次数):
args=make_args(d)
对于i,枚举中的fn(fns):
定时器=定时器(
setup='from\uuuuu main\uuuuuu import{}'。格式(fn),
stmt='{}({}').format(fn,make_args(d))
)
数据[i]。扩展((d,res)用于计时器中的res。重复(number=number))
返回数据
def plot_数据(数据,格式=无):
图=plt.图()
ax=图添加_子批次(111)
如果格式为“无”:
对于数据中的d:
ax.绘图([x代表x,y代表d],[y代表x,y代表d])
其他:
对于zip格式的d、f(数据、格式):
ax.绘图([x代表x,y代表d],[y代表x,y代表d],f)
plt.show()
def main():
数据=时间函数([gt1,gt2],xrange(10501,10),make_参数)
绘图数据(数据,['bo','g.]
如果名称=“\uuuuu main\uuuuuuuu”:
main()

该功能的目标是什么
gt
不是一个很有描述性的名称。您是否试图查看
n
是否大于列表中的所有数字?还是更少?或者..?似乎是“nums中的任何元素都大于n”您肯定只需要一个循环。。。除了这总是查看比较列表中的所有元素,其中Mario的
任何
解决方案都可以在找到相反的示例后立即停止。@Hugh:在最坏和平均的情况下,这两种解决方案都是
O(n)
。实际上,使用
max
通常会更快,因为它是用C实现的。另外,谁还关心Python的性能呢?在用高级语言编写代码时,我肯定认为简单性高于效率。Mario的解决方案简单易读,但是:)忘记“更快”的部分,实际上哪一个更快并不重要,它高度依赖于输入过程,预期的常数差是因子2,因为在随机分布的数组中,中间元素将是我们在数组中寻找的命中率。这只是因为您总是选择数组范围内的元素。如果比较
n
实际上大于所有元素,甚至仅大于其75%的情况,结果将截然不同。正如我所说,这完全取决于输入(这就是为什么我在之前的评论中添加了另一条评论,说这里没有必要争论性能)。也就是说,我们不能对平均情况说任何话,因为我们没有关于输入的任何统计信息。我们只能说一些最坏的情况,这两种情况都同样糟糕。例如,只要看看将
n=randint(0,d)
更改为
n=randint(0,int(1.5*d))
from random import randint
from timeit import Timer
import matplotlib.pyplot as plt

def gt1(nums, n):
    # based on Niklas B.'s answer - NOTE comparison is corrected
    return n < max(nums)

def gt2(nums, n):
    # based on Mario Fernandez's answer
    return any(e > n for e in nums)

def make_data(length, lo=0, hi=None):
    if hi is None:
        hi = lo + length - 1
    elif lo > hi:
        lo,hi = hi,lo
    return [randint(lo, hi) for i in xrange(length)]

def make_args(d):
    nums = make_data(d)
    n = randint(0,d)
    return "{}, {}".format(nums, n)

def time_functions(fns, domain, make_args, reps=10, number=10):
    fns = [fn.__name__ if callable(fn) else fn for fn in fns]
    data = [[] for fn in fns]
    for d in domain:
        for r in xrange(reps):
            args = make_args(d)
            for i,fn in enumerate(fns):
                timer = Timer(
                    setup='from __main__ import {}'.format(fn),
                    stmt='{}({})'.format(fn, make_args(d))
                )
                data[i].extend((d,res) for res in timer.repeat(number=number))
    return data

def plot_data(data, formats=None):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    if formats is None:
        for d in data:
            ax.plot([x for x,y in d], [y for x,y in d])
    else:
        for d,f in zip(data, formats):
            ax.plot([x for x,y in d], [y for x,y in d], f)
    plt.show()

def main():
    data = time_functions([gt1, gt2], xrange(10, 501, 10), make_args)
    plot_data(data, ['bo', 'g.'])

if __name__=="__main__":
    main()