我有代码
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。我想知道是否有任何方法可以使这个代码更多高效。
谢谢!
答案 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)
numCheck2
:range(0, 1001, 5)
(按5计算)应该已经是5的倍数小于或等于1000。
numCheck3
:range(0, 1001, 3)
(按3计算)与上面相同,只是3的倍数。