因为Python中的循环以某种方式提前退出

时间:2017-10-15 16:56:18

标签: python python-3.x for-loop break

我对这个模糊的标题感到非常抱歉,但我真的不知道我的代码发生了什么。我目前正在学习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关键字? 如果有人能够指出我在使用此代码时遇到了什么问题,我将非常感激,我该如何解决这个问题。提前谢谢!

3 个答案:

答案 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,是吗?