使python代码更有效率

时间:2016-08-17 00:51:22

标签: python performance

我有代码

num = 1
num2 = 1
num3 = 1
list = []
list2 = []
list3 = []

def numCheck1 (num):
    while num<1001:
        if (num%3==0):
            if (num%5==0):
                print num
                list.append(num)
                num+=1
                numCheck1(num)
                break
            else:
                print "error 1"
        else:
            print "error 2"
        num+=1

numCheck1(num)
total=sum(list)
print list
print total

def numCheck2 (num2):
    while num2<1001:
        if (num2%5==0):
            print num2
            list2.append(num2)
            num2+=1
            numCheck1(num2)
            break
        else:
            print "error"

numCheck2(num2)

def numCheck3 (num3):
    while num3<1001:
        if (num3%3==0):
            print num3
            list3.append(num3)
            num3+=1
            numCheck1(num3)
            break
        else:
            print "error"

numCheck3(num3)

total2 = sum(list2)
total3 = sum(list3)
overall = (total2 + total3) - total
print list2
print list3
print total2
print total3
print overall

作为我的代码的基本摘要,我有3个函数,每个函数都有相应的列表和变量。第一个函数检查下面3和5的所有倍数并且等于1000.第二个函数检查下面所有5的倍数并且等于1000.第三个检查下面所有3的倍数并且等于1000.数字是倍数被添加到相应的列表中,而相应的变量递增以允许函数检查所有数字。最后,程序计算4个总计:每个列表的总和,以及一个特殊总计,它将第二个总计加在一起并减去第一个以防止计数过多。这只是该计划的总体结构。

这个程序应该解决this problem(不是功课,只是有趣)。代码正在工作(据我所知;第一个函数肯定有效)但它不断崩溃编译器(我使用的是在线编译器,repl。我想知道是否有任何方法可以使这个代码更多高效。

谢谢!

2 个答案:

答案 0 :(得分:2)

我已经重新编写了您的代码,并在线注释。你可以对此进行更多的改进,但我认为看到你可以改进这些代码的地方对你有所帮助。

# If you use this, it should be the first line
# in your code. If you're using Python2, you *should*
# use this, because it will make switching to Python3
# that much easier.
from __future__ import print_function

# No need for these global variables
#num = 1
#num2 = 1
#num3 = 1
#list = []
#list2 = []
#list3 = []
#

# Functions should be snake_cased, not camelCase
# also, the blank space between the function name
# and the paren is inconsistent with typical
# Python code.
def num_check_one(start):
    # We'll put the return list in here. Also
    # calling it `list = []` would have shadowed
    # a builtin function. Let's give it a better name:
    multiples = []

    # If you're iterating over known values in Python
    # use a for loop over a range instead.
    for num in range(start, 1001):

        # No need to nest your ifs.
        # Parenthesis are usually just extra noise,
        # But you might find it a little clearer with
        # them to clarify the grouping
        #if (num % 3 == 0) and (num % 5 == 0):
        # This could also be written as
        # if (not num % 3) and (not num % 5):
        # Or, using De Morgan's law:
        # if not (num % 3 or num % 5):
        if num % 3 == 0 and num % 5 == 0:
            print(num)
            multiples.append(num)
            # Uh, no need to recursively call
            # your function here.
            #numCheck1(num)
            #break
        # And finally, you don't need any of these
#            else:
#                print "error 1"
#        else:
#            print "error 2"
#        num+=1
    return multiples


# You can use the keyword in your function call
# which makes it clear what the value is for
multiples = num_check_one(start=1)
total=sum(multiples)
print('Multiples:', multiples)
print('Total:', total)

# Again, fixed casing/spacing, and gave the
# parameter a meaningful name
def num_check_two(start):
    multiples = []
    # Again, for loop
    for num in range(start, 10001):
        # 0 is Falsey, so we can
        # just treat it as a bool value
        if not num % 5:
            print(num)
            multiples.append(num)
            # Got rid of the recursive call again
        # You were never incrementing `num2` here,
        # which is why your code got into an infinite
        # loop. Also why you should use `for` loops by
        # default

num_check_two(1)

答案 1 :(得分:1)

numCheck1:由于所有 3和5的倍数也是 15的倍数,您只需打印出range(0, 1001, 15)中的每个项目(数量为15)

numCheck2range(0, 1001, 5)(按5计算)应该已经是5的倍数小于或等于1000。

numCheck3range(0, 1001, 3)(按3计算)与上面相同,只是3的倍数。