Добавить строку в другую строку - PullRequest
1 голос
/ 16 июня 2010

В настоящее время я столкнулся с проблемой: Я хочу очень эффективно обрабатывать добавление строк в другие строки, поэтому я просмотрел много методов и техник и определил «самый быстрый» метод. Но я совершенно не могу понять, как это на самом деле работает:

def method6():
    return ''.join([`num` for num in xrange(loop_count)])

Из источник (метод 6)

Особенно ([`num` for num in xrange(loop_count)]) полностью смутил меня.

Ответы [ 4 ]

6 голосов
/ 16 июня 2010

это список , который использует обратные метки для repr преобразования.Не делай этого.Обратные галочки устарели и удалены в py3k, и более эффективный и pythonic способ не построить промежуточный список вообще, но использовать выражение генератора:

''.join(str(num) for num in xrange(loop_count))        # use range in py3k
2 голосов
/ 16 июня 2010

xrange () - более быстрая (написанная на C) версия range ().

Обозначение обратного тика - num, приводит переменную к строке и совпадает с str (num).

[x для x in y] называется пониманием списка и в основном представляет собой однострочный цикл, который возвращает список в качестве результата. Итак, все вместе, ваш код семантически эквивалентен следующему, но быстрее, потому что понимание списка и xrange быстрее, чем для циклов и range:

z = []
for i in range(loop_count):
   z.append(str(i))
return "".join(z)
2 голосов
/ 16 июня 2010

Этот бит в скобках - это понимание списка, возможно, один из самых мощных элементов Python.Создает список из итерации.Вы можете посмотреть его документацию.Использование обратных символов для преобразования num в строку не рекомендуется - попробуйте вместо этого использовать str (num) или что-то подобное.

join () - метод класса строки.Он принимает список строк и возвращает одну строку, состоящую из каждой строки компонента, разделенной «self» (иначе называемой вызывающей строкой).Хитрость в том, что join () вызывается непосредственно из строкового литерала '', что разрешено в Python.Этот код создает строку, состоящую из строковой формы каждого элемента xrange (loop_count) без разделения.

1 голос
/ 16 июня 2010

Прежде всего: хотя этот код все еще корректен в серии Python 2.x, он немного сбивает с толку и может быть записан по-другому:

def method6a():
    return ''.join(str(num) for num in xrange(loop_count))

В Python 2.x обратные галочки могутиспользоваться вместо функции repr.Выражение в квадратных скобках [] является пониманием списка.В случае, если вы новичок в списках: они работают как комбинация цикла и оператора добавления списка, только вам не нужно придумывать имя для переменной:

Эти два эквивалентны:

a = [repr(num) for num in xrange(loop_count)]
# <=>
a = []
for num in xrange(loop_count):
    a.append(repr(num))

В результате понимание списка будет содержать список всех чисел от 0 до loop_count (исключительно).

Наконец, string.join(iterable) будет использовать содержимое stringобъединить все строки в iterable, используя string в качестве разделителя между каждым элементом.Если вы используете пустую строку в качестве разделителя, то все элементы объединяются без чего-либо между ними - это именно то, что вы хотели: объединение всех чисел от 0 до loop_count.

Что касается моих модификаций:

  • Я использовал str вместо repr, потому что результат одинаков для всех целых чисел и его легче читать.
  • Я использую выражение генератора вместо понимания списка, потому что список, созданный пониманием списка, не нужен и все равно собирает мусор.Выражения генератора являются итеративными, но им не нужно хранить все элементы списка.Конечно, если у вас уже есть список строк, просто передайте этот список в объединение.

Как правило, идиома '' .join (итеративная) хорошо понимается большинством программистов на Python как означающая«конкатенация строк любого списка строк», поэтому понятность не должна быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...