Как стать автором
Обновить

Комментарии 108

когда будете проверять домашнее задание? по какой шкале оценки?
когда вышлете его мне в личку, буду проверять. оценки - чисто для вас. бинарные. да-нет :)
Покажите как использовать len() на примере. Плз.
>>> a = '123456789'
>>> print len(a)
9
не помню, писали ли вы о версии питона в примерах. Но стоит указывать все же. Так как начав разбираться не сразу понял ошибки, оказалось что в версии 3 print уже функция и нужно писать print(len(a))
этой статье 2 года почти, в то время 3 пайтон еще был из области экзотики, надо же на это поправку делать.
да. извиняюсь, на дату не сразу посмотрел.
Но вот я читал сегодня, а после меня придет новичек, скачает последнюю версию (3 или какую там потом) попробует пописать, не разберется, разозлится и плюнет на это дело. :) Можно просто пометить в статье, что примеры кода приведены для определенной версии языка.
Вот я пришол.
Неужели на хабре нет людей, которые пишут на Питоне? Автору статьи спасибо за развитие данного блога, но, ИМХО, перепечатывать книгу по Питону, которую каждый может скачать с официального сайта как-то не прилично.
Люди плюсуют - значит им нужно. ИМХО
Но есть кому и не надо О_О Но они почему-то молчат.
кому не надо правильно молчат
зачем мешать другим получать знания
А когда планируется первый релиз РЯП ? :)
Вы озвучили массу планов, столько всего интересного... ждем продолжения :)
Неужто кто-то еще помнит? :) Остатось еще немного. Первая IDE для РЯП выйдет как раз когда карму подниму :)
плюсует школие, выпросившее копейку кармы.
надеюсь вы больше не будете засорять интернет мусором, перепечатывая материал из оригинальных источников.
Господи, кто бы говорил. Посмотрите на свою карму, а потом высказывайтесь так в чужую сторону. Бред...
см. мой ответ начавшему данную тему. остальное комментировать не буду.
я не перепечатываю книгу. просто про строки сказать много нечего. но пропустить нельзя. потому и получается похоже на оригинальную книгу.
в принципе действительно получается отчасти некрасиво, потому я постараюсь в следующем посте собрать все ссылки на всю информацию на русском что есть.
и кто не захочет читать мои "конспекты" сможет спокойно этого не делать.
для тех же кому это полезно - пока продолжу. тем более что дальше темы будут все интереснее... :)
Есть.

ИМХО пусть перепечатывает.
Это возможность ознакомиться с праведной мощью Python для людей которые не хотят целенаправленно изучать его, но не прочь поглядеть новый язык.

P.S. Устал ждать по 5 минут. Мысли появляются чаще, а пока сидишь выжидаешь часть из них забывается.
солидарен с Вами. Вот я по работе использую питон на начальном уровне - в основном как консольный парсер. Но книгу читать мне просто некогда (нет времени на это). А вот такие статейки я бы читал и потихонечку просвещался.

Cleg - если надумаешь "закрывать" такие вот статьи - пости для друзей :) только не бросай
посмотрим...
вы читали притчу про дровосеков?
оправдание, чтобы что-то не делать всегда найдется, а вы найдите оправдание чтобы сделать что-то.
между прочим, чтение книги у вас заняло бы столько же времени, сколько чтение книги. плохому танцору всегда яйца мешают.
А что за книга?
книг несколько. постараюсь или сегодня в квечеру или завтра выложить пост со списком ссылок на все что есть по пайтону на русском.
Жду с нетерпением. Надеюсь в списке будет то чего нету портале питон-программистов http://python.su/forum/viewtopic.php?id=18
коллекцию литературы slav0nic-а я вряд ли переплюну :)
Есть, и думаю таких на Хабре немало.
Например, у меня сейчас все раразработки идут на питоне. И чем дальше с ним работаю, тем больше нравится. Но я помню как сам когда-то начинал. И вот тут необычность питона как в синтаксисе, так и в логике создает некоторые проблемы, можно сказать «первоначальный барьер». Такие статьи как раз нужны новичкам, чтобы познакомить их с самим языком, показать базовые конструкции, как с этим работать, что этот язык однозначно стоит того, чтобы его освоить - окупится сторицей.
В этом плане автор делает хорошее дело — в простой понятной манере знакомит с языком, кому надо тот заинтересуется, кому не надо — пройдет мимо. Каждому свое.
Автор делает доброе дело, спасибо, с удовольствием изучаю. Возможно вы слушали последний (195) на текущий момент времени UWP (подкаст умпутуна), в котором он расказывал о методах обучения его дочки игре на музыкальном инструменте. Метод донесения инфы автора топика схож с озвученым в подкасте методом (кто не слушал, метод связанный с игрой).
Не хочу лишать людей, знакомящихся с 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) к каждому из элементов списка. Таким образом, цикл проходит по списку, состоящему из исходной строки, к которой применилось преобразование в различные кодировки.

А можно и так:

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)

Одним словом, программист сам может выбрать стиль, в котором он может писать программы.
почему join - метод строки? по моим представлениям это должен быть метод массива
всегда было инетересно, почему так
Эти голландцы - такие затейники!..
Сначала тоже показалось странным, но потом привык, и так даже лучше:)
Об этом написано, например, в статье «Бородавки в Python», где пишется про подобные неочевидности.

Цитата:

«Гвидо Ван Россум высказался против добавления join() в объекты последовательностей, т.к. это бы означало, что каждая последовательность должна была бы реализовывать этот метод; в Python есть три типа последовательностей (строки, кортежи и списки), а также куча классов, которые ведут себя как последовательности.»


Я же предпочитаю думать о join просто как о бинарном операторе, у которого слева строка и справа список.
Долой Питон! Да здравствует Пайтон!
Я, наверное, как-то нереально торможу, но так и не въехал в объяснения автора про решётку для третьей задачи...
если в номере телефона есть несколько одинаковых цифр подряд, то каждая вторя заменяется на решетку. чтобы отличить от предыдущей цифры
Дошло. Ничотак.
http://rafb.net/p/c0F05n12.html - годится? Или можно короче?
неплохо, очень неплохо :) хотя и не слишком читабельно, но демонстрирует много синтаксических плюшек пайтона :)
особо укорачивать не стоит. тут главное выразительность, а не коротизна...
Вот так лучше, кажется:
http://rafb.net/p/8Knr8267.html
print decode_aon('44##4455')
?
:-)
сейчас нет питона под рукой, не на чем проверить. но кажется ваш вариант не будет корректно отрабатывать # в самом начале строки. (могу и ошибиться)
отрабатывает. чтоб не быть голословным, проверил :)
print decode_aon_numer_short('##44##4455')
падает
IndexError: string index out of range
я про это и писал, что "кстати все варианты, кроме http://rafb.net/p/8Knr8267.html , валятся на '##1'" - все, это и мой в том числе.
а на одиночной # не валится :)
Поправил свой вариант http://rafb.net/p/8Knr8267.html
Стало так:
http://rafb.net/p/NlDHpu78.html

Надо ли безошибочно обрабатывать следующие случаи?
"###4434###552222311333661"
"5###4434###552222311333661"
# которой не предшествует цифра следует считать помехой и игнорить...
>>> print aon_decode('44##4455')
444
5 потерялась
блин, питон это конечно, круто :)
тоже самое на руби выглядит не особо... http://rafb.net/p/x0A2lg85.html
Вообще не пишу на питоне и не вникал в синтаксис.
Но вставить свои 5 копеек все же решил :)
http://rafb.net/p/3O5z2b96.html
неплохо работает и при этом читабелен :)
Неправильно работает на:
"###4434###552222311333661"
"5###4434###552222311333661"
ну у вас и инпут неправильный ;-)
можно игнорировать хэши в начале строки: http://rafb.net/p/dGlDyc45.html (там еще интересный вложенный ternary operator)
Гвидо говорит, код читают много больше чем пишут... ;)

> In [21]: aon_decode("444333444")
> Out[21]: '34'
теперь осталось найти энтузиаста, который сравнит быстродействие всех этих алгоритмов ;-)
http://rafb.net/p/lUAPb542.html

Никого не забыл? Ничего не напутал? :)

Результаты:

aon_c0F05n12
failed

aon_8Knr8267
f( ##1 ) !=
failed

aon_JIJYos17
failed

aon_tLK1ts77
failed

aon_NlDHpu78
0.219000101089

aon_bGjM3C86
f( ##44##4455 ) != 4445
failed

aon_MUDuVv18
f( ##44##4455 ) != 4445
failed

aon_QT4MtA83
failed

aon_3O5z2b96
f( 5###4434###552222311333661 ) != 4452136
failed

aon_SDqC1C58
f( ###4434###552222311333661 ) != 4452136
failed

aon_dGlDyc45
0.296999931335

aon_f71a95b7a
0.390000104904
спасибо! вашему решению (NlDHpu78) торжественно присуждаем первое место. приз сегодня скромный - плюсик в карму ;-)
и от меня за титаническую работу по сведению воедино :)
моя исправленная версия работает быстрее всех остальных :)
http://rafb.net/p/Tm5EBF17.html
провёл маленький тест на ускорение работы скрипта вот сама быстрая версия из всех представленных, хотя не самая красивая.

далее идет эта версия аналог предыдущей, но покрасивее

использование операторов is и is not для строк ускоряет процесс, чем использование == и !=
Спасибо, про is и is not не знал. Попробовал — действительно стало заметно быстрее.

А где можно почитать о таких ускоряющих трюках?
ну, для начала - почти классическая статья, в основном про работу со строками http://www.python.org/doc/essays/list2st…

еще неплохо кое-что описано тут (в основном что иногда полезно "переложить работу на других") http://handyfloss.wordpress.com/2008/02/…

кое-что еще тут http://blog.ianbicking.org/book-idea-pyt…

на самом деле - в пайтоне полным-полно мест для небольшой оптимизации и советов типа "используйте где только можно кортежи вместо списков", "выносите разрешене методов за пределы циклов" (это вообще на удивление большой прирост иногда дает...

и т.п.
спасибо за ссылки почитаю
python.org основной источник, читайте документацию
оператор is проверяет идентичность объектов, а == только сравнивает используя метод __eq__ данных объектов.

у каждого объекта есть свой идентификатор, вычислить можно так id(obj).

например для строк:
a = 'test'
b = 'test'
id(a) == id(b) тоже самое что a is b # true

но для строки и юникода результат разный, так как разные объекты:
a = 'test'
b = u'test'
a is b # false
хотя a == b # true

только не путайте is и == совсем разные операторы.
aon_dGlDyc45 сыпется на aon_decode('22122') == '2', так что чемпиона таки 2.

Но! Все дружно не учитывают вот такой случай: '33212'. По моей логике должно получиться '32', а не '3', т.к. смотрите, шёл сигнал '33222', и в него затесалась помеха '33212', что скажете?
из условия 33212 - 2 будет считаться помехой т.к. за не следует 1
да. все одиночные символы - помехи.
Кстати, в задачке про АОН если цифра встречается один раз в массиве из повторяющихся цифр, то она разобьет этот массив на группы? То есть, "111111211111" будет равно "1" или "11"? По идее, первый вариант правильный, ведь 2 — это лишь помеха. Но в условии это не было оговорено.

Попробовал решить задачу без использования циклов, чтобы можно было получить однострочник, и вот, что вышло: http://pastebin.com/f71a95b7a.

Однострочник для читаемости пришлось развернуть. Кошмарненько, но наверняка можно упростить как-нибудь. :)
не вижу ничего кошмарного :)
хорошее решение
А ещё можно делать вот так:
>>> s='123456789'
>>> s[2:7:2]
'357'

То есть кроме начала и коныа ещё и указывать с каким шагом просматривать элементы.
Невнимательно читал. Про это в статье было. (=
А удалить коммент нельзя?
# все символы с 8 по 14

>>> str[7:14]

вот тут мне кажется решение должно быть str[7:13] - ибо 13 это 14-й символ в строке
нет я не прав...хотя это не логично имхо
надо указать С какого символа брать срез и ДО какого причем его не включать в срез
да, примерно по той же логике работают в С++ алгоритмы (если мне конечно память не изменяет)
то есть срез [a, b)
в общем запутывающая логика...
> # каждый второй символ строки.
> >>> str[::2]
> 'Hlo re ol!'

Ещё можно рассказать про то, что step может быть и отрицательным.
То есть:
>>> str = "Goodby, cruel world!"
>>> str[::-1]
'!dlrow leurc ,ybdooG'
>>>
ы! вау! спасибо. настолько извращенно я даже не подумал.
Хм, не хочется расстраивать, но в аналоге этого оператора в PHP - функции substr точно также всё работает с отрицательными величинами...
зачем расстраиваться? то что хорошие идеи из Пайтона прживаются в других языках - это же просто замечательно.
кстати в Пайтоне точно так же идет работа и со списками... так что не тока substr нужен
Всё-таки PHP в основном на веб ориентирован, в отличие от Пайтона.
Просто не стоит думать, что это такая уникальная фича Пайтона. Хотя фича, бесспорно, крайне рулёзная.
Очень удобно, когда не требуется специальная функция для среза. Подобная штучка, кстати, есть и в Фортране-90 для массивов.
да - иногда такое спрашивают на собеседованиях - как максимально быстро зареверсить строку - питон в этом смысле хорош :))
Охренеть:))
НЛО прилетело и опубликовало эту надпись здесь
Еще один способ склейки строк - написать их подряд.
>>> "aa" "bb"
'aabb'
>>> "aa" \
... "bb"
'aabb'
>>>

удобно для красивого оформления многострочных констант в теле функций
да, но работает только со строками. то есть написать типа
>>> " dsdsd ".strip() "fdfdf"

увы не получится.
Да. И это правильно - иначе бы порождало жуткую путаницу. Работа со строками стала бы аццким дебугом — пришлось бы постоянно угадывать где он склеит, а где не склеит.
Я потому и написал, что «удобно для оформления констант», потому что это скорее syntactic sugar — простая удобная форма записи километровой строки, чем запись логики программы.
забыл цитату, типа "синтаксический сахар может зачастую взывать диабет нечитабельности" :) или как-то так... но это пример безопасного сахара
Большое спасибо за гайд! Очень интересно и познаватель - вчера уже скачал интерпритатор, вин32 библиотеки и пару редакторов - сегодня уже пишу анализаторы excel листа на пайтоне, вместо си-шарпа.

А по по поводу "зачем переписывать книгу" - так доступнее.
а для платформы .NET есть отличая вещь - Boo (http://boo.codehaus.org/) пайтоноподобный язык ориентированный под CLR. отлично интегрируется с шарпом. я даже писал когда-то простую статью как сделать смешанный проект на двух языках :)
есть кончено и "родной" IronPython - но у него вечный проблемы с динамической памятью
Вы делаете хорошую и правильную работу, создавая этот цикл для начинающих.

Есть, правда, небольшое замечание - не используйте, пожалуйста, cp1251 и прочие такие, казалось бы, малозначимые штучки, специфические для одной платформы. Здесь много людей, которые используют совсем не платформу от ребят из Редмонда. Да и вообще, cp1251, koi8-r - это же всё уже устарело лет на 15, зачем пользоваться этим, когда есть Unicode ?
но много и тех кто используют :) не будем холиворить...
хотя я честно написал что Юникод - всегда лучше :))) если доберусь до модуля os - безусловно озвучу версию что *nix вариант представляет куда больше возможностей ;)
Ещё если к строке добавить префикс , то получим так называемые raw строки:

>>> s = r"Это достаточно длинная строка содержащая\n\
несколько строк текста."

>>> print s
Это достаточно длинная строка содержащая\n\
несколько строк текста.

Таким образом обратный слэш и символ перевода строки так же выводятся.
спасибо :)
я это просто отложил на попозже...
НЛО прилетело и опубликовало эту надпись здесь
Предлагаю на суд общества особую, однопроходную реализацию.

Также отмечу, что для задания кодировки более чем достаточно просто написать # coding: utf8 (или koi8-r, или cp1251, или cp866), не занимаясь лишним украшательством звёздочками и черточками.
По совету cleg-а провёл замер скорости выполнения с помощью этого кусочка кривого кода. Мерялось на Celeron 2.53GHz. Результат: One pass takes 0.000043 sec.
У меня вопрос:

"""
Файл test.txt содержит строку Привет в Win1251
"""
f = open('test.txt', 'r')
s = f.readline()
f.close
print s.encode('utf-8');

а получаем ошибку:
Traceback (most recent call last):
File " ", line 74, in run_nodebug
File "E:\Python24\Work\Plurk\test.py", line 7, in
print unicode(s, 'utf-8');
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

А вообще мне нужно получить строку типа '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82' для urllib2.
Как получить такую перекодировку?
.encode() работает только для Unicode строк
А после s = f.readline() у меня строка не Unicode уже?
А если нет, то как её сделать Unicode, что бы потом в UTF-8 перевести?
на самом деле мне нужно получить: "\u041f\u0440\u0438\u0432\u0435\u0442" из строки. Что это вобще за кодировка и как её в Python получить?
s = raw_input()
dln = s.split()
dln.sort()
print dln
print dln[-1]
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории