Python Основы
Введение
Python, произностися как Пайтон, в русском языке распространено название Питон
— высокоуровневый язык программирования общего назначения, ориентированный на
повышение производительности разработчика и читаемости кода.
Синтаксис ядра Python минималистичен. В то же время стандартная библиотека
включает большой объём полезных функций.
Python поддерживает структурное, объектно-ориентированное, функциональное,
императивное и аспектно-ориентированное программирование.
Основные архитектурные черты — динамическая типизация, автоматическое управление
памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных
вычислений, высокоуровневые структуры данных.
Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.
Эталонной реализацией Python является интерпретатор CPython, поддерживающий
большинство активно используемых платформ.
Он распространяется под свободной лицензией Python Software Foundation License,
позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.
Есть реализация интерпретатора для JVM с возможностью компиляции, CLR, LLVM,
другие независимые реализации. Проект PyPy использует JIT-компиляцию, которая
значительно увеличивает скорость выполнения Python-программ.
Python — активно развивающийся язык программирования, новые версии с
добавлением/изменением языковых свойств выходят примерно раз в два
с половиной года.
Язык не подвергался официальной стандартизации, роль
стандарта де-факто выполняет CPython, разрабатываемый под контролем автора языка.
В настоящий момент (апрель 2021)
Python занимает третье место в рейтинге TIOBE с показателем 11,03%.
Аналитики отмечают, что это самый высокий балл Python за все время его присутствия в
рейтинге.
Посмотреть текущий рейтинг можно
здесь
Hello World!
Инструкция по запуску первой программы в Python
Убедитесь, что Python установлен и команда
python -V
Показывает версию Python, например
Python 3.9.1
Если вы работаете в Linux, UNIX или Bash в Windows перейдите в свою домашнюю директорию
В Linux
cd ~
В Windows
cd /mnt/c/Users/username
Создайте директорию python
mkdir python
Перейдите в неё, создайте файл hello_world.py и откройте его любым тестовым редактором
cd python
touch hello_world.py
vi hello_world.py
Вставьте туда следующий код
print("Hello World!")
Выполните
python hello_world.py
В терминале должно появиться сообщение
Hello World!
Больше деталей о запуске скриптов вы можете найти в следующем параграфе - «Запуск Python скрипта» и затем в if __name__ == "__main__":
Запуск скрипта
Чтобы запустить .py скрипт введите
python имя_файла.py
Результат такого запуска зависит от того, что указано после if __name__ == "__main__": если это условие вообще есть
print("Hello!")
python sample.py
Hello!
Теперь то же самое но в функции
def say_hello(): print("Hello!")
python sample.py
Ничего не произошло потому что функцию никто не вызвал
Можно добавить вызов функции следующим образом
def say_hello(): print("Hello!") say_hello()
python sample.py
Hello!
В этом случае функция будет вызываться всегда - как при запуске скрипта из терминала так и при импорте в другой модуль настроить это поведение можно с помощью переменной __name__ а точнее - с помощью условия if __name__ == "__main__":
Отступы (indentation)
Python не является языком поддерживающим свободный формат. Блоки кода не
разделяются с помощью { }
Вместо этого блоки разделяются отступами по так называемому правилу оффсайда (Off-side rule)
Демонстрация
Рассмотрим файл for_loop.py
for i in range(1,4):print(i)
python for_loop.py
1
2
3
Всё работает прекрасно. Обратите внимание, что выведены были только i от 1 до 3. 4 python не вывел.
Если написать код не в одну строку, а следующим образом
for i in range(1,4):
print(i)
то работать код не будет. Получится ошибка
File "/home/andrei/python/for_loop.py", line 2 print(i) ^ IndentationError: expected an indented block
Поэтому нужно поставить перед print пробел
for i in range(1,3):
print(i)
python for_loop.py
1
2
3
Вместо одного пробела можно поставить табуляцию, но лучше поставить два или четыре пробела подряд.
PEP8 - документ, в котором собраны рекомендации по написанию Python кода говорит:
Use 4 spaces per indentation level
САМОЕ ВАЖНОЕ: Нельзя смешивать в одном файле отступы в виде табуляций и в виде пробелов. Выберите один стиль и придерживайтесь его.
Про то как правильно переносить слишком длинные строки можете прочитать здесь
Арифметика
/ - деление. Результат - число с плавающей точкой
>>> 5 / 2
2.5
// - целочисленное деление. Результат - округлённое до целого числа частное.
>>> 5 // 2
2
% - остаток от деления. Результат - остаток от //
>>> 5 % 2
1
Больше или равно >=
Печать спецсимволов HTML
Скрипт, с помощью которого можно распечатать определённое число спецсимволов HTML
for i in range(100001,125000):
print "<tr><td>&#",i,";</td><td>&#",i,";</td></tr>"
Ссылки
Psyco
Shedskin
PyPy
Cython
Jython
IronPython
IDLE
Синтаксис
Set в фигурных скобках. Элемент добавляется с помощью .add()
if __name__ == '__main__'
__name__ это атрибут. Прочитать про предопределённые атрибуты можно
здесь
другим примером атрибута файла является
__file__
Чтобы разобраться в смысле этой строки создадим два файла.
first_module.py
и
second_module.py
В первом напишем
print(f"Имя первого модуля: {__name__}")
# Если не любите f-string напишите:
print("Имя первого модуля: {}".format(__name__))
Запустим его
python3 first_module.py
Имя первого модуля: __main__
Во втором запишем
import first_module
Запустим его
python3 second_module.py
Имя первого модуля: __first_module__
Вывод: когда модуль запущен непосредственно, его __name__ это __main__
Когда модуль импортирован в другой модуль, его __name__ это __название_py_файла__
Теперь когда все ясно, можно добавить в наш код условие if __name__ == "__main__"
def say_hello(): print("Hello!") def display_name(): print(f"Имя первого модуля: {__name__}") if __name__ == "__main__": say_hello()
Hello!
Или
def say_hello(): print("Hello!") def display_name(): print(f"Имя первого модуля: {__name__}") if __name__ == "__main__": display_name()
Имя первого модуля: __main__
Суть в том, что теперь мы определяем что будет выполняться при вызове этого скрипта а что нет.
__file__
Из официальной документации мы знаем, что __file__ это
The pathname of the file from which the module was loaded, if it was loaded from a file. The __file__ attribute may be missing for certain types of modules, such as C modules that are statically linked into the interpreter. For extension modules loaded dynamically from a shared library, it’s the pathname of the shared library file.
Типичное применение - вместе с os.path.dirname()
file_path = os.path.join(os.path.dirname(__file__), filename)
Пакеты Python в Linux
Узнать сколько всего python3 пакетов в репозитории Ubuntu
apt-cache search python3 | wc -l
3472
Изучить их названия можно с помощью less
apt-cache search python3 | less
alembic - lightweight database migration tool for SQLAlchemy
brltty - Access software for a blind person using a braille display
debian-goodies - Small toolbox-style utilities for Debian systems
devscripts - scripts to make the life of a Debian Package maintainer easier
libcrack2-dev - pro-active password checker library - development files
…
Проверить, существует ли файл hosts
#!/usr/bin/python3
import os.path
if os.path.exists("/etc/hosts"):
print("hosts file exists")
else:
print("no hosts file")
или
#!/usr/bin/python3
try:
f = open('/etc/hosts')
print("hosts file exists")
except FileNotFoundError:
print("no hosts file")
python3 check_hosts.py
hosts file exists
Shebang
Указывает на нужный интерпретатор. Примеры:
#!/usr/bin/env python
#!/home/andrei/.pyenv/shims/python
После написаний шебанга нужно сделать скрипт выполняемым файлом
chmod + x имя_скрипта.py
И теперь его можно запускать прямо из терминала
./имя_скрипта.py
Или
.\имя_скрипта.py
Если вы пользуетесь
PowerShell
В
Windows
запускать Python скрипты помогает Pylauncher
(см.
PEP 397
)
Scopes
Local - внутри функции
Enclosing - внутри фукнции, которая вызвала функцию
Global - во всем модуле
Built-in - встроено в Python
LEGB
Ссылки на Local уничтожаются после выполнения функции
Рассмотрим функцию fetch_words()
из статьи про
docstring
url, story, story_words, line, line_words, word - это локальные переменные
def fetch_words(url): """Fetch a list of words from a URL. Args: url: The URL of a UTF-8 text document. Returns: A list of strings containing the words from the document """ # PEP 257 # story = urlopen("http://sixty-north.com/c/t.txt") story = urlopen(url) story_words = [] for line in story: line_words = line.decode("utf8").split() for word in line_words: story_words.append(word) story.close() return story_words def print_items(story_words): """Print items one per line. Args: An iterable series of printable items. """ for word in story_words: print(word) def main(url): words = fetch_words(url) print_items(words) if __name__ == "__main__": main(sys.argv[1])
Разберем поведение глобальных переменных
count = 0 def show_count(): print(count) def set_count(c): count = c show_count() # 0 set_count(5) show_count() # 0
0 0
Изменить поведение функции можно с помощью global
count = 0 def show_count(): print(count) def set_count(c): global count count = c show_count() # 0 set_count(5) # Now affects global variable show_count() # 5
0 5
Полезные ссылки
codingbat.com
projecteuler.net
codeabbey
reddit
pythonchallenge
Указание кодировки
uuid
Пример создания строки из uuid
import uuid def str_uuid(): return str(uuid.uuid4()) print("name" + str_uuid()) print("name" + str_uuid()) print("name" + str_uuid()) print("name" + str_uuid()) print("name" + str_uuid())
name8873e1d2-b3c2-497a-952d-89bd3a658edc name4168f752-c676-4740-a12a-b7f7cd07fd2d namebf2e4954-644d-4c6e-be41-de9c3c2809b8 named53dbef3-b798-4af4-a3be-61ad349eac30 name79765d36-cb5c-4514-b6c7-3f9c5779e44a
Про uuidgen можете прочитать здесь
Основы Python | |
configparser | |
docstring | |
#!: Shebang | |
Объекты | |
Итерация | |
os | |
pathlib |