【问题标题】:Python Perfect Square蟒蛇完美广场
【发布时间】:2013-07-07 03:50:00
【问题描述】:

我正在编写一个函数,它以列表 L 作为参数并返回一个列表,该列表由 L 中的所有完美正方形元素组成。

def isPerfectSquare(n):

    return n==int(math.sqrt(n))**2


def perfectSquares2(L):

    import math
    return(list(filter(isPerfectSquare,(L))))

我认为我的过滤功能有问题,但我不知道如何修复它......

【问题讨论】:

  • 是什么让你认为这是错误的?
  • math.sqrt 是近似值,因此当您达到浮点精度限制时,平方检查将失败。

标签: python python-3.x


【解决方案1】:

你必须在isPerfectSquareimport math,否则它只是导入到perfetSquares2函数的本地范围内。

不过,PEP 8 建议您将模块导入放在脚本的顶部:

import math
def isPerfectSquare(n):
    return n==int(math.sqrt(n))**2

def perfectSquares2(L):
    return(list(filter(isPerfectSquare,(L))))

顺便说一句,我认为这里的列表理解可能更快:

def perfectSquares2(L):
    return [i for i in L if isPerfectSquare(i)]

【讨论】:

    【解决方案2】:

    这是使用lambda 的好地方。此外,如果是 Python 2.x 或额外的括号,则无需使用 list()

    import math
    def perfectSquares2(L):
        return filter(lambda n: n==int(math.sqrt(n))**2, L)
    

    【讨论】:

    • 在 Python 3 中,filter 不返回列表。
    【解决方案3】:
    x=int(input())
    if x>0:
        for i in range(x):
            p=i**2
            print(p)
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!