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>

Comments

comments


Bookmark and Share