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 :1()
        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)

Comments

comments


Bookmark and Share