Нередко метод get используется для проверки, существует ли ключ в словаре.
Вот пример:
quantities = {"pink": 3, "green": 4}
color = "blue"
if not quantities.get(color):
print(f"Uh oh! There's no value for {color}")
# -> Uh oh! There's no value for blue
Метод get вернёт None, если заданный ключ отсутствует в словаре. Но на деле мы проверяем, является ли возвращаемое значение ложным. Это будет работать до тех пор, пока значения в нашем словаре не будут ложными (например, нулём или пустой строкой). Если же что-то изменится...
quantities = {"pink": 3, "green": 4, "blue": 0}
color = "blue"
if not quantities.get(color):
print(f"Uh oh! There's no value for {color}")
# -> Uh oh! There's no value for blue
Как видите, результат может быть не совсем ожидаемым.
color = "blue"
if color not in quantities:
print(f"Uh oh! There's no value for {color}")
#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39❤2👏2🥱2😢1
🐍🧑💻 Используй флаг --last-failed с Pytest, чтобы запускать только те тесты, которые не прошли в последнем запуске.
Полезно для быстрой итерации при попытке исправить ошибку.
#советы
Полезно для быстрой итерации при попытке исправить ошибку.
#советы
👍23❤4
В Python if-операторы не используют скобки (в отличие от JavaScript, например). Правильный синтаксис:
if language == "Python":
print("Hello, world!")
Однако иногда скобки всё же используются.
if (
condition1
and condition2
and condition3
):
# действия
Главный совет простой — используйте скобки только там, где это может повысить читаемость.
#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤3❤🔥2🥱2
Если вы возьмёте две переменные, которые будут указывать на одно и то же число, а затем измените одну из них, то вторая не изменится
a = b = 100
a += 50
print(b) # -> 100
Если вы возьмёте две переменные, которые будут указывать на один и тот же список, а затем измените одну из них, то вторая... изменится тоже
a = b = []
a += [1, 2]
print(b) # -> [1, 2]
Но и это работает не всегда
a = b = []
a = a + [1, 2]
print(b) # -> []
📝 Переменные в Python — это не контейнеры, которые «хранят» объект, а ссылки на объекты в памяти. Несколько переменных могут указывать на один и тот же объект, поэтому иногда изменения одной переменной могут отразиться на другой. Если это вас запутало, не переживайте — просто требуется немного привыкнуть к особенностям Python.
#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19😁11😢6❤1
🔢 Когда использовать enum.StrEnum?
Класс StrEnum появился в Python 3.11 и позволяет элементам перечисления вести себя как строки. Он идеально подходит для задач, где требуется строковое представление, например, для конфигураций, работы с JSON-данными или API.
Преимущества:
🔹Чётко видно, какие значения разрешены.
🔹Исключаются ошибки из-за опечаток в строках.
🔹Прямо работает с JSON и другими форматами.
#советы
Класс StrEnum появился в Python 3.11 и позволяет элементам перечисления вести себя как строки. Он идеально подходит для задач, где требуется строковое представление, например, для конфигураций, работы с JSON-данными или API.
Преимущества:
🔹Чётко видно, какие значения разрешены.
🔹Исключаются ошибки из-за опечаток в строках.
🔹Прямо работает с JSON и другими форматами.
#советы
❤12🔥4👍3
А вы знаете, что этот
count = {}
for item in things:
if item not in count:
count[item] = 0
count[item] += 1
from collections import Counter
count = Counter(things)
Counter автоматически подсчитывает количество каждого элемента в things.
#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍4😁3
dir()
и vars()
— для чего они нужны?Когда вы работаете в Python REPL или отлаживаете код, иногда полезно быстро взглянуть на объект, с которым вы не до конца знакомы. В такие моменты на помощь приходят две удобные функции:
dir()
и vars()
.dir()
— возвращает список всех атрибутов объекта, включая методы и атрибуты класса. vars()
— возвращает словарь атрибутов, которые живут непосредственно в объекте. Методы и атрибуты класса в этом списке отсутствуют.from dataclasses import dataclass
@dataclass
class Rectangle:
width: float
height: float
@property
def area(self):
return self.width * self.height
Мы создаём объект прямоугольника:
rect = Rectangle(3, 4)
Вот что нам покажет
dir()
:['__annotations__', '__class__', '__dataclass_fields__', '__dataclass_params__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__match_args__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__replace__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'area', 'height', 'width']
А вот что покажет
var()
:{'width': 3, 'height': 4}
#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍38🔥2
sorted()
, а когда .sort()
Используйте
.sort()
, если:Выбирайте
sorted()
, если:#советы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33❤3
🐍✍️ Совет: всегда указывайте кодировку при сохранении файлов
Если ваш код может запускаться на разных операционных системах (например, Windows и Linux), всегда указывайте кодировку для файлов, которые вы читаете или записываете.
❓Почему это важно?
На Windows Python по умолчанию использует кодировку Windows-1252 (cp1252), тогда как на других системах, таких как Linux и macOS, используется UTF-8. Если в данных окажутся символы вне ASCII (например, ✨), несоответствие кодировок может привести к ошибкам чтения или записи.
✅ Для предотвращения таких проблем всегда указывайте кодировку явно. Наилучший выбор —
#советы
Если ваш код может запускаться на разных операционных системах (например, Windows и Linux), всегда указывайте кодировку для файлов, которые вы читаете или записываете.
❓Почему это важно?
На Windows Python по умолчанию использует кодировку Windows-1252 (cp1252), тогда как на других системах, таких как Linux и macOS, используется UTF-8. Если в данных окажутся символы вне ASCII (например, ✨), несоответствие кодировок может привести к ошибкам чтения или записи.
✅ Для предотвращения таких проблем всегда указывайте кодировку явно. Наилучший выбор —
encoding="utf-8"
.#советы
👍31🎉4❤2
✨ Некоторые способы использовать * и ** в Python
Эти символы могут служить в языке не только как арифметические. Вот примеры:
▪️* для распаковки итерируемых объектов в позиционные аргументы при вызове функций (см. картинку👆)
▪️** для распаковки словарей в именованные аргументы при вызове функций:
▪️* в определении функций для захвата позиционных аргументов:
▪️** в определении функций для захвата именованных аргументов:
#советы
Эти символы могут служить в языке не только как арифметические. Вот примеры:
▪️* для распаковки итерируемых объектов в позиционные аргументы при вызове функций (см. картинку👆)
▪️** для распаковки словарей в именованные аргументы при вызове функций:
date_info = {'year': "2020", 'month': "01", 'day': "01"}
track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'}
filename = "{year}-{month}-{day}-{artist}-{title}.txt".format(
**date_info,
**track_info,
)
print(filename)
# - > '2020-01-01-Beethoven-Symphony No 5.txt'
▪️* в определении функций для захвата позиционных аргументов:
from random import randint
def roll(*dice):
return sum(randint(1, die) for die in dice)
▪️** в определении функций для захвата именованных аргументов:
def tag(tag_name, **attributes):
attribute_list = [
f'{name}="{value}"'
for name, value in attributes.items()
]
return f"<{tag_name} {' '.join(attribute_list)}>"
#советы
👍23🎉5❤1🥱1