Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
​​#python
Правые методы в 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
Что лучше, 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.
#python

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)