PHP и Python. Взгляд со стороны PHP
Так случилось что в книге, которую сейчас читаю, примеры на питоне. Надо сказать что красота и лаконичность подкупили меня на более пристальный взгляд внутрь, и тут я покажу те штуки которые мне уж очень понравились после долгой работы с php. Некоторые штуки на php вообще нельзя сделать, некоторые можно но "с бубном", а какие-то просто лаконичнее смотрятся.
# инициализация переменных a, b = 3, 4 print(a + b) >7
# последовательные вызовы open("out.txt", 'w').writelines(i.lower() for i in open("input.txt", 'r'))
# lambda функции from math import sqrt a = lambda x, y : sqrt(x**2 + y**2) print a(2, 2) > 2.82842712475
# собственные операции над экземплярами классов, в данном случае сравнение class MyString: def __init__(self, str): self.str = str def __cmp__(self, str): return cmp(len(self.str), len(str.str)) print(MyString("a") > MyString("abc")) > False
# множественное наследование class A: def a(self): return "a" class B: def b(self): return "b" class C(A,B): def c(self): return self.a() + self.b() test = C() print test.c() > ab
# классы-итераторы from random import random class RandomArray: def __init__(self, len): self.lst = [random() for i in range(len + 1)] self.current = 0 def __iter__(self): return self def next(self): self.current += 1 if len(self.lst) > self.current: return self.lst[self.current] else: raise StopIteration for i in RandomArray(3): print i > 0.756338496947 > 0.0337045293883 > 0.50394288767
# синтаксис привычного in_array() arr = [1, 2, 3] print(1 in arr) print(4 in arr) > True > False
# метаклассы, своего рода ООП-пластелин # надо сказать что весь код на Python напоминает мне пластелин def classFactory(func): class X(object): pass setattr(X, func.__name__, func) return X def my_method(self): print "I am here" MyClass = classFactory(my_method) my_object = MyClass() my_object.my_method() > I am here
# операции с массивами arr = [1, 2, 3, 4, 5] print(arr[:2]) print(arr[2:]) print(arr[:-2]) print(arr[-2:]) print(arr[::2]) > [1, 2] > [3, 4, 5] > [1, 2, 3] > [4, 5] > [1, 3, 5]
# аналогичные операции со строками str = "abcdefg" print(str[2:]) str = "abcdefg" print(str[:1]) > cdefg > a
# работа с потоками import threading from time import sleep def proc(n): print "Process", n for i in xrange(3): sleep(float(n)) print n + " : " + str(i) p1 = threading.Thread(target=proc, name="t1", args=["1"]) p2 = threading.Thread(target=proc, name="t2", args=["2"]) p1.start() p2.start() > Process 1 > Process 2 > 1 : 0 > 2 : 0 > 1 : 1 > 1 : 2 > 2 : 1 > 2 : 2
# системные вызовы - запросто from winsound import Beep from random import randrange for i in range(50): Beep(randrange(100, 1000), 100)
# дебагер "из коробки". его красота не столько в функциональности, # столько в том что на питоне это весьма просто реализовывается import pdb def fun(s): lst = [] for i in s: lst.append(ord(i)) return lst pdb.runcall(fun, "ABCDE") > c:\main.py(35)fun() -> lst = [] (Pdb) n > c:\main.py(36)fun() -> for i in s: (Pdb) n > c:\main.py(37)fun() -> lst.append(ord(i)) (Pdb) print i A (Pdb) n
# профайлер из коробки, тоже, как по мне - очень круто import profile from math import sqrt def print_close_matches(): arr = [] for i in range(1000): arr.append(sqrt(i**3)) return arr profile.run(r'print_close_matches()') 2005 function calls in 0.051 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1000 0.001 0.000 0.001 0.000 :0(append) 1 0.000 0.000 0.000 0.000 :0(range) 1 0.045 0.045 0.045 0.045 :0(setprofile) 1000 0.001 0.000 0.001 0.000 :0(sqrt) 1 0.000 0.000 0.006 0.006 <string>:1(<module>) 1 0.003 0.003 0.006 0.006 main.py:7(print_close_matches) 1 0.000 0.000 0.051 0.051 profile:0(print_close_matches()) 0 0.000 0.000 profile:0(profiler) </module></string>
О статье
Вы сейчас читаете статью «PHP и Python. Взгляд со стороны PHP»
- Написанную:
- 09.09.2009
- Категории:
- php
2 Комментариев
Перейти к форме добавления комментария | comments rss[?] | trackback uri [?]