#python
Правые методы в Python
Еще одна особенность классов в Python-правые магические методы. Они начинаются префикса r, например: radd, rsub
Эти методы вызываются для правого операнда, когда метод левого операнда не переопределен.
Если мы просуммируем a + b, то Python попытается сделать a.add(b), если метод add не переопределен, то вызовется метод b.radd(a), если radd не переопределен, то выбросится ошибка.
Правые методы в Python
Еще одна особенность классов в Python-правые магические методы. Они начинаются префикса r, например: radd, rsub
Эти методы вызываются для правого операнда, когда метод левого операнда не переопределен.
Если мы просуммируем a + b, то Python попытается сделать a.add(b), если метод add не переопределен, то вызовется метод b.radd(a), если radd не переопределен, то выбросится ошибка.
#python
Почему в Python нет операторов ++ и -- ?
Если вы действительно хотите знать причину, то придется читать древние, как документации COBOL, форумы Python разработчиков.
Как пишут благородные питонисты: "Простые инкременты и декременты не так нужны, как в других языках. Вы не очень часто пишете такие вещи, как for(int i = 0; i < 10; ++i) в Python; вместо этого вы делаете такие вещи, как for i in range(0, 10) ". То есть нет необходимости прописывать итерацию в циклах.
Есть ли такая необходимость добавить унарные операторы инкрементации и декрементации? Помните, что это целых четыре оператора (два инкремента и два декремента), каждый из которых должен иметь собственную перегрузку класса, которая тормозит VM.
Эти операторы просто избыточны и ненужны в пайтон, когда можно использовать += и -=.
Keep it simple.
Почему в Python нет операторов ++ и -- ?
Если вы действительно хотите знать причину, то придется читать древние, как документации COBOL, форумы Python разработчиков.
Как пишут благородные питонисты: "Простые инкременты и декременты не так нужны, как в других языках. Вы не очень часто пишете такие вещи, как for(int i = 0; i < 10; ++i) в Python; вместо этого вы делаете такие вещи, как for i in range(0, 10) ". То есть нет необходимости прописывать итерацию в циклах.
Есть ли такая необходимость добавить унарные операторы инкрементации и декрементации? Помните, что это целых четыре оператора (два инкремента и два декремента), каждый из которых должен иметь собственную перегрузку класса, которая тормозит VM.
Эти операторы просто избыточны и ненужны в пайтон, когда можно использовать += и -=.
Keep it simple.
#python
Что лучше, import или from import?
Обратимся к первоисточникам, а именно-к PEP8. Когда импортируете класс из модуля, будет нормально сделать это так:
from myclass import MyClass
from foo.bar.yourclass import YourClass
Если это вызывает локальный конфликт Имен, то можно сделать это явно:
import myclass
import foo.bar.yourclass
Для того, чтобы понять, как надо импортировать каждую библиотеку нужно читать документацию к каждому модулю, ведь автор сам решает, какой import нужно использовать.
Flask импортируется:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!
Pytest импортируется:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
При написании тестов порой надо подменить какие-то методы. Вот тут с импортами из модуля начинается цирк. К моменту, когда накладывается патч, ссылка на объект уже имеется в тех местах, где он импортирован, и патчить нужно не место, где объект объявлен, а все места, где был сделан импорт. Несложно, но немного запарно, и есть шанс что-то поломать при рефакторинге.
Этот момент – достаточно частый источник недоумения.
Что лучше, import или from import?
Обратимся к первоисточникам, а именно-к PEP8. Когда импортируете класс из модуля, будет нормально сделать это так:
from myclass import MyClass
from foo.bar.yourclass import YourClass
Если это вызывает локальный конфликт Имен, то можно сделать это явно:
import myclass
import foo.bar.yourclass
Для того, чтобы понять, как надо импортировать каждую библиотеку нужно читать документацию к каждому модулю, ведь автор сам решает, какой import нужно использовать.
Flask импортируется:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!
Pytest импортируется:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
При написании тестов порой надо подменить какие-то методы. Вот тут с импортами из модуля начинается цирк. К моменту, когда накладывается патч, ссылка на объект уже имеется в тех местах, где он импортирован, и патчить нужно не место, где объект объявлен, а все места, где был сделан импорт. Несложно, но немного запарно, и есть шанс что-то поломать при рефакторинге.
Этот момент – достаточно частый источник недоумения.
#python
Immutable vs Mutable Data Types in Python
Mutable sequences can be changed after creation. Some of Python’s mutable data types are: lists, byte arrays, sets, and dictionaries.
Immutable data types differ from their mutable counterparts in that they can not be changed after creation. Some immutable types include numeric data types, strings, bytes, frozen sets, and tuples.
Immutable vs Mutable Data Types in Python
Mutable sequences can be changed after creation. Some of Python’s mutable data types are: lists, byte arrays, sets, and dictionaries.
Immutable data types differ from their mutable counterparts in that they can not be changed after creation. Some immutable types include numeric data types, strings, bytes, frozen sets, and tuples.
#python
6 хитростей Python, о которых никто не рассказывает новичкам
1. Выбор случайного элемента из последовательности элементов
2. Распаковка элементов с помощью *
3. Использование set для оптимизации различных операций
4. Просмотр атрибутов и методов класса в интерпретаторе Python
5. Операции со срезами
6. Вызов отладчика 10-символьной командой
Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().
6 хитростей Python, о которых никто не рассказывает новичкам
1. Выбор случайного элемента из последовательности элементов
import random as r
my_list = [1, 2, 3, "go"]
print(r.choice(my_list))
2. Распаковка элементов с помощью *
my_list = [1, 2, 3, 5, 7]
print(*my_list) # 1 2 3 5 7
3. Использование set для оптимизации различных операций
def eliminate_duplicates(lst):
"""
Возвращает отсортированный список, не содержащий дубликатов
"""
new_list = list(set(lst))
new_list.sort()
return new_list
list1 = [25, 12, 11, 4, 12, 12, 25]
print(eliminate_duplicates(list1))
4. Просмотр атрибутов и методов класса в интерпретаторе Python
string = "A string"
print(dir(string))
5. Операции со срезами
lst = ["Fun", "is", "Programming"]
lst = lst[::-1]
print(lst) # ['Programming', 'is', 'Fun']
# Инвертирование строки
string = "Dog running on the park"
string = string[::-1]
print(string) # krap eht no gninnur goD
6. Вызов отладчика 10-символьной командой
Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().
n_odds = 0
for i in range(1, 14, 2):
# Проверка значения i в каждой итерации
breakpoint()
# Если это условие выполняется - значит, нас что-то не устраивает
if i % 2 == 0:
n_odds += 1
print(n_odds)