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

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

Начинал читать ещё оригинал, но и с переводом тоже самое, после первых двух примеров интерес пропадает.

Да уж. Как-то ждешь больше жести от такой статьи, а там про то что можно букву не латинскую вставить.

Пример с:
a=[1, 2, 3]
b=a
b[1]=0
a
[1,0,3]

Меня в свое время очень удивил.

Чем? Всё ссылка — один из первых уроков Пайтона.

Именно так — про микс табуляций с пробелами — уже даже не смешно :(

И вроде в Python 3 не актуально — не даст запуститься.

Ещё менее смешно про вставку кириллического символа.
Что за дерьмо, Mail.Ru?
Специально докрутил эту монструозную стену текста до комментов, чтобы увидеть там этот, и не прогадал.
Сделал то же самое после первого примера.
Написали, что код должен выполняться на всех версиях, если иное не указано. Ок.

Выполнения первого примера в интерпритаторе
~$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> value = 11
>>> value = 32
>>> value
32
>>> # Ок, скопируем, как сказано в примере.
... 
>>> value = 11
>>> valuе = 32
  File "<stdin>", line 1
    valuе = 32
        ^
SyntaxError: invalid syntax
>>> exit()

Так ведь там указано, что конкретно этот пример — только для третьего.

В объяснении? Я до него не дошел. В надежде на освещение действительно интересных нюансов и маленький челендж, мне было интересно проверить пример и подумать над результатом, а не читать почему так произошло. Но меня сразу постигло разочарование.

P.S. Если честно, я надеялся увидеть статью из разряда «ЯП: фрактал ...», но не сложилось (про нелюбимые мною PHP и JS написали, а про обожаемый питон нет).
Дальше более полезные примеры
Полезные в чём? Если кодить «методом тыка», то получишь непредсказуемый результат? Так это «капитанство».

Кмк, кто удосужился хотя бы пробежаться по принципам ЯП, не словит такие ситуации, а словит, просто поправит опечатки в коде.
Я думал хабр сума сошёл. Кто меня на хабре упоминать будет, а оказывается у меня тут такой же ник как на гитхабе.
Про клаузу и генератор, где несовпадение времени обработки — это ужас. Во-первых что такое «клауза»? Во-вторых объяснение поведения описано просто ужасно, in срабатывает, что??

Насколько я понял, имеется ввиду, что «in array вызовет iter(array) и сохранит итератор ещё при создании генератора, а условия будут проверяться только во время собственно итерации, которая ленивая».

«Клауза» получилась из clause, в русском это обычно замыканием называют.

Замыкание — closure. А clause в данном случае — конструкция.

Ваша правда, глупость выдал с переводом. Посылаю голову пеплом.

Только сначала установите npm-пакет wtfpython

Чтобы проверить примеры на python? <собака-подозревака>
непонимаю а в чем WTF (ну кроме парочки случаев)?
все так и задуманно.
странно удивлятся например что list — ссылочный тип и т.д.
Вы все примеры можете вычислить в уме и получить ровно тот же результат, что и интерпретатор Python?
Практически. Все эти штучки отлавливаются в первые полгода знакомства с языком. Дальше все логично.
То есть вообще не то же самое что с JS, где про сравнения я вот прям ну никак не скажу что же там получится в итоге, и в больших сомнениях что у меня есть ресурсы это держать в памяти.

Большинство примеров этого списка упираются в первое правило Питона — все есть ссылка.
Проверяется легко id(var) и type(var)

почти все. о некоторых не задумывался.

со слешами меня просто расмешило.
а исключения через запятую… а почему не попробовали скажем три? удивились бы ошибке компиляции?
Что-то не удается воспроизвести пример из «a и b ссылаются на один объект при инициализации с одинаковым значением в одной строке»:

a, b = 257, 257
print('a id=', id(a), 'b id=', id(b))

a = 257
b = 257
print('a id=', id(a), 'b id=', id(b))


Результат, все переменные ссылаются на один объект:

a id= 140091158834992 b id= 140091158834992
a id= 140091158834992 b id= 140091158834992


Версия Python 3.5.3

В этом примере всё зависит от версии Python: PyPy, PyPy3 и CPython начиная с какой‐то из третьих версий (но точно больше 3.4.5: у меня именно она и a is not b в данном случае) применяют какую‐то оптимизацию, из‐за чего a is b в вашем случае, тогда как другие версии её не применяют. В общем, просто учитывайте, что 257 is 257 не гарантируется.

Только в интерпретаторе.

Надо в интерпретаторе запускать. Там код построчно выполняется и оптимизируется, соответственно, только одна строчка за раз. Если в виде .py файла запускать, то оптимизирован будет весь файл и тогда уже все 4 переменные будут указывать в одно место.

ммм… Спасибо, не знал.
а там куча нюансов.
у меня в 3.5 работает а в 3.6 — нет.
Как скучно я живу.
Да уж. Примеры из разряда второй день пишу на Python. Вы бы еще привели пример изменения значения по умолчанию параметра функции

>>> def foo(z=[]):
...  print(z)
...  z.append(1)
... 
>>> foo()
[]
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]


Он там был
оу, воу — не заметил. сори
это же классика :)
Метки: python wtf никто не читает теги
камон, ну конечно же мы читаем теги ^_^
Такое ощущение, что все начали писать на питоне сразу без ошибок. «Ой-ой, как можно не знать таких вещей.» Все же ошибались и когда-то чего-то не знали.

Ещё из неочевидного:


>>> text = ''
>>> if text.split():
...     print 'text contains whitespace'
>>> if text.split(','):
...     print 'text contains comma'
text contains comma
>>> text.split()
[]
>>> text.split(',')
['']

В документации python2/3 написано что если от пустой строки сделать split с разделителем None то вернется пустой массив.
Если использовать разделитель отличный от None тогда вернется массив с одним элементом — ''.


https://docs.python.org/2/library/string.html#string.split
https://docs.python.org/3/library/stdtypes.html#str.split

Тут скорее неочевидным является само существование формы вызова split() без параметра.

Wtf будет жесткий если случайно в арифметике опечататься. Это не будет синтаксической ошибкой.

>>> i = 1
>>> ++++++i++++++++i++++++i+++i
4
>>> i--i
2
>>> i--i--i
3
>>> i-i
0


А меня в свое позабавил такой пример (строчка которая никогда не выполниться влияет на результат):
var1='text1'
def f1():
     #if False:  var1='' # Попробуй раскомментировать эту строчку
     print var1
f1 ()
занятно…
вот тут не поспоришь вполне себе WTF
Я бы не сказал, что это WTF, а особенность реализация замыкания в CPython.
Без if var1 — это просто глобальная переменная. Но если есть if, то даже несмотря на то, что ветвь никогда не выполнится, CPython нужно понять var1 — это локальная переменная или всё же глобальная. И нужно это понять ещё до выполнения функции.
на мой взгляд тут такое имеет место быть:
пока не выполнилось var1='', локальная переменная не создана.
some_dict # An indexed dict is created.
{0: 'w', 1: 'f', 2: 'f'}

вот тут опечатка. я уж полез проверять, неужели действительно буква t пропадает
Зарегистрируйтесь на Хабре, чтобы оставить комментарий