84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
今天学习Python,看到这样一个例子,想问一下原因:
w = "This is the left side of..." e = "a string with a right side." print w + e
结果是:
This is the left side of...a string with a right side.
我想问一下为什么通过使用 + 可以把两个字符串连成一个长字符串,用的是什么方法?
+
小伙看你根骨奇佳,潜力无限,来学PHP伐。
運算符重載。具體來說來,每個變數在Python中都是以物件形式存在的,即都是繼承於Object。而Object則有 object.__add__(self, other)這樣一個方法。每當處理x+y這一個表達式的時候,將會呼叫x.__add__(y)。另外為了交換律,還有__radd__方法,也就是用來處理y+x,這樣會呼叫y.__radd__(x)。 object.__add__(self, other)这样一个方法。每当处理x+y这一个表达式的时候,将会调用x.__add__(y)。另外为了交换律,还有__radd__方法,也就是用来处理y+x,这样会调用y.__radd__(x)。
object.__add__(self, other)
x+y
x.__add__(y)
__radd__
y+x
y.__radd__(x)
所以我们也可以自己重载+,比如:
class Free: def __init__(self, info): self.info = info def __add__(self, moreinfo): return str(self) + moreinfo def __radd__(self, moreinfo): return moreinfo + str(self) def __str__(self): return self.info
Free这个Class,便得以直接成为+操作符的左/右参数。
Free
正如richardzhiming所说,a+b是低效的,这是基于大量的+操作所讨论的。这是因为String是一个不可变的对象,你并不是真的把字符串b加到字符串a这个对象后面,而是需要创建一个新的对象,然后把a和b copy进去。因此当你大量进行+之时,你会创建许许多多临时的String对象。''.join(str_list)
a+b
''.join(str_list)
rrreee Free這個Class,便得以直接成為+操作符的左/右參數。
實際上調用的是所謂的特殊方法, 此例中是__add__dir(str)就可以看到那些“特殊方法”特殊方法, 此例中是__add__dir(str)就可以看到那些「特殊方法」
特殊方法
__add__
dir(str)
另,+连接字符串时,时间复杂度太高, 不如join方法, 比如"".join(iterable)
join
"".join(iterable)
+這個運算子提供了一個參數為兩個字串的重載
運算符重載。具體來說來,每個變數在Python中都是以物件形式存在的,即都是繼承於Object。而Object則有
object.__add__(self, other)
這樣一個方法。每當處理x+y
這一個表達式的時候,將會呼叫x.__add__(y)
。另外為了交換律,還有__radd__
方法,也就是用來處理y+x
,這樣會呼叫y.__radd__(x)
。object.__add__(self, other)
这样一个方法。每当处理x+y
这一个表达式的时候,将会调用x.__add__(y)
。另外为了交换律,还有__radd__
方法,也就是用来处理y+x
,这样会调用y.__radd__(x)
。所以我们也可以自己重载
+
,比如:Free
这个Class,便得以直接成为+
操作符的左/右参数。正如richardzhiming所说,
所以我們也可以自己重載a+b
是低效的,这是基于大量的+
操作所讨论的。这是因为String是一个不可变的对象,你并不是真的把字符串b加到字符串a这个对象后面,而是需要创建一个新的对象,然后把a和b copy进去。因此当你大量进行+
之时,你会创建许许多多临时的String对象。''.join(str_list)
+
,例如:rrreee
正如richardzhiming所說,Free
這個Class,便得以直接成為+
操作符的左/右參數。a+b
是低效率的,這是基於大量的+
操作所討論的。這是因為String是一個不可變的對象,你並不是真的把字串b加到字串a這個物件後面,而是需要建立一個新的物件,然後把a和b copy進去。因此當你大量進行+
之時,你會創建許許多多臨時的String物件。''.join(str_list)
比較好,則是因為,字串的建立和拷貝是一次完成,而不需要建立很多String物件。實際上調用的是所謂的
特殊方法
, 此例中是__add__
dir(str)
就可以看到那些“特殊方法”特殊方法
, 此例中是__add__
dir(str)
就可以看到那些「特殊方法」另,+连接字符串时,时间复杂度太高, 不如
另,+連接字串時,時間複雜度太高, 不如join
方法, 比如"".join(iterable)
join
方法, 例如"".join(iterable)
🎜+這個運算子提供了一個參數為兩個字串的重載