我一直在尝试学习有关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__
方法不包含包含*
或**
的参数,因此情况有所不同。
答案 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...>
您评估生成器表达式。