17 лучших однострочников на Python


Задачи по Python для начинающих от Tproger и GeekBrains

Вместе с факультетом Python-разработки GeekUniversity собрали для вас несколько простых задач по Python для обучения и тренировки. Их можно решать в любом порядке.

Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке. Все приведённые варианты написаны на Python 3.

Задача 1

Есть список a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] .

Выведите все элементы, которые меньше 5 .

Самый простой вариант, который первым приходит на ум — использовать цикл for :

Также можно воспользоваться функцией filter , которая фильтрует элементы согласно заданному условию:

И, вероятно, наиболее предпочтительный вариант решения этой задачи — списковое включение:

print([elem for elem in a if elem

Задача 2

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] ;

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] .

Нужно вернуть список, который состоит из элементов, общих для этих двух списков.

И снова мы можем воспользоваться циклом for :

Или функцией filter :

Или списковым включением:

result = [elem for elem in a if elem in b]

А можно привести оба списка к множествам и найти их пересечение:

result = list(set(a) & set(b))

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

Задача 3

Отсортируйте словарь по значению в порядке возрастания и убывания.

Импортируем нужный модуль и объявляем словарь:

Сортируем в порядке возрастания:

И в порядке убывания:

result = dict ( sorted ( d . items ( ) , key = operator . itemgetter (1 ) , reverse = True ) )

Задача 4

Напишите программу для слияния нескольких словарей в один.

Допустим, вот наши словари:

Объединить их можно вот так:

А можно с помощью «звёздочного» синтаксиса:

О звёздочном синтаксисе можно прочитать в нашей статье.

Задача 5

Найдите три ключа с самыми высокими значениями в словаре my_dict = <'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20>.

Можно воспользоваться функцией sorted :

Аналогичный результат можно получить с помощью функции nlargest из модуля heapq :

Задача 6

Напишите код, который переводит целое число в строку, при том что его можно применить в любой системе счисления.

Второй аргумент функции int отвечает за указание основания системы счисления:

Задача 7

Нужно вывести первые n строк треугольника Паскаля. В этом треугольнике на вершине и по бокам стоят единицы, а каждое число внутри равно сумме двух расположенных над ним чисел.

Задача 8

Напишите проверку на то, является ли строка палиндромом. Палиндром — это слово или фраза, которые одинаково читаются слева направо и справа налево.

Тут всё просто, достаточно сравнить строку с её обратной версией, для чего можно использовать встроенную функцию reversed:

Того же эффекта можно добиться с помощью срезов:

Задача 9

Сделайте так, чтобы число секунд отображалось в виде дни:часы:минуты:секунды .

Задача 10

Вы принимаете от пользователя последовательность чисел, разделённых запятой. Составьте список и кортеж с этими числами.

Задача 11

Выведите первый и последний элемент списка.

Задача 12

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

Задача 13

При заданном целом числе n посчитайте n + nn + nnn.

Задача 14

Напишите программу, которая выводит чётные числа из заданного списка и останавливается, если встречает число 237.

Задача 15

Напишите программу, которая принимает два списка и выводит все элементы первого, которых нет во втором.

Задача 16

Выведите список файлов в указанной директории.


Говнокод: по колено в коде.

Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!

Python / Говнокод #12888

Just for fun. Транспонирование таблицы.
Само собой, гк в применении питона в не совсем подходящей для него нише.

Комментарии (21) RSS

«Само собой, гк в применении питона в не совсем подходящей для него нише.»

список «подходящих» ниш в студию.

Python как раз таки подходит из-за numpy:

/Temp> echo $’1 2\n3 4′ | python numpy_t.py
1 3
2 4

ну и что? и не то что бы строка была длиной. это строго попадает в категорию one-liner’ов.

что на шелле что на авк что на седе что на перле это как бы норма вещей. и кто-то знает пути как тоже самое на питоне делать.

Ну блин, а если понадобится немного изменить однострочник, да хоть if перед принтом воткнуть, а уже есть import-statement (=> раскладка не позволит)?

Ну можно, конечно, в $’..’ обернуть . но тогда придется удваивать неэкранирующие слэши.

Мастер Йода рекомендует:  RFID предотвратит врачебные ошибки

вот эти «а если» и являются естественным разграничителем что делается однострочником, а что нет.

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

«если они не вызывают особых затруднений у awk / perl (прости, господи) / ruby?»

примеры того что сложно делать уан-лайнерами, внезависимости от языка, потому что строка становится слишком длиной: (вложеные) циклы, временные переменные, состояние/фаза обработки ввода, дополнителные действия по окончанию работы.

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

> примеры того что сложно делать уан-лайнерами, внезависимости от языка

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

> ни в одном из них нету

Таки? [code]ruby -e ‘puts STDIN.each.map(&:split).transpose.map<|l | l.join" ">‘[/coed]

ок. в одном есть. и именно в том одном, который нигде никогда не предустановлен.

> который нигде никогда не предустановлен

Левый аргумент, если говорить о «предустановке», то можно хоть sshfs примонтировать, хоть awk-скрипт достать из заначки, а в тяжелом случае — собрать transpose c sourceforge.

Как вам луж^Wой, в смысле понравилось ли «отыгрывать» роль паладина питона? ^_^

вообще-то я перловщик, и отстаивал реалии one-liner’ов.

(и меня просто порадовало что и в питоне тоже возможны достойные однострочники. не смотря на то что сам питон терпеть не могу.)

и поверь мне, предустановлено/не предустановлено IRL играет громадную роль. я не могу послать строчку/скрипт руби или питона, потому что знаю что на *NIX продакшн системах это просто не стоит. потому что не предустановлено. потому что не поддерживаемое 3rd party. в то время как perl/awk/sed/sh 100% гарантии предустановлены и поддерживаются. (на маках питон к слову предустановлен.)

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

Не сильно длинее будет тот же awk накидать.
Для одноразового вызова можно и socat прокинуть на машину с любимым средством.

// А против однострочников ничего не имею.

«да, можно уместить в одну строку, но при небольших изменениях придется плясать.»

я только сейчас уловил что у тебя похоже какая-то философская/религиозная проблема с переходом от однострочника к полноценному скрипту.

однострочник на python

Гм вот такая вот задачка простейшая:

есть некий словарь

Нужно для какого-то условия ( например value > 5 ) умножить значения value *2. Можно ли это сделать в 1 строчку ?

dict comprehension, но это создаст новый словарь на основе существующего

лучше пройдись обычным циклом

Можешь эту строчку даже из пайпа получить при этом. Хотя из аргумента тоже можно.

Конечно, просто пишешь x*2 if x>5 else x.

Но не делай так.

5 else v for k, v in test.items()>

Спасибо, не знал про такой вариант

Если значений на обновление слишком много, то лучше даже

list(map(lambda i: test.__setitem__(i[0], i[1]*2), test.items()))

это уже list получится из dict

list из None’ов. Говнокодер через него сэмулировал HOF foreach. Ну и без filter, всё равно облажался.

Забыл про условие. list(map(lambda i: i[1]>5 and test.__setitem__(i[0], i[1]*2), test.items()))

Твой говнокод ничем не лучше. Но тут сама задача написать говнокод же.

Это, очевидно, неправда. Обычный продуктовый код.

Лучший стиль Python для сложных однострочников

Недавно я написал довольно уродливый вид на один лайнер и задавался вопросом, лучше ли стиль python разбивать его на несколько строк или оставить его как прокомментированный однострочный. Я смотрел в PEP 8, но ничего не говорил об этом

Это код, который я написал:

Но было бы что-то вроде этого лучше?

Или, может быть, что-то среднее?

6 ответов

Мое голосование будет основано на удобочитаемости. Я считаю, что ваш однострочный сканер быстрее переваривается, чем многострочный пример.

Однострочники великолепны, если они подходят друг другу в один глаз, и вместе они выполняют одну отдельную задачу.

Лично я бы написал, что как:


(Теперь, вступая в сферу downvote. )

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

Я не говорю, что комментарии — это зло, просто эти подробные комментарии могут негативно повлиять на читаемость. Например. классик: x+=1 # increment x by 1

Естественно, это зависит от цели и аудитории кода.

CGI: пишем простой сайт на Python. Часть 1: Hello world

Проще всего создать динамические страницы на Python при помощи CGI-скриптов. CGI-скрипты — это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.

Сегодня я расскажу про то, как написать Hello world, как CGI-скрипт.

Настройка локального сервера

В Python уже есть встроенный CGI сервер, поэтому его настройка элементарна.

Для запуска из консоли (для любителей linux-систем). Запускать нужно из той папки, где мы хотим работать:

Для сидящих на Windows чуть проще будет запуск Python файла (заметьте, что он должен находиться в той же папке, в которой мы планируем работать!):

Теперь откройте браузер и в адресной строке наберите localhost:8000

Если у вас примерно такая же картина, значит, у вас все заработало!

Мастер Йода рекомендует:  8 задач для практики Frontend-разработчика

Hello world

Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (у меня она уже создана).

В этой папке создаём скрипт hello.py со следующим содержимым:

Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).

Вторая строка печатает заголовок. Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).

Третья строка (просто символ новой строки) отделяет заголовки от тела ответа.

Четвёртая печатает Hello world.

Теперь переходим на localhost:8000/cgi-bin/hello.py

Если у вас не работает, проверьте, установлены ли права на выполнение.

Также в консоли запущенного сервера появляются сообщения об ошибках. Например, убрал скобочку и обновил страницу:

В следующей части мы рассмотрим обработку данных форм и cookies.

Лучший стиль Python для сложных однострочников

Недавно я написал довольно уродливый однострочный текст, и мне было интересно, лучше ли в стиле Python разбить его на несколько строк или оставить его как прокомментированный однострочный. Я посмотрел в PEP 8, но он ничего не упомянул об этом

Это код, который я написал:

Но будет ли что-то вроде этого лучше?

Или что-то среднее?

6 ответов

Мой голос будет основан на удобочитаемости. Я считаю, что ваш однострочник быстрее усваивается, чем многострочный пример.

Однострочники хороши, если они умещаются в одном глазу , и вместе они выполняют одну особую задачу.

Лично я написал бы это как:

(Теперь, углубляясь в царство downvote . )

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

Я не говорю, что комментарии — это зло, просто подробные комментарии могут негативно повлиять на читабельность. Например, классика: x+=1 # increment x by 1

Естественно, это зависит от цели и аудитории кода.

Однострочник на Python для запуска web сервера

В языке программирования Python есть замечательная штука — модуль с помощью которого очень просто из текущей папки сделать web сервер. Для этого всего-навсего нужно набрать:

После этого на http://127.0.0.1:3000 заработает web сервер, который будет отдавать файлы из папки в которой была запущена эта команда.

Число 3000 в команде — это порт на котором поднимется web сервер. Это значение можно не указывать, по умолчанию будет использован порт 8000.

У этого однострочника есть огромный плюс — на очень большом количестве машин python уже есть. Например, python преустановлен на Mac OS и на многих linux дистрибутивов.

Искусственный Интеллект — AI

Подборка самых эффектных и элегантных примеров на Python, умещающихся в одну строчку. Прекрасное развлечение и зарядка для ума.

print «hello world»
Лямбда функции:
max_xy = lambda x,y: x if x > y else y

Map функции:
n = [1,2,3,4]
print((map(lambda x:x**2 + 2, n)))

Reduce функции:
n = [1,2,3,4]
print(reduce (lambda x,y: x*y, n))

Filter функции:
n = [1,2,3,4]
print (list(filter(lambda x: x > 2, n)))

Быстрая сортировка:
qsort = lambda l : l if len(l) = l[0]])

Расстояние между двумя точками:
dist = lambda w,v : (sum((wi — vi)**2 for wi,vi in zip(w,v)))**.5

Значение числа Пи:
4*sum((-1.0)**(n%2) / (2*n + 1) for n in range(2010))

Генерация непрерывного массива чисел:
print map(lambda x:x+1,range(0,20))

Простые числа от 0 до 1000:
print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0, map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))

Первые 20 чисел Фибоначчи:
print map(lambda x,f=lambda x,f:(x

Все возможные сочетания:
cross_product = [(a, b) for a in [‘a’, ‘b’, ‘c’] for b in [1, 2, 3]]

Отрезать конец одной строки и добавить его к другой:
def foo(string, numbers): return ‘, ‘.join(map(lambda s,n:s+str(n), [string for i in numbers], numbers))

Умножение вектора на число:
def scale(A, x): return [ai*x for ai in A]
scale([3,4,5], 2)

Сложение векторов:
A = [1, 2, 3]
B = [5, 8, 10]
def add(A, B): return [ai+bi for (ai, bi) in zip(A, B)]
add(A,B)

Транспонирование матрицы:
a=[[1,2,3],[4,5,6],[7,8,9]]
inverted_a = [list(i) for i in zip(*a)]

Простая нейронная сеть в 9 строк кода на Python

Из статьи вы узнаете, как написать свою простую нейросеть на python с нуля, не используя никаких библиотек для нейросетей. Если у вас еще нет своей нейронной сети, вот всего лишь 9 строчек кода:


Перед вами перевод поста How to build a simple neural network in 9 lines of Python code, автор — Мило Спенсер-Харпер. Ссылка на оригинал — в подвале статьи.

В статье мы разберем, как это получилось, и вы сможете создать свою собственную нейронную сеть на python. Также будут показаны более длинные и красивые версии кода.

Но для начала, что же такое нейронная сеть? Человеческий мозг состоит из 100 миллиарда клеток, называемых нейронами, соединенных синапсами. Если достаточное количество синаптичеких входов возбуждены, то и нейрон тоже становится возбужденным. Этот процесс также называется “мышление”.

Мы можем смоделировать этот процесс, создав нейронную сеть на компьютере. Не обязательно моделировать всю сложную модель человеческого мозга на молекулярном уровне, достаточно только высших правил мышления. Мы используем математические техники называемые матрицами, то есть просто сетки с числами. Чтобы сделать все максимально просто, построим модель из трех входных сигналов и одного выходного.

Мы будем тренировать нейрон на решение задачи, представленной ниже.

Первые четыре примера назовем тренировочной выборкой. Вы сможете выделить закономерность? Что должно стоять на месте “?”

Диаграмма 2. Input — входный сигнал, Output — выходной сигнал.

Мастер Йода рекомендует:  Как сделать картинку ссылкой в HTML

Вероятно вы заметили, что выходной сигнал всегда равен самой левой входной колонке. Таким образом ответ будет 1.

Процесс обучения нейронной сети

Как же должно происходить обучение нашего нейрона, чтобы он смог ответить правильно? Мы добавим каждому входу вес, который может быть положительным или отрицательным числом. Вход с большим положительным или большим отрицательным весом сильно повлияет на выход нейрона. Прежде чем мы начнем, установим каждый вес случайным числом. Затем начнем обучение:

  1. Берем входные данные из примера обучающего набора, корректируем их по весам и передаем по специальной формуле для расчета выхода нейрона.
  2. Вычисляем ошибку, которая является разницей между выходом нейрона и желаемым выходом в примере обучающего набора.
  3. В зависимости от направления ошибки слегка отрегулируем вес.
  4. Повторите этот процесс 10 000 раз.

В конце концов вес нейрона достигнет оптимального значения для тренировочного набора. Если мы позволим нейрону «подумать» в новой ситуации, которая сходна с той, что была в обучении, он должен сделать хороший прогноз.

Формула для расчета выхода нейрона

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

Затем мы нормализуем это, поэтому результат будет между 0 и 1. Для этого мы используем математически удобную функцию, называемую функцией Sigmoid:

Если график нанесен на график, функция Sigmoid рисует S-образную кривую.

Подставляя первое уравнение во второе, получим окончательную формулу для выхода нейрона:

Возможно, вы заметили, что мы не используем пороговый потенциал для простоты.

Формула для корректировки веса

Во время тренировочного цикла (Диаграмма 3) мы корректируем веса. Но насколько мы корректируем вес? Мы можем использовать формулу «Взвешенная по ошибке» формула

Почему эта формула? Во-первых, мы хотим сделать корректировку пропорционально величине ошибки. Во-вторых, мы умножаем на входное значение, которое равно 0 или 1. Если входное значение равно 0, вес не корректируется. Наконец, мы умножаем на градиент сигмовидной кривой (диаграмма 4). Чтобы понять последнее, примите во внимание, что:

    1. Мы использовали сигмовидную кривую для расчета выхода нейрона.
    2. Если выходной сигнал представляет собой большое положительное или отрицательное число, это означает, что нейрон так или иначе был достаточно уверен.
    3. Из Диаграммы 4 мы можем видеть, что при больших числах кривая Сигмоида имеет небольшой градиент.
  1. Если нейрон уверен, что существующий вес правильный, он не хочет сильно его корректировать. Умножение на градиент сигмовидной кривой делает именно это.

Градиент Сигмоды получается, если посчитать взятием производной:

Вычитая второе уравнение из первого получаем итоговую формулу:

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

Написание Python кода

Хоть мы и не будем использовать библиотеки с нейронными сетями, мы импортируем 4 метода из математической библиотеки numpy. А именно:

  • exp — экспоненцирование
  • array — создание матрицы
  • dot — перемножения матриц
  • random — генерация случайных чисел

Например, мы можем использовать array() для представления обучающего множества, показанного ранее.

“.T” — функция транспонирования матриц. Итак, теперь мы готовы для более красивой версии исходного кода. Заметьте, что на каждой итерации мы обрабатываем всю тренировочную выборку одновременно.

Код также доступен на гитхабе. Если вы используете Python3 нужно заменить xrange на range.

Заключительные мысли

Попробуйте запустить нейросеть, используя команду терминала:

Итоговый должен быть похож на это:

У нас получилось! Мы написали простую нейронную сеть на Python!

Сначала нейронная сеть присваивала себе случайные веса, а затем обучалась с использованием тренировочного набора. Затем нейросеть рассмотрела новую ситуацию [1, 0, 0] и предсказала 0.99993704. Правильный ответ был 1. Так очень близко!

Традиционные компьютерные программы обычно не могут учиться. Что удивительного в нейронных сетях, так это то, что они могут учиться, адаптироваться и реагировать на новые ситуации. Так же, как человеческий разум.

Конечно, это был только 1 нейрон, выполняющий очень простую задачу. А если бы мы соединили миллионы этих нейронов вместе?

Однострочные и многострочные циклы и векторизация в Python

Можно ли использовать однострочные циклы в Python для создания списков? (т.е. распознавания списков) или могут использоваться для более общих вычислений?

Например, мне известно, что в Python понимаются списки (

однострочный цикл), например

также может быть построен с многострочным циклом:

Но можем ли мы всегда преобразовывать общие многострочные циклы в однострочные циклы?

Например, скажем, у нас есть следующий многострочный цикл:

можем ли мы преобразовать его в однострочный цикл? В более общем плане:

Q1. Являются ли эти две формы функционально эквивалентными? (то есть они поддерживают один и тот же набор манипуляций/операций)

Q2. Я думаю, что прочитал, что однострочные циклы в Python векторизованные. Это правда? И означает ли это, что они могут быстрее итерации, чем многострочные циклы?

Но можем ли мы всегда преобразовывать общие многострочные циклы в Python в однострочные циклы?

Короткий ответ — нет.

Пояснения списков хороши для прогнозов (отображение) и/или фильтрации.

Например, если у вас есть такой код:

Затем, как вы указываете, это может быть полезно для переписывания в виде понимания списка:

Однако, как правило, для операций, которые не вписываются в этот проецирующий или фильтрующий шаблон, не все понимается.

Например, если вам нужно мутировать элементы, но не нуждаться в результатах, то понимание списка не подходит. Следующий код был бы неудобен для записи в качестве понимания списка (предполагая, что оба метода возвращают None ):

Некоторые операции не допускаются внутри понимания. Примером является раннее изложение цикла, если выполняется условие:

Добавить комментарий