Форум программистов, компьютерный форум, киберфорум
Meerith
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Локальные переменные, созданные внутри lambda-функций. Python

Запись от Meerith размещена 26.01.2016 в 20:47
Метки lambda, python

Часто меня так и тянет написать маленькую функцию в одну строчку. Но что делать, если нужно создать перемешанный случайным образом список? Функция random.shuffle не возвращает перемешанного списка, так что нужно либо писать оболочку для этой функции, либо создать локальную переменную.
Печально, но чтобы создать оболочку понадобится минимум одна лишняя строчка! Так что лучше эту самую строчку потратить на локальную переменную - это куда проще!
Получается проблема - так и так накидывается одна строчка... А со вторым вариантом, кстати, - вообще прокол: lambda-функции не позволяют создавать переменные внутри своего тела.
Поразмыслив немного, я придумал хитрый способ обхода этого ограничения. Для этого нужно создать выражение генератор, типа:
Python
1
qwer = lambda: [x for x in [1]][0]
Обратите внимание, что список, из которого берутся значения для внутригенераторной переменной - единичный, так что х примет только одно значение, чего нам и требовалось. Внутри генератора с этой переменной х можно делать все, что душе угодно, а значение переменной извлекается получением нулевого элемента одиночного списка, полученного в генераторе.
Таким образом, практически любую относительно небольшую функцию можно превратить в однострочную lambda-функцию, обойдя при этом ограничения на циклы и создание переменных.
Вот пример кода, где я применил эту уловку:
Python
1
dropkey=lambda:[(shuffle(a) or a) for a in [[chr(x) for x in [*range(ord('А'),ord('ё')+1)] ] ]][0]
Функция dropkey возвращает перемешанный список символов русского алфавита. Написано в одну строчку!
Размещено в Без категории
Просмотров 413 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.