• ↓
  • ↑
  • ⇑
 
Записи с темой: root@глупыйпингвин:~# (список заголовков)
16:39 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
сидит ворона-эфшарп на дереве и молчит. а рядом ворона-лисп. и говорит ей: caar! она молчит. caar! она молчит. слышь, чего ты молчишь? она: речевой аппарат не позволяет мне произнести List.head >> List.head;;

@темы: root@глупыйпингвин:~#

12:14 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Рассмотрим следующий код на языке hy:

читать дальше

@темы: root@глупыйпингвин:~#

20:16 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Столкнулся по работе с матлабом. Испытал маленький культурный шок. Репл есть. Но функции в репле определять нельзя, надо определять в отдельных m-файлах. При этом: импортировать эти m-файлы никак не надо, они сами сабой имплицитно импортируются, если ты запустил репл в нужном каталоге. Зачем.

@темы: root@глупыйпингвин:~#

02:54 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Весёлый язык Nim тоже так умеет:

type JumpBuffer {.importc: "jmp_buf", header: "<setjmp.h>".} = object

proc setJump(env: JumpBuffer): cint
   {.importc: "setjmp", header: "<setjmp.h>".}

proc longJump(env: JumpBuffer, value: cint)
   {.importc: "longjmp", header: "<setjmp.h>".}

var
   buf: JumpBuffer
   a: cint = 0
   b: cint = 1

echo setJump(buf)
b = a+b
a = b-a
if a < 500: longJump(buf, a)
echo "done"


@темы: root@глупыйпингвин:~#

00:25 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Этот пост посвящается тем, кому ну прямо очень не хватает goto в пайтоне. Конечно, это Cython, а не пайтон, и лонгджамп, а не goto, но а чего вы, собственно, хотели.

# писать программу на фортране можно на любом языке
from libc.setjmp cimport jmp_buf, longjmp, setjmp

cdef jmp_buf buf
a, b = 0, 1
print setjmp(buf)
a, b = b, a+b
if a < 500: longjmp(buf, a)
print "done"


@темы: root@глупыйпингвин:~#

03:00 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Энтомолог с булавкой совершенно буквально занимается тем, что фиксит баги.

* * *


Вот когда читаешь код один и видишь там что-то типа cut.cut[cut.cut.length-1], то печалишься, а когда с кем-то, то смеёшься.

@темы: root@глупыйпингвин:~#

00:32 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
— Обскачи весь белый свет, никого стандартней нет нашего Фортрана!

brv:  do
      браво, браво
      ну что вы, право



— Проживи две тыщи лет, никого быстрее нет нашего Фортрана!

      cycle brv


@темы: root@глупыйпингвин:~#

05:45 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Как я понимаю ситуацию с кривыми в SVG и в инкскейпе.

Path в SVG — это набор команд с параметрами. Команда может ничего не рисовать, а только двигать рисовалку. Например, «сдвинь рисовалку в место с такими-то координатами» (M) и «сдвинь рисовалку на столько-то по горизонтали и на столько-то по горизонтали» (m). А может нарисовать линию. Например, горизонтальную до такой-то икс-координаты (команда H) или вертикальную на такое-то расстояние (h). А ещё есть вертикальные (V и v), произвольные прямые (L и l), кривые Безье квадратичные (Q, q, T, t) и кубические (C, c, S, s) и кусок эллипса (A, a). И команда Z, которая рисует прямую до того места, с которого наш путь начинался. И команда z, которая делает ровно то же самое.

Так вот, path в Inkscape вообще на это вот всё не похож. читать дальше

@темы: root@глупыйпингвин:~#

13:58 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Вот ещё немного «недостижимого» на первый взгляд кода, который в общем случае нельзя просто взять и удалить, потому что поведение программы от этого изменится:

def f():
   if False:
      a = 0
   return a



При попытке запустить эту функцию мы увидим UnboundLocalError. А вот если бы мы сначала убрали ветку if, то получили бы NameError. Или вот более злой пример (разумеется, кто там пишет, тот сам виноват):

def f():
   if False:
      global a
   a = 0



Без этой ветки в байткоде было бы STORE_FAST, а так будет STORE_GLOBAL, всё равно как если бы мы написали global a безо всяких if-ов.

@темы: root@глупыйпингвин:~#

15:50 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
О магических методах в пайтоне.

Многие наивно думают, что для любых двух объектов a, b выражение a+b есть просто синтактический сахар для a.__add__(b). Это неправда. Другие наивно думают, что это синтактический сахар для a.__class__.__add__(a, b). Это тоже неправда.

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

пример, работать будет и во втором, и в третьем пайтоне

пояснения к примеру

@темы: root@глупыйпингвин:~#

03:07 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Наштовхнувся нещодавно на обговорення коду на кшталт random()+random()+random(). Деякі коментатори гигикали: «один random() комусь недостатньо випадковий, треба більше випадковості».

Невтямки їм було, що сума незалежних випадкових величин розподілена як згортка (англ. convolution) їхніх розподілів. Якщо random() генерує випадкові значення, розподілені рівномірно, то сума декількох таких значень буде розподілена вже зовсім інакше. Справді:

import numpy as np
import matplotlib.pyplot as plt

x1, x2, x3 = [np.random.random(size=500000) for __ in range(3)]
plt.style.use('bmh')

plt.hist(x1, bins=50, normed=True)

зображення

plt.hist(x1+x2, bins=50, normed=True)

зображення

plt.hist(x1+x2+x3, bins=50, normed=True)



зображення

Розподіл суми ен незалежних випадкових величин, кожна з яких має рівномірний розподіл, зветься розподілом Ірвіна-Гола (англ. Irwin-Hall distribution). Чим більше ен, тим сильніше цей розподіл нагадує Ґаусів дзвін. Можливо, саме цього автор коду й хотів досягти (хоча дарма він цього ніяк не відобразив у коментарях або в іменах змінних).

@темы: root@глупыйпингвин:~#, to err is human to arr is pirate, $a_{i,\sigma(i)}$

19:21 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
FizzBuzz на numpy (для Python 3.x; если у вас 2.x, что до сих пор случается, то добавьте в начало from __future__ import print_function):


import numpy as np

fb = np.arange(101, dtype='object')
fb[::3] = 'Fizz'
fb[::5] = 'Buzz'
fb[::15] = 'FizzBuzz'

print(*fb[1:], sep='\n')


@темы: root@глупыйпингвин:~#

12:24 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
>>> import numpy as np
>>> bool(np.array([]))
False
>>> bool(np.array([0]))
False
>>> bool(np.array([1]))
True
>>> bool(np.array([1,2]))
Traceback (most recent call last):
  File "", line 1, in
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Это чертовски неинтуитивно. Кто вообще решил, что это хорошая идея.

@темы: root@глупыйпингвин:~#

02:21 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
x = [1,2,3]
x.extend([i for i in x])

# работает как надо, x теперь равен [1,2,3,1,2,3]

x = [1,2,3]
x.extend(i for i in x)

# не завершается никогда, сжырает всю память

@темы: root@глупыйпингвин:~#

00:47 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
«Всё отчёто подписато,
Улыбато симпатито,
Попрощато,
Поклонито,
Физпрактито ля финита»


На физфаке в Гёттингене продвинутый практикум выглядел так: несколько раз ненадолго приезжаешь в универ лично, ворочаешь там мозгами (и иногда плоскогубцами) в небольших группах, а всё остальное время сидишь дома за компом и что-то печатаешь. На выходе получаешь (через несколько недель после дедлайна) несколько эстетически безупречных пдфок с идеальными формулами-таблицами-графиками и никому не интересными заранее известными результатами, ровно такими же, как у поколений студентов перед тобой.

На факультете информатики в Хагене спецпрактикум выглядит так: несколько раз ненадолго приезжаешь в универ лично, ворочаешь там мозгами в небольших группах, а всё остальное время сидишь дома за компом и что-то печатаешь (и иногда коммитишь). На выходе получаешь (через несколько недель после дедлайна) код недобрый, как помесь миттельшнауцера со штангенциркулем, солидную горку документации, не знавшей руки верстальщика, и несколько зловещее обещание «мы это всё передадим людям, чтобы они пользовались».

* * *


А биофак в эту схему не вписывается. Там ты приходишь, достаёшь из спирта морскую звезду и тычешь её скальпелем в подмышки. Звезда воняет и хрустит. Ты рисуешь на неё дружеские шаржи.

@темы: эх, дубинушка, ухнем, мамонты и кузнечики, root@глупыйпингвин:~#

06:31 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
(делает лицо Боромиром)
Нельзя просто так взять и удалить недостижимый код.

def f():
   return

Это функция. Она вернёт None.

def g():
   return
   yield # эта строчка никогда не будет исполнена

Это тоже функция. Она вернёт пустой генератор.

@темы: root@глупыйпингвин:~#

14:28 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Или вот ещё раздражающие мелочи. Например, модуль json. Он всем хорош, но в 2.7 и 3.4 ведёт себя слегка по-разному. Я не видел, чтобы документация об этом говорила. Может, где-то об этом есть. Но я не видел. Когда именно поведение изменилось — ведает один Миктлантекутли. Рассмотрим бесполезный пример (не делайте так всерьёз):

class Frequency(int):
   def __str__(self):
      return int.__str__(self) + " Hz"

json.dumps(Frequency(42))

Во втором это '42 Hz' (с понятными последствиями при попытке раскодировать обратно). В третьем это '42'.

Кто-то ожидал бы TypeError: <__main__.Frequency object at 0x7f66d0c07ef0> is not JSON serializable, как было бы, если бы Frequency не наследовал от int. Увы ему.

@темы: root@глупыйпингвин:~#

23:09 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Или вот, например, Julia. Там решили пойти своим путём: если у нас есть юникодная строка из четырёх символов, нет никаких гарантий, что они будут пронумерованы именно как «первый, второй, третий, четвёртый». В этом решении есть своя мудрость (символы ведь занимают разное количество байт), но при первой встрече ему сложно не удивиться:

читать дальше

А есть литералы для массивов байтов. Они вдохновлялись пайтоновскими, но сделаны с учётом местного колорита. В третьем пайтоне bytes — отдельный тип, отличающийся и от bytearray, и от array.array, и от numpy.ndarray, исторически родственный строке, но очень этого стесняющийся и от смущения кидающий ошибки, если ему об этом родстве напомнить. В жюлии это просто ещё одна запись для уже существующего типа:

читать дальше

@темы: root@глупыйпингвин:~#

23:36 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Предыдущий пост чрезмерно эмоционален. Второй пайтон был хорош (и продолжает оставаться неплох там, где более нового нет — на JVM, скажем).

Но когда используешь версию шестилетней давности и одновременно с ней новую, и отличаются они в мелочах, и мелочей этих очень много, и исправлению некоторых из них ты в своё время очень обрадовался и счастливо забыл, как оно было раньше — вот тогда не раздражаться сложно.

@темы: root@глупыйпингвин:~#

14:47 

Brötchen mit Käse

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Второй пайтон меня злит. По-хорошему его давно уже пора бы сдать в музей, поставить за стекло и говорить людям «прикиньте, вот на этом тоже когда-то писали». Но жизнь не мармелад и программу приходится тестировать и под ним.

Вот, скажем, обычное третьепайтоновское 'Brötchen mit {}'.format('Käse'), которое возвращает 'Brötchen mit Käse'. Что ему соответствует во втором? А во втором было два типа строк и, соответственно, четыре комбинации, и все делают не совсем то:

u'Brötchen mit {}'.format('Käse') кинет UnicodeDecodeError.
'Brötchen mit {}'.format(u'Käse') кинет UnicodeEncodeError.
'Brötchen mit {}'.format('Käse') вернёт 'Br\xc3\xb6tchen mit K\xc3\xa4se'.
u'Brötchen mit {}'.format(u'Käse') вернёт u'Br\xf6tchen mit K\xe4se'.

(если последние две строки напечатать при помощи print, выглядят они одинаково, Brötchen mit Käse. Это чтобы люди легче путались. Вести себя они, однако, будут по-разному)

Оператор % ведёт себя в этом плане похоже на .format, но всё же чуть иначе: 'Brötchen mit %s' % u'Käse' кинет не UnicodeEncodeError, но UnicodeDecodeError.

Всё это я заметил благодаря Флориану, который держит рабочие файлы в каталоге по имени Arbeitsfläche.

@темы: root@глупыйпингвин:~#

Эх, разум, да ещё разум

главная