Кстати, в задачке про АОН если цифра встречается один раз в массиве из повторяющихся цифр, то она разобьет этот массив на группы? То есть, "111111211111" будет равно "1" или "11"? По идее, первый вариант правильный, ведь 2 — это лишь помеха. Но в условии это не было оговорено.
Попробовал решить задачу без использования циклов, чтобы можно было получить однострочник, и вот, что вышло: http://pastebin.com/f71a95b7a.
Однострочник для читаемости пришлось развернуть. Кошмарненько, но наверняка можно упростить как-нибудь. :)
Об этом написано, например, в статье «Бородавки в Python», где пишется про подобные неочевидности.
Цитата:
«Гвидо Ван Россум высказался против добавления join() в объекты последовательностей, т.к. это бы означало, что каждая последовательность должна была бы реализовывать этот метод; в Python есть три типа последовательностей (строки, кортежи и списки), а также куча классов, которые ведут себя как последовательности.»
Я же предпочитаю думать о join просто как о бинарном операторе, у которого слева строка и справа список.
Не хочу лишать людей, знакомящихся с Python, удовольствия самим решать задачки, но все же не могу не продемонстрировать гибкость этого языка.
Пусть пользователь поместил свою строку в переменную s. Если он вводит только латинские буквы и цифры, то первую задачку можно решить очень просто:
print s, s, s
Это строка s сразу в utf-8, latin-1 и cp1251, например. :)
Python мне нравится и за то, что в ним можно использовать функциональный стиль программирования, что часто сокращает решение до одной строчки и повышает читаемость (ну, это уже когда как):
for x in map(lambda enc: s.encode(enc), ["cp1251","utf-8", "koi8-r"]):
print x,
Тут используется аж два известных функциональных приема — определение безымянной функции (lambda), преобразующей строку s в указанную в параметре кодировку, и её применение (map) к каждому из элементов списка. Таким образом, цикл проходит по списку, состоящему из исходной строки, к которой применилось преобразование в различные кодировки.
Тут используется объединение списка строк. В качестве разделителя используется пробел. Кстати, подобная запись, когда метод для объединения применяется к строке-разделителю, а не к списку, может показаться странным, но к нему быстро привыкаешь.
Хотя, старый добрый for с перебором кодировок сделает решение более ясным и удобочитаемым (впрочем, это опять же дело вкуса):
for enc in ["cp1251","utf-8", "koi8-r"]:
print s.encode(enc)
Одним словом, программист сам может выбрать стиль, в котором он может писать программы.
А где можно почитать о таких ускоряющих трюках?
Попробовал решить задачу без использования циклов, чтобы можно было получить однострочник, и вот, что вышло: http://pastebin.com/f71a95b7a.
Однострочник для читаемости пришлось развернуть. Кошмарненько, но наверняка можно упростить как-нибудь. :)
Цитата:
«Гвидо Ван Россум высказался против добавления join() в объекты последовательностей, т.к. это бы означало, что каждая последовательность должна была бы реализовывать этот метод; в Python есть три типа последовательностей (строки, кортежи и списки), а также куча классов, которые ведут себя как последовательности.»
Я же предпочитаю думать о join просто как о бинарном операторе, у которого слева строка и справа список.
Пусть пользователь поместил свою строку в переменную s. Если он вводит только латинские буквы и цифры, то первую задачку можно решить очень просто:
print s, s, s
Это строка s сразу в utf-8, latin-1 и cp1251, например. :)
Python мне нравится и за то, что в ним можно использовать функциональный стиль программирования, что часто сокращает решение до одной строчки и повышает читаемость (ну, это уже когда как):
for x in map(lambda enc: s.encode(enc), ["cp1251","utf-8", "koi8-r"]):
print x,
Тут используется аж два известных функциональных приема — определение безымянной функции (lambda), преобразующей строку s в указанную в параметре кодировку, и её применение (map) к каждому из элементов списка. Таким образом, цикл проходит по списку, состоящему из исходной строки, к которой применилось преобразование в различные кодировки.
А можно и так:
print " ".join(map(lambda x: s.encode(x), ["cp1251","utf-8", "koi8-r"]))
Тут используется объединение списка строк. В качестве разделителя используется пробел. Кстати, подобная запись, когда метод для объединения применяется к строке-разделителю, а не к списку, может показаться странным, но к нему быстро привыкаешь.
Хотя, старый добрый for с перебором кодировок сделает решение более ясным и удобочитаемым (впрочем, это опять же дело вкуса):
for enc in ["cp1251","utf-8", "koi8-r"]:
print s.encode(enc)
Одним словом, программист сам может выбрать стиль, в котором он может писать программы.