Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python impergections

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Python impergections

Avatar for Cyril Lashkevich

Cyril Lashkevich

March 13, 2014
Tweet

More Decks by Cyril Lashkevich

Other Decks in Programming

Transcript

  1. Разминка def empty(_): return None
 def add(d, k, v):
 def

    new_dict(x):
 if x == k:
 return v
 else:
 return d(x)
 return new_dict
 def add_f(d, k, v):
 return lambda x: v if k == x else d(x)
  2. >> d = add(empty, 1, "abc") >> d = add_f(d,

    2, "def") >> d(1) 'abc' >> d(2) 'def' >> d(0) >> Разминка def empty(_): return None
 def add(d, k, v):
 def new_dict(x):
 if x == k:
 return v
 else:
 return d(x)
 return new_dict
 def add_f(d, k, v):
 return lambda x: v if k == x else d(x)
  3. Захват переменных в замыкания def Counter(x): a = x def

    zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc)
  4. Захват переменных в замыкания def Counter(x): a = x def

    zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc) >> zero, val, inc = Counter(5) >> zero() >> val() 5 >> inc()
  5. Захват переменных в замыкания def Counter(x): a = x def

    zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc) >> zero, val, inc = Counter(5) >> zero() >> val() 5 >> inc() UnboundLocalError:
 local variable 'a'
 referenced before
 assignment
  6. def Counter(x): a = x def zero(): nonlocal a =

    0 def val(): return a def inc(): nonlocal a a += 1 return a return (zero, val, inc) def Counter(x): a = [x] def zero(): a[0] = 0 def val(): return a[0] def inc(): a[0] += 1 return a[0] return (zero, val, inc) 3.x 2.x
  7. Генераторы и yield Возможность удобно использовать генераторы в генераторах появилась

    только в 3.3, PEP 380 yield form Даже с этим генераторы слабее более общей концепции coroutines yield не функция, а синтаксический элемент привязанный к контексту, не first-class citizen
  8. def accumulate():
 res = 0
 while 1:
 n = yield


    if n is None:
 return res
 res += n
 def gather_sums(sums):
 while 1:
 s = yield from accumulate()
 sums.append(s)
  9. def accumulate():
 res = 0
 while 1:
 n = yield


    if n is None:
 return res
 res += n
 def gather_sums(sums):
 while 1:
 s = yield from accumulate()
 sums.append(s) >> sums = [] >> acc = gather_sums(sums) >> next(acc) >> for i in range(4): .. acc.send(i) .. >> acc.send(None) >> for i in range(5): .. acc.send(i) .. >> acc.send(None) >> sums [6, 10]
  10. def inorder(t):
 if t:
 for x in inorder(t.left):
 yield x


    yield t.label
 for x in inorder(t.right):
 yield x
 def inorder_33(t):
 if t:
 yield from inorder(t.left)
 yield t.label
 yield from inorder(t.right)
  11. function inorder(f, t)
 if t then
 inorder(f, t.left)
 f(t.label)
 return

    inorder(f, t.right)
 end
 end
 for label in coroutine.wrap(inorder),
 coroutine.yield, t do
 -- something with label
 end
 inorder(print, t)
  12. Bytecode PyObject * PyEval_EvalFrameEx(PyFrameObject *f,
 int throwflag) { // ~2200

    lines } ~110 инструкции байткода (39 в Lua) void luaV_execute (lua_State *L) { // 320 lines }
  13. API Объемный и сложный в использовании 818 функции (3.3) vs

    123 + 66 aux в Lua Не все гладко с Py_Initialize/Py_Finalize
  14. GIL Глобальный для процесса семафор/ conditional variable Не дает нескольким

    потокам выполнятся одновременно… …почти
  15. Программа на С создает потоки, в каждом из которых свой

    экземпляр интерпретатора? GIL глобальный для процесса