与类一起使用时*运算符的含义

时间:2018-11-15 09:13:15

标签: python

我一直在尝试学习有关Python的视频教程,但无法理解开发人员执行的一项操作。

class Polynomial():

    def __init__(self, *coeffs):
        self.coeffs = coeffs # (3,4,3)

    def __repr__(self):
        return 'Polynomial(*{!r})'.format(self.coeffs)

    def __add__(self, other):
        print(self.coeffs)
        print(other.coeffs)
        z = (x + y for x, y in zip(self.coeffs, other.coeffs))
        print(z)
        return Polynomial(*(x + y for x, y in zip(self.coeffs, other.coeffs)))

p1 = Polynomial(1, 2, 3) # x^2 + 2x + 3
p2 = Polynomial(3, 4, 3) # 3x^2 + 4x + 3
#print(p2) # Polynomial(*(3, 4, 3))
print(p1 + p2) # Polynomial(*(4, 6, 6))

上面的示例将打印

<generator object Polynomial.__add__.<locals>.<genexpr> at 0x030D0390>

作为z的返回值,我无法理解为什么,因为我正在执行两个元组的zip操作?

除了这个问题,我不明白为什么在返回*的过程中删除__add__会导致问题,即return Polynomial(*(x + y for x, y in zip(self.coeffs, other.coeffs)))return Polynomial((x + y for x, y in zip(self.coeffs, other.coeffs)))

*运算符的作用是什么,为什么z是多项式的对象?

_add__方法不包含包含***的参数,因此情况有所不同。

3 个答案:

答案 0 :(得分:1)

那么首先。

您的打印正常。您使用()括号定义了一个生成器。您可以将其更改为[],然后应该在列表中看到元素。

或者您可以使用发生器,所以打印:

print([el for el in z])

第二,*。

它将简单地将iterable作为单独的args传递,所以:

SomeClass(*args)

会这样做:

SomeClass(args[0], args[1], args[2], ...)

您可以在官方文档(单星号)中了解此内容,网址为:https://docs.python.org/3/reference/expressions.html#expression-lists 在这里(双星号): https://docs.python.org/3/reference/expressions.html#dictionary-displays

答案 1 :(得分:0)

在函数声明中,*是args发送的列表。

例如:

def my_function(a, *b, **c):
    print(a)
    print(b)
    print(c)

my_function("1st arg", "other arg", "other arg again", 2, arg_type="kwargs")

输出:

1st args
["other arg", "other arg again", 2]
{"arg_type": "kwargs"}


并且不在函数声明中时,它用于解压缩列表。

例如:

list_of_arguments = ['a', 'b', 'z']
my_str = "the first letter of alphabet is {}, the second is {} and the last is {}"
print(my_str.format(*list_of_arguments))


或其他示例

 def my_second_func(a, b, c):
     print(a)
     print(b)

 my_list = [1, 2, 3]
 my_second_func(a, b, c)

将输出:

 1
 2

答案 2 :(得分:0)

考虑以下简单示例:

final PDFMergerUtility pdfMerger = new PDFMergerUtility();
            pdfMerger.setDestinationStream(outputStream);
            pdfMerger.addSources(additionalPdfStreams);
            pdfMerger.addSource(inputStreamPdDocument);
            pdfMerger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());

在这种情况下,星号评估生成器表达式。所以当做

a = [1, 2, 3]
b = [4, 5, 6]

gen = (x + y for x, y in zip(a, b))

print(gen) ## this will print <generator object <genexpr> at 0x...>

您评估生成器表达式。