2010-08-11 79 views
2

我通过一些代码示例工作我的方式,我偶然发现了这一点:Python的+和*运营商

endings = ['st', 'nd', 'rd'] + 17 * ['th'] + ['st', 'nd', 'rd'] + 7 * ['th'] 
+ ['st'] 

我明白了4起直到20号,他们在“日”结束,我可以看到我们将17个项目添加到列表中,并且我知道'17 *''th']将17次添加到列表中,但是,我不明白这是如何工作的。

你可以对此有所了解吗?

+0

注意,这不是在所有区域设置适当的;) – 2010-08-11 16:42:06

回答

5

17 * ['th']生成['th', 'th', ..., 'th'](17项目)。

另外值得注意的2种行为:

  • ,由于内容'th'是不可变的,这是唯一真正有用的(当然,除非你永远不打算修改结束列表)。
  • 列表对象['th']只创建一次,但是它通过迭代17次原始副本进行扩展,将每个条目附加到最终的['th', ...]列表中。这又通过+运营商与周围的结局合并。

我通常不会摆脱我的光。大约每6个月一次。如果你看到它躺着不要告诉任何人它是我的。

0

考虑 二十 二十一 第二十二 第二十三个 ... 三十 第三十一个

抑或是别的东西,你不明白呢?

+0

CrazyJuggler,钉在了我的不理解。 *运算符正在创建一个全新的列表,然后将其添加到之前的列表中。 – 2010-08-11 15:50:50

1

代码17 * ['th']的部分创建了17项全部'th'和+运算符连接列表一起的清单,让['st', 'nd', 'rd'] + 17 * ['th']将成为['st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th']

2

当乘以一个列表,你”重新创建一个包含多次列表元素的新列表。在这种情况下,17 * ['th']创建一个包含十七个字符串'th'的列表。将列表一起添加时,您将创建一个包含所有操作数元素的新列表。

>>> a = [1, 2] 
>>> a * 2 
[1, 2, 1, 2] 

>>> a = ['th'] 
>>> b = ['st'] 
>>> 3 * a + b 
['th', 'th', 'th', 'st'] 
1

这使得下面的列表:

endings = [ "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th" ] 

所以,如果你想要写 “21”,做

"{0}{1}".format(21, endings[ 20 ]) 

注意,列表是关闭的一个,因为endings[0]是第一个元素。

+0

'ordinal = lambda x:str(x)+ endings [x - 1]',对于0 2010-08-11 16:23:11

0

此外,您可以覆盖自己的对象的运算符,例如

#!/usr/bin/env python 
# encoding: utf-8 

class SomeClass(object): 
    def __init__(self, v): 
     self.value = v 

    def __add__(self, b): 
     return self.value + b.value 

def main(): 
    a = SomeClass(1) 
    b = SomeClass(2) 
    print a + b 


if __name__ == '__main__': 
    main() 

看到http://docs.python.org/library/operator.html更多细节