2010-08-11 2 views
2

Я работаю свой путь через некоторые примеры кода, и я наткнулся на это:Python + и * операторы

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

Я понимаю, что для чисел после 4 и до 20 они заканчиваются «е» и я могу см., что мы добавляем еще 17 элементов в список, и я понимаю, что '17 * ['th'] добавляет «th» к списку 17 раз, однако я не понимаю, как это работает.

Можете ли вы пролить свет на это?

+0

Обратите внимание, что это не подходит для всех регионов;) –

ответ

5

17 * ['th']['th', 'th', ..., 'th'] (17 элементы).

Кроме того, стоит отметить 2 модели поведения:

  • , что это действительно полезно только потому, что содержание 'th' неизменна (если, конечно, вы никогда не намеревался изменить окончание списка).
  • Объект списка ['th'] создан только один раз, однако он продлевается путем итерации по исходной копии 17 раз, добавляя каждую запись в окончательный список ['th', ...]. Это, в свою очередь, сливается с окружающими концами с помощью оператора +.

Обычно я не проливаю свой свет. Только раз в 6 месяцев. Если вы видите, что он лжет, не говорите никому, это мое.

0

Рассмотрим двадцатой двадцать первого двадцать второго двадцать третьих ... тридцатой тридцать первого

Или что-то другое, что вы не понимаете об этом?

+0

CrazyJuggler, прибивает, что я не понимал. Оператор * создает целый новый список, а затем добавляет его в предыдущий список. –

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

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 для более подробной информации

Смежные вопросы