84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
今天学习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)
所以我们也可以自己重载+,比如:
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)更好,则是因为,字符串的创建和拷贝是一次完成,而不需要创建很多String对象。
a+b
''.join(str_list)
关于字符串连接具体的实验和更深入的探讨,可以参考:Efficient String Concatenation in PythonThe Python String Concatenation Shootout
另外,程序的优化的关键并不在于每个细节都优化到,而是优化整体的瓶颈,所以题主也不是一定要记住每一个细微的优化技巧。但是了解具体的实现细节,对于掌握语言,是很有意义的。
实际上调用的是所谓的特殊方法, 此例中是__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)
。所以我们也可以自己重载
+
,比如:Free
这个Class,便得以直接成为+
操作符的左/右参数。正如richardzhiming所说,
a+b
是低效的,这是基于大量的+
操作所讨论的。这是因为String是一个不可变的对象,你并不是真的把字符串b加到字符串a这个对象后面,而是需要创建一个新的对象,然后把a和b copy进去。因此当你大量进行+
之时,你会创建许许多多临时的String对象。''.join(str_list)
更好,则是因为,字符串的创建和拷贝是一次完成,而不需要创建很多String对象。关于字符串连接具体的实验和更深入的探讨,可以参考:
Efficient String Concatenation in Python
The Python String Concatenation Shootout
另外,程序的优化的关键并不在于每个细节都优化到,而是优化整体的瓶颈,所以题主也不是一定要记住每一个细微的优化技巧。但是了解具体的实现细节,对于掌握语言,是很有意义的。
实际上调用的是所谓的
特殊方法
, 此例中是__add__
dir(str)
就可以看到那些「特殊方法」另,+连接字符串时,时间复杂度太高, 不如
join
方法, 比如"".join(iterable)
+这个操作符提供了一个参数为两个字符串的重载