Pull to refresh

Comments 24

Есть интересный и простой прием с заменой индексов на имена при работе с упорядоченными коллекциями:
users = [('Sam', 18, 'male'), ('Lisa', 25, 'female')]
name, age, sex = 0, 1, 2
for user in users:
    print(user[name], '-', user[age])
Подозреваю, что способ, описанный DaneSoul может быть полезным в случае, когда интересующие элементы кортежей расположены не в позициях 0, 1 и 2, а, скажем, в позициях 3, 7 и 16.
Хотя я бы сначала задумался о корректности выбранного подхода, если он заставляет работать с такими кортежами.

Лишние переменные можно заменить подчеркиваниями, например:


for (name, _, _, _, email) in users:
    print(name, '-', email)

А кортежи часто бывают при чтении из файла.

Если нужны только первый и последний элементы — есть ещё такой вариант (*_ собирает всё остальное в список):


In [1]: for first, *_, last in (range(10), range(42)): 
   ...:     print(f'{first=}, {last=}, {len(_)=}') 
   ...:                                                                                                                                               
first=0, last=9, len(_)=8
first=0, last=41, len(_)=40
Тогда может так?
for (name, *_, email) in users:
    print(name, '-', email)
А зачем в этом цикле нужна переменная пол (sex), хватит и nil )

for (name, age, nil) in users:
    print(name, '-', age)


UFO just landed and posted this here
Так nil в Вашем примере это такая же переменная (как по-сути и подчеркивание в примере выше), в этом легко убедится распечатав их значения в print()
for name, age, nil in users:
    print(name, '-', age, nil)
for name, _, _ in users:
    print(name, _)

А явно указать там в присвоении None нельзя:
for name, age, None in users:
SyntaxError: can't assign to keyword
Кстати, кортеж, когда он используется для получения значений не обязательно заключать в скобки.
Согласен. Чтобы сократить лишнее, можно ограничить список только 2мя нужными элементами. Например так

users = [('Sam', 18, 'male'), ('Lisa', 25, 'female')]
name, age = 0, 1
for (name, age, _) in users:
    print(name, '-', age)

Так плохо, ненужные переменные затеняют подчеркиванием.

не все системы поддерживают скрытие паролей
ищет наилучшие, «достаточно хорошие» совпадения
принадлежности его к некоей сети
в коде задают точки останова и исследуют программу
[...]

Такое ощущение, что текст заметки тоже написан на питоне: чем меньше строгости в определениях — тем лучше.

Похоже автор наворовал советы и скомпилировал статью.
Других причин зачем он делает столько лишних действий с pdb представить тяжело, ведь даже в доке https://docs.python.org/3/library/pdb.html написано что править и лишний раз прогонять скрипт не обязательно, можно вызвать python -m pdb script.py и pdb командами читать листинг, ставить/убирать брейкпойнты и продолжать выполнение.

Кэширование результатов вызова функций с помощью декоратора
Тут мне ещё хотелось бы отметить то, что кэширование нельзя использовать с функциями, у которых есть побочные эффекты, или с функциями, создающими мутабельные объекты при каждом вызове.

В примере функция с побочным эффектом.
Ну, приводить в 100500-й раз пример с вычислением чисел Фибоначчи было бы как-то скучно, наверное :) А так то вы правы, конечно.
Более того, в документации:
@functools.lru_cache(maxsize=128, typed=False)
Decorator to wrap a function with a memoizing callable that saves up to the maxsize most recent calls. It can save time when an expensive or I/O bound function is periodically called with the same arguments.


В чём побочный эффект?

А вдруг сайт не работает? В прошлый раз вернул 200, а щас уже Not Found. Любое IO по сути делает функцию не чистой.

А в чем побочный эффект-то? Так-то и содержимое сайта может измениться, понятно, что кэшированный результат об этом не узнаёт.

Так в том и эффект, что содержимое сайта может измениться. По-хорошему так не делается, мемоизировать надо детерминированные функции. Но в качестве примера и для каких-то даже рабочих целей — почему бы и нет.
Ну любой, кто использует кэш для интернет-запросов, должен осознавать, какие риски с этим приходят, это же не повод не использовать кэширование потому что «по-хорошему так не делается». Просто мне субъективно кажется, что область, где применяется кэширование, на 90% состоит из IO.
Ну, не обязательно. Я, например, применял кэширование для NLP задач, вызовы библиотек для работы с текстами часто бывают довольно медленными и в то же время там бывают вызовы функций, которые часто повторяются с одинаковыми параметрами, они очень хорошо кэшируются (у меня было ускорение до 10 раз).

Именованные слайсы вообще почти никогда не нужны. Если вы только не работаете с ужасно отформатированными строками.

Sign up to leave a comment.