我对这个模糊的标题感到非常抱歉,但我真的不知道我的代码发生了什么。我目前正在学习Python并且到目前为止发现它很有趣。我正在练习domain2.com/test.php
的概念,并编写了一个使用generator functions
找到回文的小程序。
这是代码(Python 3.6,用Spyder编写):
generator function
跑步时我得到这个输出:
def ispalindrome(n):
#creates a list for storing the element of the number one by one
l=[]
#storing the digits
while n!=0:
l.append(n%10)
n=int(n/10)
#setting useful variables
i=len(l)-1
flag=False
#traversing the list and checking whether palindrome
for n in range(0,len(l)):
#this block is executed only if n is less than (len(l)-1)-n
if n<i-n:
#comparing elements
if l[n]==l[i-n]:
#flag is set to true everytime l[n] equals l[(len(l)-1)-n]
flag=True
else:
break
#if n>(len(l)-1)-n
else:
break
#returns the flag
return flag
#basic generator function that yields whenever ispalindrome() returns true
def palindromes(n=1111):
while True:
if ispalindrome(n): yield n
n+=1
#traversing through palindromes generator function
for n in palindromes():
if n>1131: break
print('{} is a palindrome'.format(n))
毋庸置疑,输出完全错误。我在我的代码中添加了一些打印并尝试找出问题,看起来程序正在提前退出1111 is a palindrome
1121 is a palindrome
1131 is a palindrome
函数内的for循环。一旦遇到两个数字和两个匹配的结尾,它就会退出ispalindrome()
,但情况并非如此。是不是因为for-loop
关键字?
如果有人能够指出我在使用此代码时遇到了什么问题,我将非常感激,我该如何解决这个问题。提前谢谢!
答案 0 :(得分:0)
我认为你的问题是你已经倒退了这个想法。
使用当前的代码格式,您应该假设它 IS 是一个回文并且当您发现它不是时会破坏。
相反,你假设它不是,然后在你第一次看到平等时将它设置为“它是”。但是下次当你看到不平等时,你只需要打破而不再将其设置为假。
如果我要对此进行编码,我就不会打扰旗帜,在发现不平等的那一刻,我只会返回“假”。
答案 1 :(得分:0)
你的逻辑不对。
默认情况下,您认为该数字不是回文(flag=False
),如果您看到镜像的int,则将该标志设置为true(if l[n]==l[i-n]: flag=True
)。
你应该这样做。您应该默认将标志设置为True
,如果项目未镜像,则返回False
的标记。
答案 2 :(得分:0)
正如其他用户所指出的那样,我的代码在逻辑上显然是错误的。每当我退出for循环时,我都没有将标志变量设置为False
。所以我考虑了所提出的建议并改变了我的代码。
以下是我之前使用flag
变量解决方案的代码:
def ispalindrome(n):
#creates a list for storing the element of the number one by one
l=[]
#storing the digits
while n!=0:
l.append(n%10)
n=int(n/10)
#setting useful variables
i=len(l)-1
flag=False
#traversing the list and checking whether palindrome
for n in range(0,len(l)):
#this block is executed only if n is less than (len(l)-1)-n
if n<i-n:
#comparing elements
if l[n]==l[i-n]:
#flag is set to true everytime l[n] equals l[(len(l)-1)-n]
flag=True
else:
flag=False
break
#if n>(len(l)-1)-n
else:
break
#returns the flag
return flag
#basic generator function that yields whenever ispalindrome() returns true
def palindromes(n=1111):
while True:
if ispalindrome(n): yield n
n+=1
#traversing through palindromes generator function
for n in palindromes():
if n>2552: break
print('{} is a palindrome'.format(n))
以下是Blusky和Fredman所建议的(比我的说法更有效率):
def ispalindrome(n):
#creates a list for storing the element of the number one by one
l=[]
#storing the digits
while n!=0:
l.append(n%10)
n=int(n/10)
#setting useful variables
i=len(l)-1
#traversing the list and checking whether palindrome
for n in range(0,len(l)):
#this block is executed only if n is less than (len(l)-1)-n
if n<i-n:
#comparing elements
if l[n]!=l[i-n]:
#flag is set to true everytime l[n] equals l[(len(l)-1)-n]
return False
#if n>(len(l)-1)-n
else:
break
#returns the flag
return True
#basic generator function that yields whenever ispalindrome() returns true
def palindromes(n=1111):
while True:
if ispalindrome(n): yield n
n+=1
#traversing through palindromes generator function
for n in palindromes():
if n>2552: break
print('{} is a palindrome'.format(n))
P.S:我既不是专业的软件开发人员,也不是高级课程或导师,这就是为什么像stackoverflow这样的问题板对我有用。我知道这是一个愚蠢的问题,如果我一次又一次彻底检查我的代码,我可能已经意识到这个错误,但我不认为它需要一个downvote,是吗?