代码之家  ›  专栏  ›  技术社区  ›  Indrasish Banerjee

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

  •  0
  • Indrasish Banerjee  · 技术社区  · 7 年前

    对于这个模糊的标题我真的很抱歉,但我真的不知道我的代码发生了什么。我目前正在学习Python,并发现到目前为止它很有趣。我在练习 generator functions 并编写了一个小程序,使用 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 当它遇到两个匹配的数字和两端时,不应该是这种情况。是因为 break 不知为什么? 如果有人能指出我在这段代码中犯了什么错误,以及我应该如何解决这个问题,我将不胜感激。提前感谢!

    3 回复  |  直到 7 年前
        1
  •  0
  •   FredMan    7 年前

    我认为你的问题是你的想法有问题。

    根据代码的当前格式,您应该假设 一个回文,当你发现它不是的时候就断了。

    相反,您假设它不是,然后在第一次看到平等时将其设置为“它是”。但下一次你看到不平等时,你只是打破了它,没有再次设为假。

    如果我要对其进行编码,我就不会麻烦使用标志,我只会在发现不等式时返回“false”。

        2
  •  0
  •   Blusky    7 年前

    你的逻辑不对。

    默认情况下,您认为数字不是回文( flag=False if l[n]==l[i-n]: flag=True ).

    True 默认情况下,如果项目未镜像,则将标志返回到 False .

        3
  •  0
  •   Indrasish Banerjee    7 年前

    正如其他用户所指出的,我的代码在逻辑上显然是错误的。我从未将标志变量设置回 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))
    

    下面是布卢斯基和弗雷德曼提出的建议(至少可以说比我的效率高):

    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))