👋 Привет, питонисты! Готовы ли вы повысить уровень своей игры на Python? 💪🐍

Независимо от того, являетесь ли вы опытным разработчиком программного обеспечения или изучаете 🆕 Python, всегда найдется место для некоторых крутых трюков и советов, которые помогут улучшить ваши навыки Pythonic.

Вот почему мы собрали кучу 🤓 умных фрагментов и трюков Python, о которых вы, возможно, не знали. От 🚀 быстрых способов до 🔮 магических лайфхаков — у нас есть несколько удивительных способов работы с Python, которые поразят вас.

Итак, будьте готовы 🤯 быть впечатленными и удивленными, когда мы представим некоторые из самых полезных трюков Python. Давайте погрузимся! 🌊

1. Объединение двух словарей в Python 3.5+

x = {'a': 1, 'b': 2}
y = {'b': 3, 'c': 4}

z = {**x, **y}
print(z)  # {'c': 4, 'a': 1, 'b': 3}

🤝📚 Объединяйте два словаря как профессионал с Python 3.5+! Не нужно писать длинные циклы или запутанный код — просто используйте оператор распаковки (**).

👉 Посмотрите на этот простой пример: у нас есть два словаря x и y, и мы хотим объединить их в один словарь z. Просто используйте {**x, **y} и вуаля!

🔍 Обратите внимание, что в результирующем словаре ключи из второго словаря (y) перезаписывают ключи из первого словаря (x), если они имеют одинаковое имя. Это как королевский звон ключей, где победитель получает все!

Объединение словарей в Python 2.x

x = {'a': 1, 'b': 2}
y = {'b': 3, 'c': 4}

z = dict(x, **y)
print(z)  # {'a': 1, 'c': 4, 'b': 3}

🎓 Если вы все еще застряли на Python 2.x, не волнуйтесь, мы вас тоже обеспечим. Просто используйте dict(x, **y), и вы получите тот же результат. Это похоже на союз словарей, где все ладят и делятся своими ключами.

2. 🔍🚦 Тестирование нескольких флагов в Python

Без проблем! Вот четыре умных способа проверить несколько условий одновременно:

x, y, z = 0, 1, 0

# Check each flag separately
if x == 1 or y == 1 or z == 1:
    print('passed')

# Use the "in" keyword
if 1 in (x, y, z):
    print('passed')

# Test for truthiness (can be risky!)
if x or y or z:
    print('passed')

# Use the "any" built-in function
if any((x, y, z)):
    print('passed')

👀 Держите свой код кратким и чистым, проверяя сразу несколько флагов. Вы можете использовать ключевое слово or, но оно может стать немного длинным.

💡 Вместо этого вы можете использовать ключевое слово in, чтобы проверить, присутствует ли значение в последовательности значений (например, в кортеже).

👉 Или, если вы хотите проверить истинность, вы можете использовать логический оператор or, чтобы проверить, является ли хотя бы один флаг «истинным».

🤖 Для более гибкого и эффективного решения можно использовать встроенную функцию any() с кортежем флагов в качестве аргумента. Он проверяет, является ли хотя бы одно значение в последовательности «истинным».

3. 🔍🔤 Сортировка словаря по значению в Python

Не смотрите дальше! Вот два способа отсортировать словарь по значению и получить новый словарь с ключами, отсортированными в порядке убывания:

xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}

# Using lambda function
sorted_dict = sorted(xs.items(), key=lambda x: x[1])
print(sorted_dict) # [('d', 1), ('c', 2), ('b', 3), ('a', 4)]

# Using operator module
import operator
sorted_dict = sorted(xs.items(), key=operator.itemgetter(1))
print(sorted_dict) # [('d', 1), ('c', 2), ('b', 3), ('a', 4)]

🤔 Не знаете, как сортировать словарь по его значениям, а не по ключам? Без проблем! Просто используйте функцию sorted() с аргументом key и передайте лямбда-функцию или operator.itemgetter(), чтобы указать значение для сортировки.

💡 Лямбда-функция принимает элемент (пару ключ-значение) и возвращает значение. Это используется для сортировки словаря по значению.

🤖 Кроме того, вы можете использовать функцию operator.itemgetter(), чтобы указать индекс для сортировки. В этом случае мы используем 1 для сортировки по значению (поскольку элементы представляют собой (key, value) кортежей).

👉 Оба метода возвращают отсортированный список пар ключ-значение, который можно преобразовать обратно в словарь с помощью конструктора dict().

4. Метод get() в словарях Python и его аргумент «по умолчанию»

👋🏼🐍 Попрощайтесь с KeyError при поиске значений в словаре с помощью метода get() в Python! Вот пример:

name_for_userid = {
    382: "Alice",
    590: "Bob",
    951: "Dilbert",
}

def greeting(userid):
    return "Hi %s!" % name_for_userid.get(userid, "there")

print(greeting(382))    # "Hi Alice!"
print(greeting(333333)) # "Hi there!"

🤖 Метод get() извлекает значение для заданного ключа в словаре. Если ключ не найден, возвращается значение default (которое в данном примере равно "there").

💡 Это полезно, когда вы хотите изящно обрабатывать отсутствующие ключи, не вызывая KeyError. В этом случае мы используем get() для поиска имени пользователя по его идентификационному номеру, и если идентификатор не найден, мы возвращаем стандартное приветствие вместо того, чтобы вызывать ошибку.

👍🏼 Метод get() также можно использовать для предоставления значения по умолчанию None, если аргумент default не указан. Это эквивалентно использованию оператора in для проверки существования ключа, но без необходимости в дополнительном операторе if.

5. 👨‍💻🐍 Хотите быстро и легко определить класс в Python? Попробуйте использовать namedtuples!

🚗💥 Именованные кортежи — отличная альтернатива ручному определению класса. Они короче, проще и столь же эффективны. Вот пример:

from collections import namedtuple

# Define a Car class using a namedtuple
Car = namedtuple('Car', 'color mileage')

# Create an instance of the Car class
my_car = Car('red', 3812.4)

# Access attributes of the Car class
print(my_car.color)    # 'red'
print(my_car.mileage)  # 3812.4

# Get a nice string representation for free
print(my_car)          # Car(color='red', mileage=3812.4)

# Namedtuples are immutable, like tuples
my_car.color = 'blue'  # Raises an AttributeError

📜💡 Именованные кортежи работают так же, как обычные кортежи, но с именованными полями. Вы можете получить доступ к полям по имени или использовать индекс как обычный кортеж.

👍🏼 Именованные кортежи — это отличный способ быстро и легко определить простые классы без лишних затрат на определение полного класса вручную. Кроме того, они легкие и эффективные, поэтому вы можете использовать их везде, где вам нужна простая структура данных.

6. импортировать это

Должен сказать, import this — одно из моих любимых пасхальных яиц в Python. Он печатает «Дзен Python», представляющий собой сборник руководящих принципов написания компьютерных программ на языке Python. Это короткий и приятный набор афоризмов, которые служат напоминанием о том, что делает Python таким прекрасным языком для работы. Если вы еще не видели его раньше, попробуйте, набрав import this в своем Python REPL!

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

7. Использование «json.dumps()» для красивой печати дикторов Python 📄

… (как альтернатива модулю «pprint»)

Стандартное строковое представление для диктов трудно читать 😞:

>>> my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee}
>>> my_mapping
{'b': 42, 'c': 12648430, 'a': 23}

Модуль «json» может работать намного лучше 👍:

>>> import json
>>> print(json.dumps(my_mapping, indent=4, sort_keys=True))
{
    "a": 23,
    "b": 42,
    "c": 12648430
}

Обратите внимание, что это работает только с словарями, содержащими примитивные типы (посмотрите на модуль «pprint») 😇:

>>> json.dumps({all: 'yup'})
TypeError: keys must be a string

В большинстве случаев я бы придерживался встроенного модуля «pprint» 😉.

8. Распаковка аргумента функции

Вы когда-нибудь сталкивались с кортежем или словарем, и вам нужно было передать его значения в качестве аргументов функции? Вы можете получить доступ к каждому значению по одному и передать их по отдельности, но это может стать утомительным и подверженным ошибкам.

К счастью, в Python есть замечательная функция, называемая распаковкой аргументов, которая может помочь в этом. При распаковке аргументов вы можете передавать элементы кортежа как отдельные аргументы или пары ключ-значение словаря в качестве аргументов ключевого слова в функцию.

Давайте посмотрим, как это работает на простом примере. Представьте, что у вас есть функция myfunc(), которая принимает три аргумента: x, y и z.

def myfunc(x, y, z):
    print(x, y, z)

Теперь предположим, что у вас есть кортеж tuple_vec с тремя значениями, которые вы хотите передать в качестве аргументов myfunc(). Вместо того, чтобы передавать сам кортеж и позволять функции обрабатывать его, вы можете использовать оператор *, чтобы распаковать кортеж в его три значения и передать их как отдельные аргументы в myfunc():

tuple_vec = (1, 0, 1)
myfunc(*tuple_vec)
# Output: 1 0 1

Точно так же вы можете распаковать словарь dict_vec в его пары ключ-значение и передать их в качестве аргументов ключевого слова в myfunc() с помощью оператора **:

dict_vec = {'x': 1, 'y': 0, 'z': 1}
myfunc(**dict_vec)
# Output: 1 0 1

Распаковка аргументов — это мощная функция, которая может упростить ваш код и сделать его более читабельным. Так что в следующий раз, когда вы столкнетесь с кортежем или словарем, попробуйте распаковать аргумент! 😎👍

9. Измерьте время выполнения небольших фрагментов кода Python с помощью модуля «timeit».

🕰️ Время имеет решающее значение, особенно когда речь идет о написании эффективного кода на Python. Вот где пригодится модуль «timeit»! С его помощью вы можете измерить время выполнения небольших фрагментов кода и оптимизировать свой код, чтобы он работал быстрее. Вот пример:

Допустим, вы хотите соединить диапазон чисел дефисом. Вы можете использовать цикл for, понимание списка или функцию «карты». Но какой из них быстрее? Давай выясним:

Сначала мы импортируем модуль «timeit»:

import timeit

Затем мы пишем три версии одного и того же кода, используя цикл for, понимание списка и функцию «карты». Мы передаем каждый фрагмент кода функции «timeit» и указываем, сколько раз мы хотим его запустить:

# Using a for loop
timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)

# Using a list comprehension
timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)

# Using the map function
timeit.timeit('"-".join(map(str, range(100)))', number=10000)

Функция «timeit» возвращает время выполнения в секундах. В этом примере мы видим, что использование функции «карта» является самым быстрым методом, который занимает всего 0,24 секунды.

⚡️ Измеряя время выполнения небольших фрагментов кода с помощью «timeit», мы можем оптимизировать наш код Python, чтобы он работал быстрее и эффективнее.

10. “is” vs “==”

🐶 Допустим, у нас есть собака по кличке «а». 🐕

a = [1, 2, 3]

🐾 У нас также есть еще одна собака, «б», которую мы хотим сделать такой же, как «а». 🐾

b = a

🤝 Если мы проверим, является ли «a» «b», мы получим True, потому что это буквально одна и та же собака! 🤝

>>> a is b 
True

🧐 Но если мы просто хотим убедиться, что у них одинаковые качества, например, одинаковое количество ног и виляющий хвост, мы бы использовали «==» и также получили бы True. 🧐

>>> a == b 
True

👫 Теперь предположим, что у нас есть еще одна собака «с», которую мы хотим сделать похожей на «а», но на самом деле это не та же самая собака. 🐕‍🦺

c = list(a)

🤝 Если мы используем «==» для сравнения «a» и «c», мы все равно получим True, потому что они имеют одинаковые качества. 🤝

>>> a == c 
True

🤔 Но если мы используем «is», мы получаем False, потому что это две разные собаки. 🤔

>>> a is c 
False
  • Выражения is оцениваются как True, если две переменные указывают на один и тот же объект.
  • «==» оценивается как True, если объекты, на которые ссылаются переменные, равны

Я надеюсь, что это поможет прояснить разницу между «есть» и «==»!

Вот и все, несколько фрагментов кода Python, которые демонстрируют красоту, простоту и универсальность этого удивительного языка программирования. Независимо от того, являетесь ли вы новичком или опытным разработчиком, эти примеры кода могут помочь вам улучшить свои навыки кодирования и вдохновить вас на написание большего количества кода Pythonic. Помните, программирование может быть увлекательным, а Python делает его еще более увлекательным благодаря простому синтаксису и мощным функциям. Так что продолжайте писать код, и да пребудет с вами сила Python! 🐍💻

Если вам нравится то, что я пишу, подпишитесь на меня, поделитесь некоторыми из моих историй.
Вы можете подписаться на меня на GitHub и связаться со мной на Linkedin. Вы также можете прочитать о некоторых более мощных однострочниках Python здесь