python-hui

Так получилось, что моё стремительное вступление в кровавый энтерпрайз и ряды IT началось с Java. Но родина и конъюнктура рынка требовали освоить python, чем с успехом сейчас и занимаюсь. Подскажу пару вещей, которые после java и этих ваших ООП кажутся чуждыми, но обязательными в использовании:

 

  1. Изящная конструкция для защиты от None.

В этих ваших питонах None – аналог null. Но не стоит сразу впадать в панику и судорожно пытать кинуть NonePointerException. С помощью такой вот конструкции легко забить болт на то, что в метод передали None.

  1. A = None
  2. print(A or [])
  3. A = []
  4. print(A or [10])

Если в print передадут None, ему будет присвоено значение пустого листа. А во втором случае, если будет передан либо None, либо пустой лист, то присвоится значение листа с одним элементом, равным 10.

 

  1. Укороченное присвоение значения переменной в зависимости от условия.

Вот такую громоздкую конструкцию:

  1. def getValue(condition):
  2. if condition:
  3. return A
  4. else:
  5. return B

можно заменить вот на такую няшность:

  1. def getValue(condition):
  2. return A if condition else B

If после переменной, согласитесь, не привычно.

 

  1. Функция – это объект.

Поэтому функцию можно передать в функцию, и, передав в неё переменные, вызвать функцию из функции.

  1. def calculate(a, b, function):
  2. return function(a, b)
  3.  
  4.  
  5. def summ(a, b):
  6. return a + b
  7.  
  8.  
  9. def subtraction(a, b):
  10. return a - b
  11.  
  12.  
  13. print(calculate(10, 20, summ))
  14. print(calculate(10, 20, subtraction))

 

  1. Класс – это тоже объект.

Поэтому можно передать объект класса в функцию и заставить его конструировать объекты в зависимости от переданного класса. Обратите внимание, никакой гомоебли с наследованием и instanceOf. Если у класса есть метод с такой сигнатурой, не сомневайтесь, он будет вызван, в противном случае вы будете жестоко унижены во время выполнения вашего кода.

  1. class A:
  2. def value(self):
  3. return 'class A'
  4.  
  5.  
  6. class B:
  7. def value(self):
  8. return 'class B'
  9.  
  10.  
  11. def print_value(clazz):
  12. print(clazz().value())
  13.  
  14. print_value(A)
  15. print_value(B)

 

  1. Отсроченная инициализация.

Раз функция – это объект, то любой переменной можно присвоить значение объекта функции и вызвать её, используя (). Анонимные функции в этом случае не исключение. Матёрые девелоперы моей команды сказали, что так делать зашквар, но однажды у меня появилась острая необходимость положить в словарь переменные, которые каждый раз при обращении к ним пересчитывались, и лямбда помогла добиться их пересчёта так же и при обращении к словарю.

  1. A = 10
  2. B = lambda: A
  3. C = A
  4. print('%s:%s' % (B(), C))
  5. A = 20
  6. print('%s:%s' % (B(), C))
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс