Рубрики
Без рубрики

Советы и хитрость Python, вы еще не видели, часть 2.

Примечание: это было первоначально размещено на Martinheinz.dev Несколько недель назад я опубликовал статью (здесь) о … с Tagged с Python, Learning, Tulciory.

Примечание: это было первоначально опубликовано в martinheinz.dev

Несколько недель назад я опубликовал статью (здесь) о некоторых не так широко известных функциях Python, и, похоже, ему нравилось, поэтому здесь появляется еще один раунд функций Python, которые вы, надеюсь, еще не видели.

Название среза с помощью функции среза

Использование множества значений индекса в твердом кодировании может быстро стать беспорядком в обслуживании и читабельности. Одним из вариантов будет использование констант для всех значений индекса, но мы можем сделать лучше:

#              ID    First Name     Last Name
line_record = "2        John         Smith"

ID = slice(0, 8)
FIRST_NAME = slice(9, 21)
LAST_NAME = slice(22, 27)

name = f"{line_record[FIRST_NAME].strip()} {line_record[LAST_NAME].strip()}"
# name == "John Smith"

В этом примере мы видим, что мы можем избежать таинственных индексов, сначала назвав их, используя ломтик функционируйте, а затем используйте их при вырезе части строки. Вы также можете получить больше информации о объекте Slice, используя его атрибуты .Начало , .остановка и .step Анкет

Побуждение пользователя за пароль во время выполнения

Множество инструментов или сценариев командной линии требуют имени пользователя и пароля для работы. Итак, если вам случится написать такую программу, вы можете найти GetPass модуль полезен:

import getpass

user = getpass.getuser()
password = getpass.getpass()
# Do Stuff...

Этот очень простой пакет позволяет вам предложить пользователю для пароля, а также получить имя пользователя, извлекая имя входа в текущее пользователя. Имейте в виду, что не каждая система поддерживает скрытие паролей. Python попытается предупредить вас об этом, поэтому просто прочитайте предупреждения в командной строке.

Найдите близкие совпадения слова/строки

Теперь, для немного более неясной особенности стандартной библиотеки Python. Если вы когда -нибудь окажетесь в ситуации, когда вам нужно найти слова, похожие на какую -то входную строку, используя что -то вроде Левенштейн расстояние Питон и difflib вернуть свою спину.

import difflib
difflib.get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'], n=2)
# returns ['apple', 'ape']

difflib.get_close_matches Находит лучшее “Достаточно хорошо” Спички. Здесь первый аргумент соответствует второму. Мы также можем предоставить дополнительный аргумент n который определяет максимальное количество совпадений, которые будут возвращены. Еще один доступный аргумент ключевого слова отсечка (по умолчанию на 0,6) может быть установлено, чтобы изменить порог для оценки соответствующих строк.

Работа с IP -адресами

Если вам нужно сделать сетевую связь в Python, вы можете найти iPaddress модуль очень полезен. Одним из вариантов использования будет генерировать список IP-адресов от CIDR ( Бесклассовый Междоменная маршрутизация ):

import ipaddress
net = ipaddress.ip_network('74.125.227.0/29')  # Works for IPv6 too
# IPv4Network('74.125.227.0/29')

for addr in net:
    print(addr)

# 74.125.227.0
# 74.125.227.1
# 74.125.227.2
# 74.125.227.3
# ...

Еще одна приятная функция – чеки членства в сети IP -адресов:

ip = ipaddress.ip_address("74.125.227.3")

ip in net
# True

ip = ipaddress.ip_address("74.125.227.12")
ip in net
# False

Есть гораздо более интересные функции, которые я не буду проходить, так как вы сможете найти эти Здесь Анкет Имейте в виду, что между iPaddress модуль и другие сетевые модули. Например, вы не можете использовать экземпляры Ipv4network Как строки адресов – их нужно преобразовать с помощью стр первый.

Программа отладки сбой в Shell

Если вы один из людей, которые отказываются использовать IDE и кодируетесь в VIM или EMACS, то вы, вероятно, попали в ситуацию, когда отладчик, как в IDE, будет полезно. И знаешь, что? У вас есть один – просто запустите свою программу с Python3.8 -i-i Запускает Interactive Shell, как только ваша программа завершится, и оттуда вы можете изучить все переменные и функции вызова. Аккуратно, но как насчет Фактическое отладчик ( pdb )?

Давайте использовать следующую программу ( script.py ):

def func():
    return 0 / 0

func()

И запустить скрипт с Python3.8 -i Script.py

# Script crashes...
Traceback (most recent call last):
  File "script.py", line 4, in 
    func()
  File "script.py", line 2, in func
    return 0 / 0
ZeroDivisionError: division by zero
>>> import pdb
>>> pdb.pm()  # Post-mortem debugger
> script.py(2)func()
-> return 0 / 0
(Pdb) 

Мы видим, где мы разбились, теперь давайте установим точку останова:

def func():
    breakpoint()  # import pdb; pdb.set_trace()
    return 0 / 0

func()

Теперь запустите его снова:

script.py(3)func()
-> return 0 / 0
(Pdb)  # we start here
(Pdb) step
ZeroDivisionError: division by zero
> script.py(3)func()
-> return 0 / 0
(Pdb) 

Большую часть времени печатных заявлений и трассировки достаточно для отладки, но иногда вам нужно начать касаться, чтобы понять, что происходит в вашей программе. В этих случаях вы можете установить точки (ы) и при запуске программы, выполнение остановится на линии точки останова, и вы можете проверить свою программу, например, Список функций ARGS, оценить выражение, переменные списка или просто переходить, как показано выше. PDB Полностью представлен Python Shell Таким образом, вы можете выполнить литературное, но вам понадобятся некоторые команды отладчиков, которые вы можете найти здесь

Определение нескольких конструкторов в классе

Одной из функций, которая очень распространена в языках программирования, но не в Python, является перегрузка функции. Даже если вы не можете перегружать нормальные функции, вы все равно можете (вроде) конструкторы перегрузки, используя методы класса:

import datetime

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    @classmethod
    def today(cls):
        t = datetime.datetime.now()
        return cls(t.year, t.month, t.day)

Вы можете быть склонны помещать всю логику альтернативных конструкторов в __init__ и решить его, используя *args , ** Kwargs и куча Если утверждения вместо использования методов класса. Это может сработать, но это может быть трудно читать и трудно поддерживать. Поэтому я бы порекомендовал поместить очень мало логики в __init__ и выполнить все операции в отдельных методах/конструкторах. Таким образом, вы получите чистый код, который будет чистым и очищенным как для сопровождающего, так и для пользователя класса.

Вызовы функции кэширования с использованием декоратора

Вы когда -нибудь писали функцию, которая выполняла дорогостоящие операции ввода/вывода или некоторую довольно медленную рекурсивную функцию, которая может извлечь выгоду из кэширования (памяти) его результатов? Если вы это сделали, то есть простое решение для этого, используя lru_cache от Functools :

from functools import lru_cache
import requests

@lru_cache(maxsize=32)
def get_with_cache(url):
    try:
        r = requests.get(url)
        return r.text
    except:
        return "Not Found"


for url in ["https://google.com/",
            "https://martinheinz.dev/",
            "https://reddit.com/",
            "https://google.com/",
            "https://dev.to/martinheinz",
            "https://google.com/"]:
    get_with_cache(url)

print(get_with_cache.cache_info())
# CacheInfo(hits=2, misses=4, maxsize=32, currsize=4)

В этом примере мы делаем Получить Запросы, которые кэшируются (до 32 кэшированных результатов). Вы также можете увидеть, что мы можем проверить информацию о кэше нашей функции, используя cache_info метод Декоратор также предоставляет clear_cache Метод недействительных кэшированных результатов. Я также хочу отметить, что это не следует использовать с функциями, которые имеют побочные эффекты или те, которые создают изменяемые объекты с каждым вызовом.

Найти наиболее часто встречающиеся предметы в итерационном

Поиск наиболее распространенных элементов в списке – довольно распространенная задача, которую вы могли бы выполнить, используя для Цикл и словарь (карта), но это было бы пустой тратой времени, так как есть Счетчик класс в Коллекции модуль:

from collections import Counter

cheese = ["gouda", "brie", "feta", "cream cheese", "feta", "cheddar", 
          "parmesan", "parmesan", "cheddar", "mozzarella", "cheddar", "gouda",
          "parmesan", "camembert", "emmental", "camembert", "parmesan"]

cheese_count = Counter(cheese)
print(cheese_count.most_common(3))
# Prints: [('parmesan', 4), ('cheddar', 3), ('gouda', 2)]

Под капюшоном, Счетчик это всего лишь словарь, который отображает элементы по количеству случаев, поэтому вы можете использовать его как нормальный диктат :

print(cheese_count["mozzarella"])
# Prints: 1

cheese_count["mozzarella"] += 1 

print(cheese_count["mozzarella"])
# Prints: 2

Кроме того, вы также можете использовать Обновление (More_words) Метод легко добавить больше элементов, чтобы противостоять. Еще одна крутая особенность Счетчик это то, что вы можете использовать математические операции (добавление и вычитание) для объединения и вычитания экземпляров Счетчик Анкет

Вывод

Я думаю, что на этот раз большинство советов, которыми я поделился здесь, может быть полезны почти каждый день, если вы работаете с Python, поэтому я надеюсь, что они пригодятся. Кроме того, если у вас есть какие -либо мысли об этих советах и хитростях Python, или, может быть, если вы знаете о каких -либо лучших способах решения задач выше, то дайте мне знать! 🙂

Оригинал: “https://dev.to/martinheinz/python-tips-and-trick-you-haven-t-already-seen-part-2-p78”