【问题标题】:Perfect Squares Python完美正方形 Python
【发布时间】:2021-11-20 08:16:18
【问题描述】:

我一直在尝试编写一个代码,该代码假设使用面向对象编程从实例变量的给定值返回完美的正方形。以下是我写的内容,但我仍然无法获得完美的正方形。下面是我写的

# Write a class, PerfectSquares, that implements an iterator
# This will return 1, 4, 9, 25, 36, 49, etc

class PerfectSquares:
    def __init__(self, x):
        self.x = x
        
    def get_values(self):
        return self.x**2

values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in values:
    getter = values.get_values(i)
    print(getter)

【问题讨论】:

    标签: python oop


    【解决方案1】:

    您应该同时实现__iter____next__ 方法。

    python中的迭代器对象符合迭代器协议,这基本上意味着它们提供了两种方法:__iter____next__

    • iter 返回迭代器对象,并在循环开始时被隐式调用。

    • next() 方法返回下一个值,并在每次循环增量时被隐式调用。当没有更多返回值时,此方法会引发 StopIteration 异常,该异常被循环构造隐式捕获以停止迭代。

    迭代器的好资源:https://www.ibm.com/developerworks/library/l-pycon/

    class PerfectSquares:
        """Class to implement an iterator
        of perfect squares"""
    
        def __init__(self, k):
            self.k = k
            self.n = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            self.n += 1
            if self.n <= self.k:
                result = self.n ** 2
                return result
            else:
                raise StopIteration
    v = PerfectSquares(10)
    for i in v:
        print(i)
    

    这将输出:

    1
    4
    9
    16
    25
    36
    49
    64
    81
    100
    

    【讨论】:

    • 为什么要让它成为一个迭代器?而且这个迭代器没有按照规范实现。
    • "如果需要,可以进行一些初始化。"它可能不应该。您引用的来源似乎不太好。
    • @juanpa.arrivillaga 它基于规范,我指的是评论部分(因为我假设在写问题时遗漏了一些)。我选择应用返回值的长度,但这只是为了给用户一个想法
    • @juanpa.arrivillaga 关于来源,我从我提供的链接中复制了一小部分。你能参考一个更好的来源,我会更新答案。
    • 绝对没有按照规范正确实现迭代器。最大的问题是__iter__ 中的self.n = 0
    【解决方案2】:
    1. 首先,您必须创建类的对象并传递值。 (obj = PerfectSquares(i))

    2. 其次,使用该 obj 调用 get_values 方法 不传递任何 参数,因为 get_values 没有接受任何参数。

    3. 第三,打印变量。

    参考以下代码:

    class PerfectSquares:
        def __init__(self, x): # this constructor takes an argument 'x'.
            self.x = x
            
        def get_values(self): # this function takes no argument.
            return self.x**2
    
    values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    for i in values:
        obj = PerfectSquares(i) # 'i' variable is passed to 'x' in class.
        getter = obj.get_values() # returns the square of 'i' ('x' in class).
        print(getter)
    

    输出:

    1
    4
    9
    16
    25
    36
    49
    64
    81
    100
    

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2010-12-05
      • 2022-08-23
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多