Так случилось что в книге, которую сейчас читаю, примеры на питоне. Надо сказать что красота и лаконичность подкупили меня на более пристальный взгляд внутрь, и тут я покажу те штуки которые мне уж очень понравились после долгой работы с 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)