Python, начало

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

Должен сразу предупредить, что у меня был уже достаточно наработанные навыки по программированию на этом языке. Сейчас они ограничиваются знанием нескольких сторонних библиотек (на подобие Pandas, Numpy, Flask) и практикой решения задач на CodeWars (https://www.codewars.com/) . Для того, чтобы достичь более-менее хороших навыков владения языком, мне потребовалось решить не менее 500 задач разного уровня сложности.

Дальше я понял, что хорошая практика - это конечно хорошо, но тот факт, что мои знания не систематизированы вызывало некую озадаченность. Поэтому я задал себе вполне резонный и закономерный вопрос: «Как мне всё это можно систематизировать?»

На этот запрос гугл выдал весьма лаконичный результат - книги. Прекрасно! Книги - это такой источник знаний, который позволяет дать не только систему, но и теорию.

Я полез на YouTube и сразу почти первым результатом выскочила книга Марка Лутца «Изучаем Python».

Python, начало

Хорошо, подумал я. Видно, что книга толстая и это круто, ведь это то, что мне и нужно было. Но одно дело книга, а другое - содержимое. Таким образом посмотрел следующий ролик

В общем спасибо автору за качественную рецензию! Теперь я знаю, что читать.

В кратце скажу, что данная книга НЕ для новичков. Я полностью разделяю мнение автора этого ролика. Однако имея небольшой опыт программирования, эту книгу должен прочитать каждый. Она описывает практики и шаблоны, применяя которые можно улучшить качество кода а также систематизировать УЖЕ ИМЕЮЩИЕСЯ знания.

На текущий момент у меня на руках русская версия этой книги. Она есть как в свободном доступе, так и на Ozon. Однако я предпочитаю печатную версию книги, по той простой причине, что в таком виде мне легче её разобрать. Два тома обошлись в кругленькую сумму - 7500 рублей.

Ниже я напишу преимущества и недостатки.

Преимущества

1) Устаревшая версия

2) Средний перевод

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

Здесь будут представлены блоки реализации программного кода, которые я редко использовал в процессе практики на CodeWars.

Я очень надеюсь, что они сохранятся в моей голове и я уже в дальнейшем могу использовать их на реальном коде. Приступаю…

Введение в типы объектов в Python

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

Итак, из чего состоят программы:

1) Модули. В любой программе они описываются в начале документа. Примером модуля может являться импорт сторонней библиотеки, внутренней библиотеки и файла с самописным кодом.

import pandas as pd from math impot pi import numpy as np .... import mycode

2) Модули содержат операторы. По сути своей операторы соответствуют понятию переменные. Очень важно понимать как именуются переменные. На днях я писал статью на хабре ( https://habr.com/ru/post/683956/), где как раз указана информация о том, как надо правильно именовать переменные. Данная статья вызвала вал критики. Но факт есть факт. Операторы (как и переменные) надо именовать. Маленький пример:

PersonId = 3 NextPersonId = PersonId+1

3) Операторы содержат выражения. По сути своей выражение - это блок кода, который выполняется для вычисления значений или операторов.

numbers = [] for i in range(1,3): numbers.append(i) print(numbers) #[1, 2]

4) Выражения обрабатывают объект. Вообще объект - это основа Python. В данном языке всё состоит из объектов. Так что привыкайте к правильному именованию переменных :). Особенно когда речь идёт о классах.

В Python любой объект состоит из типов. Из всего многообразия типов я, например не знал, что к типам относят не только строки, числа, множества, словари и списки , кортежи но и файлы, модули, классы, структурированный код. Так что на собеседовании надо быть внимательным, когда задают вопрос про типы.

И теперь чуть-чуть про типы.

Числа

Числа - это представление объектов в виде цифр. В общем виде отображать числа в Python просто. Здесь они описываются в виде целых типов или типов с плавающей точкой.

integerNumber = 2 floatingNumber = 2.5 print(integerNumber+floatingNumber) #4.5

Как видно из примера, целые не содержат точки, а с плавающей точкой содержат точку. Звучит как масло-масленое, но что есть, то есть.

Другие примеры

import math print('%.2f'% (math.pi)) # 3.14 print('%.2f'% (math.pi*2)) # 6.28

Здесь пример сложнее. Самая первая строка импортирует встроенный модуль math. Если что, он представляет набор функций и переменных с помощью которых можно вычислять базовые математические значения. Считается, что хорошей практикой является чтение документации. Слава Богу, я знаю английский и подобрать примеры для вас не составляет большого труда. В случае чего базу можно найти здесь https://docs.python.org/3/library/math.html

Однако, если так случится, что я не смогу туда добраться. Вдруг против меня введут санкции, то можно воспользоваться встроенной функцией dir() и help()

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

print(dir(math))

Выведет

['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
print(help(math.pi))

Выведет

Help on float object: class float(object) | float(x=0, /) | | Convert a string or number to a floating point number, if possible. | | Methods defined here: |

Иными славами, dir() выводит список методов, а help() - справочную информацию.

Строки

Строки необходимы для тестовых данных. Здесь Марк Лутц говорит об объявлении строки, подсчёте количества символов, индексах и срезах. Базовые знания о строках я имею, поэтому заострять внимание на них не буду. Однако добавлю, что они поддерживают специфичные методы и форматирование. Пример форматирования оставлю здесь

NewSentence = '%s, eggs and %s' % ('spam', 'SPAM') print(NewSentence) #spam, eggs and SPAM

Этот пример очень важный при работе с базой данных. Именно таким образом надо осуществлять вставку в многие реляционные БД. Вместе с этим хорошей популярностью пользуются f-строки. Они не описываются в книге, но в CodeWars я их использую часто.

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

Какие типы данных являются неизменяемыми?

Ответ: помимо вышеизложенных ещё кортежи и bytearray

А какие изменяемые?

Ответ: списки, словари, множества

Строки Unicode

Вот тут я бы возможно пролетел. Не знаю, правда на сколько данная тема важна, но шпаргалку всё-таки оставлю.

Что же такое Unicode?

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

Далее примеры:

print('sp\xc4m') # spÄm - текст Unicode print(b'a\x01c') # b'a\x01c' - флаг b (байтовое представление строки) print(u'sp\u00c4m') # spÄm - флаг u (соответствует Unicode)

Кодировка и декодирование:

WordTo8 = 'spam'.encode('utf8') # 4 байта в файлах b'spam' WordTo16 = 'spam'.encode('utf16') # 16 байтов в файлах b'\xff\xfes\x00p\x00a\x00m\x00' print(WordTo8.decode('utf8')) #spam print(WordTo16.decode('utf-16le')) #spam

То, что я привожу - это игровой пример, но вдруг где-то пригодится.

Сопоставление с образцом

Здесь автор ссылается на регулярные выражения. Подробнее о них я остановлюсь в другой статье

Списки

Списки - основа Python. И это действительно так. Вместе с этим они представляют собой изменяемый набор последовательности. Я не буду останавливаться на этом типе данных, поскольку их часто применял на CodeWars. Единственное оставлю форму объявления списка

Names = ['Ben', 'Pen', 'Den'] # ['Ben', 'Pen', 'Den'] NamesList = list('Ben') # ['B', 'e', 'n']

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

Что умеют списки?

  1. Срезы (только в пределах списка!)
  2. Добавлять элементы, удалять элементы, изменять элементы
  3. Вложение элементов
  4. Использовать списковые включения (list comprehencions)
  5. Вложенные функции (с помощью map, и filter)
inneredList = [ [1,2,3], [4,5,6], [7,8,9] ] print(inneredList) # очень круто, когда список создаётся как табуляция (тогда понятно сколько он содержит строк)

Словари

Словари как и списки являются одним из способов представления данных. Если я хочу детализировать данные, то словарь самая лучшая тема. Здесь я приведу различные способы создания словарей ( в том числе даже такие, о которых и знать не знал), если бы не стал читать Лутца.

FirstDict = {'food': 'Spam', 'quantity': 4, 'color': 'Pink'} #Знал SecondDict = dict(food='Spam', quantity=4, color='Pink') # Знал ThirdDict = dict(zip(['food', 'quantity', 'color']), zip(['Spam', 4, 'Pink'])) # Не знал

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

Как можно представлять вложенные словари:

rec = {'name': {'first': 'Bob', 'last': 'Smith'}, 'jobs': ['dev', 'mgr'], 'age': 40.5} print(rec) #{'name': {'first': 'Bob', 'last': 'Smith'}, 'jobs': ['dev', 'mgr'], 'age': 40.5}

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

Кортежи

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

a = (1,2, 3) print(a) #(1, 2, 3) print(type(a)) # <class 'tuple'>

Стоит обратить внимание, что в английском языке кортеж называется tuple. Поэтому не стоит пугаться, если не увидите в интерпретаторе kortezg ^-^)

Он поддерживает всего два метода. Среди них count() и index()

Кортежи я тоже часто использовал на CodeWars. Поэтому сильно много о них говорить не стану.

Файлы

Здесь я в первые столкнулся с тем, что файл это тип данных!

Формально он описывается с помощью этого выражения

f = open('dataone.txt', 'w') f.write('Hello\n') f.write('world\n') f.close()

Данный код создаёт файл и помещает в него Hello world.

Python, начало

С помощью файлов можно записывать , создавать, модифицировать и считывать данные.

С ними я поиграюсь в другой статье и уделю им много времени, так как я о них знал, но не игрался :)

Множества

Всё пошло из математики :) И множества тоже. По сути это ещё один тип данных. В основном я его использовал тогда, когда хотел вычленить уникальные значения в списке. Вот как это работает.

a = [2,3,4,5,5,6,7,8,8,8] setA = set(a) print(len(a), len(setA))

Очень частый приём, но я запишу его сюда, чтобы не забыть во время собеседования.

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

Классы

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

class Worker: def __init__(self, name, pay): self.name = name self.pay = pay def lastName(self): return self.name.split()[-1] def giveRaise(self, percent): self.pay *= (1.0 + percent) bob = Worker('Bob Smith', 5000) bob.giveRaise(1) bob.pay

Пока оставляю без комментариев.

Вот такое вот краткое введение в типы данных. Спасибо за чтение!

22
4 комментария

Вот интересно, сколько еще джуниорам и мидлам осталось?
Ну вот реально. GPT4 выходит в этом году.
Chatgpt многие уже видели.

Уже сегодня проще не учить Питон, а арбитражить его у паков и индусов условных, стоит любая задача копейки. И вот тут добавляется AI.

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

1

Возможно немного. Но тут стоит учесть что Python можно изучать не только для трудоустройства, а для себя. Иногда навык программирования очень может помочь в жизни. Он формирует определённый стиль мышления, а это помогает системно справиться с жизненными задачами.

Можно рис руками перебирать или вязать начать, говорят тоже помогает мозгу.

2