Как я выбирал скриптовый язык и остановился на Python
Задачи в программировании бывают разными. Например, часто бывает нужно написать простой скрипт на 10 строк кода. Долгое время я использовал для таких задач Perl. Но, как показывает опыт, многие команды находят Perl сложным в изучении и использовании. Поэтому возникает вопрос поиска более лучшего скриптового языка.
После долгих раздумий я пришел к выводу, что такой язык — это, скорее всего, Python, и в этой заметке будет рассказано, почему.
Отмечу, что для скриптовых языков существует огромная ниша. Фактически, во всех задачах, где скорость выполнения программы не очень важна, имеет смысл использовать скриптовые языки, так как скорость разработки на этих языках существенно выше. Во-первых, так происходит по той причине, что скриптовые языки изначально не претендуют на высокую производительность кода, что позволяет делать их более высокоуровневыми и выразительными. Во-вторых, скриптовые языки позволяют программисту видеть результат мгновенно, без перекомпиляции проекта, перезапуска веб-сервера, и так далее. Такого рода не требовательных к скорости перемножения матричек задач намного больше, чем может показаться на первый взгляд.
Python-разработчикам больше не нужен JavaScript. Brython, или Python в браузере
- Написание небольших скриптов в стиле «пропарсил логи, вывел статистику» и подобного рода;
- Разработка тестов — интеграционных, системных, нагрузочных, …;
- Всем нужен простой консольный калькулятор, а у скриптовых языков обычно есть REPL. Иногда нужно не просто складывать и умножать, а, например, отсортировать 1000 целых чисел. Это все тоже относится к «калькулятору»;
- В веб-стартапах важно быстро слепить прототип, налить на него трафика и посмотреть, понравилась ли идея пользователям. Если взлетит, находим 10% кода, которые тормозят по правилу 10:90, и переписываем их на Си. Смотри историю развития ВКонтакте, Facebook и прочих;
- Не стоит также забывать, что обычных, не хайлоад проектов, в мире очень много — всяких там бложиков, небольших интернет-магазинов и форумов. Кроме того, даже в хайлоаде может быть какой-то генератор статики или веб-админка, которой одновременно никогда не пользуется больше десяти человек;
- Кстати, по поводу хайлоада. Если Reddit подходит Python, GitHub’у подходит Ruby, а Facebook’у подходит PHP, то и вашему хайлоуду наверняка подойдет Python. Дело в том, что в типичном хайлоаде почти все время обработки запроса тратится на посылку запросов к кэшам и базам данных, и не имеет большого значения, на Python вы пишите или на чистом Си. Если перед приложением поставить Nginx или lighttpd, то вы без проблем сможете держать 10 000+ одновременных соединений. Польза же от легковесных процессов, как в Go или Erlang, становится не очень большой. Например, потому что количество потоков, реально работающих параллельно, ограничивается числом соединений, которое может держать РСУБД;
- Во многих приложениях (игровых движках, отладчиках, текстовых редакторах, …) часто нужен какой-то встраиваемых язык, чтобы пользователь мог описать некую кастомную логику;
- То, что исходники скриптов всегда видны, может быть важно с точки зрения безопасности. Хорошо знать, что устанавливаемое приложение не делает чего-нибудь лишнего. Ведь совсем не факт, что всякий бинарный пакет собран из тех же исходников, что лежат на GitHub;
Почему же на мой взгляд для таких задач идеально подходит Python и в меньше степени подходит Perl или, скажем, Ruby:
Сравнение Python и JavaScript. Что учить новичку?
- Простой, единообразный, строгий синтаксис. Код либо отформатирован правильно, либо не запускается. При работе в коллективе из нескольких человек это действительно здорово. В отношении Perl и Ruby это не так;
- Предельно низкий порог вхождения, вполне себе боевой код можно начать писать за считанные часы;
- Огромное сообщество пользователей, а следовательно куча книг, куча ответов на StackOverflow, и так далее;
- Большая коллекция готовых библиотек практически на все случаи жизни. Многие библиотеки, такие, как Matplotlib, NumPy, SciPy, SymPy, NLTK, а также TensorFlow, Keras и PyTorch не имеют достойных аналогов в других языках, как скриптовых, так и компилируемых;
- Строгаядинамическая типизация. В Perl она нестрогая, то есть числа можно складывать со строками, что по моему опыту сильно усложняет поддержку кода;
- Сборка мусора не на подсчете ссылок, но и с полноценным GC для циклических ссылок. В Perl есть только подсчет ссылок;
- Все не примитивные типы передаются по ссылке, как в Java, что делает код намного более читаемым. В Perl нужно отличать данные от ссылок на данные;
- Есть возможность JIT-компиляции — PyPy, разрабатываемый в Dropbox’е Pyston, плюс Jython для компиляции под JVM. Аналогов для Perl мне не известно. Для Ruby JIT вроде есть, но мне неизвестно, в каком состоянии находятся эти проекты;
- Для Python существует мощная и бесплатная IDE — PyCharm. Кроме того, есть замечательный плагин к Sublime Text — Anaconda. Для Perl, насколько я знаю, полноценной IDE до сих пор не существует. Для Ruby есть RubyMine, но она распространяется только за деньги;
- В отличие от Perl из коробки есть поддержка работы с большими числами, с комплексными числами, есть нормальный ООП, нормальная многопоточность (с точностью до GIL в CPython; кстати, по большому счету наличие или отсутствие GIL определяет лишь то, какие приложения на языке будут работать быстрее, многопроцессные или многопоточные), нормальные исключения, нормальный boolean, контейнер set, не говоря уже о нормальной передаче аргументов функциям, REPL, генераторах (которые с ключевым словом yield), кортежах, генераторах списков, и пусть простом, но все-таки pattern matching’е;
- Есть type hints, которые сильно упрощают чтение кода. Плюс есть реализация gradual typing в лице MyPy;
- Есть много вакансий. Притом, есть основания полагать, что в соответствующих проектах не слишком сильный легаси, что не справедливо в отношении Perl. Плюс есть некое разнообразие в решаемых задачах. Ruby же практически всегда означает Ruby on Rails;
- Куча саксесс сторис (Google, Yahoo, Яндекс, Mail.ru, Dropbox, Bitbucket, Disqus, …) и известных проектов (Graphite, Mercurial, SCons, Meson, Ansible, Trac, Mailman, MoinMoin, Pelican, …). Кроме того, Python используется в Sublime Text, GNU Radio, Radare2, Hopper, bcc/eBPF, KiCad, Sigrok, FreeCAD и ряде других проектов в качестве встраиваемого языка;
Резюмируя вышесказанное — по сравнению с Perl язык Python по очень многим параметрам лучше просто в техническом плане. Также с уверенностью можно сказать, что Ruby не лучше Python. При этом то, что для Python есть бесплатная IDE от JetBrains, а также что ни в каких Яндексах с Mail.ru нет открытых вакансий для программистов на Ruby, сыграли решающую роль.
К тому же, за всю жизнь я не написал ни одной строчки на Ruby, а Python как-никак когда-то приходилось немного трогать. Варианты же с JavaScript, PHP, Lua, TCL и прочими я не особо рассматривал. Под Linux из коробки нет соответствующих интерпретаторов, а root на машине не всегда имеется. И вообще, в мире *nix систем на этих языках не принято писать скрипты. Нельзя полностью исключать культурный фактор!
Идея с написанием скриптов на Scala была отвергнута по теме же соображением, плюс скрипты на Scala имеют такой недостаток, что они секунд 5 только запускаются, и лишь потом начинают делать что-то действительно полезное.
В заключение хотелось бы поделиться некоторыми поделками, которые я написал в процессе изучения (скорее даже вспоминания) Python.
Генератор шоунотов (см аналоги на Go, Rust и Kotlin):
import re
import sys
import urllib3
import threading
import queue
if len ( sys . argv ) < 2 :
print ( «Usage: » + sys . argv [ 0 ] + » input.txt [workersnum=8]» )
sys . exit ( 1 )
fname = sys . argv [ 1 ]
http = urllib3 . PoolManager ( )
taskq = queue . Queue ( )
resultq = queue . Queue ( )
taskdonelock = threading . Lock ( )
tasksdone = 0
taskstotal = 0
workersnum = 8
if len ( sys . argv ) >= 3 :
workersnum = int ( sys . argv [ 2 ] )
def worker ( ) :
while True :
task = taskq. get ( )
if task is None :
break
( tasknum , line ) = task
result = ( tasknum , process_line ( line ) )
resultq. put ( result )
def process_line ( line ) :
global tasksdone
m = re . search ( «»»(?i)(https? S +)»»» , line )
url = m. group ( 1 )
title = «[NO TITLE]»
try :
res = http. request ( ‘GET’ , url )
body = res. data . decode ( ‘utf-8’ )
m = re . search ( «(?is)(.*?)» , body )
title = m. group ( 1 ) . strip ( )
title = re . sub ( r ‘ s +’ , ‘ ‘ , title )
except KeyboardInterrupt :
raise
except Exception as e:
title = «[FAILED: » + str ( e ) + «]»
tasknum = — 1
with taskdonelock:
tasksdone + = 1
tasknum = tasksdone
with open ( fname ) as f:
for line in f:
task = ( taskstotal , line )
taskq. put ( task )
taskstotal + = 1
for _ in range ( 0 , workersnum ) :
taskq. put ( None )
thread = threading . Thread ( target = worker )
thread . start ( )
results = list ( range ( 0 , taskstotal ) )
for _ in range ( 0 , taskstotal ) :
( i , res ) = resultq. get ( )
results [ i ] = res
-
» )
for res in results:
print ( res )
print ( »
Заливка картинок на ImageShack (аналог на Perl):
import re
import sys
import urllib3
import random
import os . path
if len ( sys . argv ) < 2 :
print ( «Usage: » + sys . argv [ 0 ] + » » )
sys . exit ( 1 )
fname = sys . argv [ 1 ]
url = ‘http://imageshack.us/upload_api.php’
http = urllib3 . PoolManager ( )
data = None
with open ( fname , «rb» ) as f:
data = f. read ( )
basename = os . path . basename ( fname )
fields = {
«key» : «015EFMNVfe7f6f7e93cb4a7b0a41e19956ce59f8» ,
«Filedata» : ( basename , data )
}
res = http. request ( ‘POST’ , url , fields )
body = res. data . decode ( ‘utf-8’ )
m = re . search ( «(?is)(.*?)» , body )
url = m. group ( 1 ) . strip ( )
print ( url )
Заливалка текстовых файлов на PasteBin (тут более подробно про requests):
import re
import sys
import requests
if len ( sys . argv ) < 2 :
print ( «Usage: » + sys . argv [ 0 ] + » » )
sys . exit ( 1 )
fname = sys . argv [ 1 ]
base_url = ‘http://pastebin.com’
post_url = base_url + ‘/post.php’
headers = { }
headers [ ‘user-agent’ ] = u ‘Mozilla/5.0 (compatible; MSIE 9.0; ‘ +
u ‘Windows NT 6.0; Trident/5.0; Trident/5.0)’
res = requests . get ( base_url , headers = headers )
body = res. text
m = re . search ( «»»(?is)name=»csrf_token_post» value=»(.*?)»>»»» , body )
token = m. group ( 1 ) . strip ( )
cookies = {
«__cfduid» : res. cookies . get ( ‘__cfduid’ ) ,
«PHPSESSID» : res. cookies . get ( ‘PHPSESSID’ )
}
Теперь, чтобы найти справку для конкретной команды, просто введите эту команду, например, чтобы найти справку для команды print , просто введите print и нажмите клавишу enter. Результат будет выглядеть так:
Help on built-in function print in module builtins: print(. ) print(value, . sep=’ ‘, end=’n’, file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream.
Как показано в приведенном выше выводе, утилита help вернула полезную информацию о команде print, включая то, что делает команда и какие аргументы могут быть использованы с ней.
Чтобы выйти из справки, введите q для “quit”, а затем нажмите клавишу enter. Вы вернетесь в оболочку Питона.
Плюсы и минусы интерактивного режима
Ниже приведены преимущества запуска кода в интерактивном режиме:
- Полезно, когда ваш сценарий очень короткий и вы хотите немедленных результатов.
- Быстрее, так как вам нужно только ввести команду, а затем нажать клавишу enter, чтобы получить результаты.
- Хорошо подходит для начинающих, которым нужно понять основы Python.
Ниже перечислены недостатки запуска кода в интерактивном режиме:
- Редактирование кода в интерактивном режиме затруднено, так как вам придется вернуться к предыдущим командам или переписать всю команду заново.
- Очень утомительно запускать длинные фрагменты кода.
Далее мы обсудим режим скрипта.
Режим скрипта
Если вам нужно написать длинный фрагмент кода Python или ваш скрипт Python охватывает несколько файлов, интерактивный режим не рекомендуется. В таких случаях лучше всего использовать режим скрипта. В режиме скрипта вы записываете свой код в текстовый файл, а затем сохраняете его с расширением .py , которое расшифровывается как “Python”. Обратите внимание, что для этого можно использовать любой текстовый редактор, включая Sublime, Atom, notepad++ и т. Д.
Если вы находитесь в стандартной оболочке Python, вы можете нажать кнопку “Файл”, а затем выбрать “Создать” или просто нажать “Ctrl + N” на клавиатуре, чтобы открыть пустой скрипт, в котором вы можете написать свой код. Затем вы можете нажать “Ctrl + S”, чтобы сохранить его.
После написания кода вы можете запустить его, нажав кнопку “Выполнить”, затем “Запустить модуль” или просто нажать клавишу F5.
Давайте создадим новый файл из оболочки Python и дадим ему имя “hello.py”. Нам нужно запустить программу “Привет, мир”. Добавьте в файл следующий код:
print(«Hello World»)
Нажмите кнопку “Выполнить”, затем выберите “Запустить модуль”. Это позволит запустить программу:
Hello World
Помимо выполнения программы из графического интерфейса пользователя, мы можем сделать это из терминала операционной системы. Однако вы должны знать путь к каталогу, в котором вы сохранили файл.
Откройте терминал вашей операционной системы, а затем перейдите к местоположению файла. Конечно, для этого вы будете использовать команду “cd (change directory)”.
Как только вы доберетесь до каталога с файлом, вам нужно будет вызвать интерпретатор Python для этого файла. Это можно сделать с помощью следующего синтаксиса:
> python
Чтобы запустить файл Python из терминала, вам просто нужно ввести ключевое слово python , за которым следует имя файла. В нашем случае нам нужно запустить файл с именем “hello.py”. Нам нужно набрать следующее на терминале операционной системы:
> python hello.py Hello World
Если вы хотите получить доступ к оболочке Python после получения выходных данных, добавьте в команду параметр -i . Это показано ниже:
> hello -i hello.py Hello World
В следующем примере показано, как выполнить несколько строк кода с помощью скрипта Python.
name = «Nicholas» age = 26 course = «Computer Science» print(«My name is», name, «,aged», age, «,taking», course)
Плюсы и минусы скриптового режима
Ниже приведены преимущества запуска кода в режиме скрипта:
- Легко запускать большие куски кода.
- Редактировать сценарий проще в режиме сценария.
- Хорошо подходит как для начинающих, так и для экспертов.
Ниже приведены недостатки использования скриптового режима:
- Может быть утомительно, когда вам нужно запустить только одну или несколько строк трески.
- Перед выполнением кода необходимо создать и сохранить файл.
Ключевые различия между Интерактивным и Скриптовым Режимами
Вот основные различия между программированием в интерактивном режиме и программированием в скриптовом режиме:
- В режиме скрипта файл должен быть создан и сохранен перед выполнением кода, чтобы получить результаты. В интерактивном режиме результат возвращается сразу после нажатия клавиши enter.
- В режиме скрипта вам предоставляется прямой способ редактирования кода. В интерактивном режиме это невозможно.
Вывод
Существует два режима, с помощью которых мы можем создавать и запускать скрипты Python: интерактивный режим и режим скрипта. Интерактивный режим включает в себя запуск ваших кодов непосредственно на оболочке Python, доступ к которой можно получить из терминала операционной системы. В режиме скрипта вы должны создать файл, дать ему имя с расширением .py , а затем запустить свой код. Интерактивный режим подходит для запуска нескольких строк кода. Режим скрипта рекомендуется использовать при создании больших приложений.
Читайте ещё по теме:
- Серия Фибоначчи в Python и программа чисел Фибоначчи
- Вычисление среднего, медианы и режима в Python
- Python Programming Challenge – Проверка номера ISBN-10
- Как выучить Python 3 с нуля | Руководство для начинающих
- Node.js VS Python: Что лучше?
- Python: рекурсивная функция трассировки
- Почему Уоррен Баффет будет инвестировать в PHP (и вы тоже должны)
- Метки mode, programming, python
Источник: pythobyte.com