Фича f-строк, о которой вы не знали
Смотрите, вот обычная f-строка
>>> text = 'JUPI'
>>> print(f'{text}')
JUPI
Если я добавлю в нее
* двоеточие,
* символ-заполнитель,
* и укажу требуемую длину строки с помощью символа <
>>> print(f'{text:-<15}')
То не занятый текстом остаток строки будет заполнен выбранным символом:
JUPI-----------
Если указать длину строки через >, то можно заполнить строку с левой стороны:
>>> print(f'{text:->15}')
-----------JUPI
Напишите в комментариях, как заполнить строку с обоих сторон, чтобы получилось
-----JUPI------
Подсказка: можно поискать вот здесь
🐠
Смотрите, вот обычная f-строка
>>> text = 'JUPI'
>>> print(f'{text}')
JUPI
Если я добавлю в нее
* двоеточие,
* символ-заполнитель,
* и укажу требуемую длину строки с помощью символа <
>>> print(f'{text:-<15}')
То не занятый текстом остаток строки будет заполнен выбранным символом:
JUPI-----------
Если указать длину строки через >, то можно заполнить строку с левой стороны:
>>> print(f'{text:->15}')
-----------JUPI
Напишите в комментариях, как заполнить строку с обоих сторон, чтобы получилось
-----JUPI------
Подсказка: можно поискать вот здесь
🐠
Python Enhancement Proposals (PEPs)
PEP 498 – Literal String Interpolation | peps.python.org
Python supports multiple ways to format text strings. These include %-formatting 1, str.format() 2, and string.Template 3. Each of these methods have their advantages, but in addition have disadvantages that make them cumbersome to use in practice. This...
Что такое JSON?
JSON (JavaScript Object Notation) – это удобный для чтения человеком и машиной структурированный формат, который используют для обмена данными.
JSON представляет собой наборы пар «ключ: значение» и основан на базе синтаксиса объектов JavaScript. При этом JSON считается независимым от JavaScript, так как может использоваться с любым языком программирования.
История
Создатель формата JSON – Дуглас Крокфорд, американский программист, принимающий активное участие в развитии JavaScript. В 2001 году, во время работы в своей компании State Software он разработал стандарт JSON как аналог формата XML, который уже существовал в тот момент.
Дугласу нужна была технология, позволяющая передавать данные в приложение до загрузки начальной страницы браузера, но еще не было формата, который работал бы со всеми браузерами.
Самое первое сообщение JSON было отправлено в 2001 году. Вот как оно выглядело:
Это был html-документ, только небольшая часть которого напоминает современный JSON. Сначала этот формат был предназначен для языка JavaScript, но позже его стали использовать с другими языками программирования.
Через год Крокфорд купил домен JSON.org и опубликовал там синтаксис JSON с примерами реализации, и этот сайт до сих пор работает.
Какую задачу решает
JSON – это случай, когда простой и лаконичный формат вытеснил более сложный и функциональный. Поскольку JSON предназначен для передачи данных по сети, то важные его функции – это сериализация и десериализация.
Сериализация – это кодирование данных, превращение в серию байтов, их перенос в файл JSON с целью хранения или передачи по сети. Десериализация – обратный процесс распаковки данных.
JSON полезнее всего
- для создания приложений, взаимодействующих с браузером,
- там, где необходимо обмениваться информацией между серверами,
- и когда нужно передать структурированную информацию по сети.
Как выглядит JSON
JSON файл структурирован и состоит из пар ключ-значение:
Вот список типов данных, которые поддерживает JSON:
- Строка – несколько литералов, заключенных в кавычки.
- Число – целое или действительное.
- Массив – множество значений, заключенное в квадратные скобки.
- Логическое значение – true/false.
- Пустое значение – null.
Как работать с JSON
Сегодня в любом языке программирования есть встроенная библиотека или модуль для работы с JSON, и в Python тоже! Для начала работы достаточно подключить модуль json с помощью команды import:
Сериализовать данные (например, словарь data) можно с помощью метода dump:
При кодировании из Python в JSON данные меняют свой тип следующим образом:
Записать данные в строку можно, используя метод dumps(). Методы похожи, единственное отличие состоит в том, что вторым параметром не указывается файловый объект, так как на самом деле не происходит записи на диск. В файле с кодом все будет выглядеть подобным образом:
Чтобы десериализовать файл, можно использовать методы
Так же, как и при сериализации, происходит трансформация данных в характерный для языка программирования тип. При этом переход из JSON в Python не полностью аналогичен переходу из Python в JSON.
Итого
- JSON – это в первую очередь человекочитаемый формат.
- Используется для передачи данных по сети и для клиент-серверного взаимодействия.
- Важные функции – это сериализация и десериализация, которые осуществляются методами
JSON (JavaScript Object Notation) – это удобный для чтения человеком и машиной структурированный формат, который используют для обмена данными.
JSON представляет собой наборы пар «ключ: значение» и основан на базе синтаксиса объектов JavaScript. При этом JSON считается независимым от JavaScript, так как может использоваться с любым языком программирования.
История
Создатель формата JSON – Дуглас Крокфорд, американский программист, принимающий активное участие в развитии JavaScript. В 2001 году, во время работы в своей компании State Software он разработал стандарт JSON как аналог формата XML, который уже существовал в тот момент.
Дугласу нужна была технология, позволяющая передавать данные в приложение до загрузки начальной страницы браузера, но еще не было формата, который работал бы со всеми браузерами.
Самое первое сообщение JSON было отправлено в 2001 году. Вот как оно выглядело:
<html><head><script>
document.domain = 'fudco';
parent.session.receive({
to: "session",
do: "test",
text: "Hello world"
})
</script></head></html>
Это был html-документ, только небольшая часть которого напоминает современный JSON. Сначала этот формат был предназначен для языка JavaScript, но позже его стали использовать с другими языками программирования.
Через год Крокфорд купил домен JSON.org и опубликовал там синтаксис JSON с примерами реализации, и этот сайт до сих пор работает.
Какую задачу решает
JSON – это случай, когда простой и лаконичный формат вытеснил более сложный и функциональный. Поскольку JSON предназначен для передачи данных по сети, то важные его функции – это сериализация и десериализация.
Сериализация – это кодирование данных, превращение в серию байтов, их перенос в файл JSON с целью хранения или передачи по сети. Десериализация – обратный процесс распаковки данных.
JSON полезнее всего
- для создания приложений, взаимодействующих с браузером,
- там, где необходимо обмениваться информацией между серверами,
- и когда нужно передать структурированную информацию по сети.
Как выглядит JSON
JSON файл структурирован и состоит из пар ключ-значение:
{
"name": "John Smith",
"age": 35
}
Вот список типов данных, которые поддерживает JSON:
- Строка – несколько литералов, заключенных в кавычки.
- Число – целое или действительное.
- Массив – множество значений, заключенное в квадратные скобки.
- Логическое значение – true/false.
- Пустое значение – null.
Как работать с JSON
Сегодня в любом языке программирования есть встроенная библиотека или модуль для работы с JSON, и в Python тоже! Для начала работы достаточно подключить модуль json с помощью команды import:
import json
Сериализовать данные (например, словарь data) можно с помощью метода dump:
with open(“my_file.txt”, “w”) as file:
json.dump(data, file)
При кодировании из Python в JSON данные меняют свой тип следующим образом:
dict -> Object
list-> Array
tuple -> Array
str -> String
int -> Number
float -> Number
True / False -> true / false
None -> null
Записать данные в строку можно, используя метод dumps(). Методы похожи, единственное отличие состоит в том, что вторым параметром не указывается файловый объект, так как на самом деле не происходит записи на диск. В файле с кодом все будет выглядеть подобным образом:
data_string = json.dumps(data)
Чтобы десериализовать файл, можно использовать методы
load()
и loads()
:with open(“my_file.txt”, “r”) as file:
data = json.load(file)
Так же, как и при сериализации, происходит трансформация данных в характерный для языка программирования тип. При этом переход из JSON в Python не полностью аналогичен переходу из Python в JSON.
loads()
идентичен dumps()
, он также предназначен для работы со строкой.Итого
- JSON – это в первую очередь человекочитаемый формат.
- Используется для передачи данных по сети и для клиент-серверного взаимодействия.
- Важные функции – это сериализация и десериализация, которые осуществляются методами
dump()
и load()
.Все знают, что целочисленное деление округляет результат вниз. Например, если результат деления во float
5. / 3. = 1.66666667 то в целых числах он округлится вниз, а не к ближайшему целому: 5 // 3 = 1 А если результат отрицательный? - 5 // 3 = ?
5. / 3. = 1.66666667 то в целых числах он округлится вниз, а не к ближайшему целому: 5 // 3 = 1 А если результат отрицательный? - 5 // 3 = ?
Anonymous Quiz
8%
1
38%
-1
45%
-2
8%
Ошибка
Стек и очередь
Идеи стека и очереди часто встречаются в различных языках программирования. Давайте разберемся, в каких ситуациях их применение уместно и удобно программисту.
С очередями мы сталкиваемся практически везде. В магазине очередь – это группа людей, которые стоят друг за другом, например, на кассу с продуктами. Тот, кто стоит ближе к кассе, оплатит свои продукты первым.
В программировании очередь работает аналогично. Очередь в программировании — это коллекция элементов, которые обрабатываются по принципу «первый зашел — первый вышел» (FIFO).
Очередь прекрасно подходит к задачам, которые нужно делать поэтапно. Например, если пользователь загружает несколько изображений на сайт, чтобы сервер мог их обработать и сохранить, загружаемые файлы помещаются в очередь на обработку. И первый файл, который пользователь загрузил, будет первым обработан на сервере.
Стек работает по-другому. Стек – это тоже коллекция элементов, но работает он по принципу «последним зашел — первым вышел» (LIFO)
В повседневной жизни мы можем встретить аналогию, когда мы кладем документы друг на друга, а затем перебираем их, начиная с самого верхнего. Это похоже на работу со стеком: можно работать только с последним элементом, который попал в коллекцию.
Частое применение стека в программировании – это организация записей об изменениях в файле или документе. Текстовые редакторы обычно записывают действия пользователя над файлом с помощью стека, чтобы потом можно было легко отменить эти действия в обратном порядке.
При работе со стеком и очередью нельзя обращаться к произвольному элементу в коллекции, потому что это нарушило бы принципы LIFO или FIFO. Чтобы добраться до нужного элемента, необходимо перебрать все элементы стоящие перед или после него в списке по установленному порядку.
В программировании стек и очередь часто используют для математических вычислений, для работы с данными и операциями. Принципы FIFO и LIFO позволяют нам структурировать и упорядочивать работу с данными. Такой подход позволяет быть уверенными, что данные и операции будут обрабатываться в нужном порядке.
Идеи стека и очереди часто встречаются в различных языках программирования. Давайте разберемся, в каких ситуациях их применение уместно и удобно программисту.
С очередями мы сталкиваемся практически везде. В магазине очередь – это группа людей, которые стоят друг за другом, например, на кассу с продуктами. Тот, кто стоит ближе к кассе, оплатит свои продукты первым.
В программировании очередь работает аналогично. Очередь в программировании — это коллекция элементов, которые обрабатываются по принципу «первый зашел — первый вышел» (FIFO).
Очередь прекрасно подходит к задачам, которые нужно делать поэтапно. Например, если пользователь загружает несколько изображений на сайт, чтобы сервер мог их обработать и сохранить, загружаемые файлы помещаются в очередь на обработку. И первый файл, который пользователь загрузил, будет первым обработан на сервере.
Стек работает по-другому. Стек – это тоже коллекция элементов, но работает он по принципу «последним зашел — первым вышел» (LIFO)
В повседневной жизни мы можем встретить аналогию, когда мы кладем документы друг на друга, а затем перебираем их, начиная с самого верхнего. Это похоже на работу со стеком: можно работать только с последним элементом, который попал в коллекцию.
Частое применение стека в программировании – это организация записей об изменениях в файле или документе. Текстовые редакторы обычно записывают действия пользователя над файлом с помощью стека, чтобы потом можно было легко отменить эти действия в обратном порядке.
При работе со стеком и очередью нельзя обращаться к произвольному элементу в коллекции, потому что это нарушило бы принципы LIFO или FIFO. Чтобы добраться до нужного элемента, необходимо перебрать все элементы стоящие перед или после него в списке по установленному порядку.
В программировании стек и очередь часто используют для математических вычислений, для работы с данными и операциями. Принципы FIFO и LIFO позволяют нам структурировать и упорядочивать работу с данными. Такой подход позволяет быть уверенными, что данные и операции будут обрабатываться в нужном порядке.
Рассказали о разнице функций input и raw_input в Python2 в карточках. Читайте!
Карточки подготовили вместе с @pro_python_code
Карточки подготовили вместе с @pro_python_code
Что будет в результате?
Anonymous Quiz
42%
try clause + final clause
29%
try clause
3%
exception clause
26%
final clause
try, except, finally и оператор return в Python: как работает finally при наличии return
Python предоставляет механизм обработки исключений с помощью операторов
Но если внутри блока
Вот ещё раз пример кода из опроса:
Можно ожидать, что будет выведено 'try clause' и 'final clause', но фактически выводится только 'final clause'. Почему?
Документация Python объясняет такое поведение. При наличии блока
Вот еще один пример для лучшего понимания:
В этом случае можно ожидать, что будет выведено
Итак, при использовании оператора return внутри try/except/finally следует иметь в виду, что возвращаемое значение будет определено блоком
Дока: https://docs.python.org/3/tutorial/errors.html?highlight=try%20finally#defining-clean-up-actions
Python предоставляет механизм обработки исключений с помощью операторов
try
, except
и finally
. Когда внутри блока try
возникает исключение, оно может быть перехвачено и обработано в блоке except
. Кроме того, блок finally
позволяет выполнять нужные вам действия независимо от того, произошло исключение или нет. Но если внутри блока
finally
использовать оператор return
, как в примере выше, возникает особенность.Вот ещё раз пример кода из опроса:
def try_with_returns():
try:
return 'try clause'
except:
return 'exception clause'
finally:
return 'final clause'
print(try_with_returns())
Можно ожидать, что будет выведено 'try clause' и 'final clause', но фактически выводится только 'final clause'. Почему?
Документация Python объясняет такое поведение. При наличии блока
finally
, код внутри него должен быть выполнен в любом случае. Поэтому если блок finally
содержит return
, то возвращаемое значение будет именно то, которое указано внутри finally
, а не внутри try
, иначе до finally
поток исполнения просто не дойдет. Вот еще один пример для лучшего понимания:
def bool_return():
try:
return True
finally:
return False
print(bool_return())
В этом случае можно ожидать, что будет выведено
True
, но выводится False
. Это снова происходит из-за оператора return
в блоке finally
, который прерывает выполнение блока try
и возвращает значение False
.Итак, при использовании оператора return внутри try/except/finally следует иметь в виду, что возвращаемое значение будет определено блоком
finally
. И если finally
содержит оператор return
, то его значение будет возвращено вместо значения из блоков выше.Дока: https://docs.python.org/3/tutorial/errors.html?highlight=try%20finally#defining-clean-up-actions
Python documentation
8. Errors and Exceptions
Until now error messages haven’t been more than mentioned, but if you have tried out the examples you have probably seen some. There are (at least) two distinguishable kinds of errors: syntax error...
Вопрос от студента: как использовать в map функцию с параметром?
Все, кто сталкивался с
Или преобразовать все строки в верхнему регистру
А что делать в случае, если
и требуется округлить все числа до 1 знака после запятой, то есть, получить
В какое место надо написать параметр при использовании
Отвечаем. Просто так это сделать не получится! Для этого понадобятся lambda-функции.
В этом случае, чтобы округлить числа из списка до 1 знака после запятой, можно использовать следующий приём:
Здесь
Результатом будет новый список, содержащий округленные значения:
Таким образом, используя
Все, кто сталкивался с
map()
, знают, как использовать её, если параметры не нужны. Например, с map()
можно привести числа в списке к абсолютным значениям numbers = [-1, 2, -3, 4, -5]
absolute_values = list(map(abs, numbers))
print(absolute_values)
# [1, 2, 3, 4, 5]
Или преобразовать все строки в верхнему регистру
names = ["alice", "bob", "charlie", "david"]
print(list(map(str.upper, names)))
# ["ALICE", "BOB", "CHARLIE", "DAVID"]
А что делать в случае, если
map
нуждается в параметре? Например, есть список numbers = [0, 0.333, 0.667, 1]
и требуется округлить все числа до 1 знака после запятой, то есть, получить
[0, 0.3, 0.7, 1]
В какое место надо написать параметр при использовании
map()
?Отвечаем. Просто так это сделать не получится! Для этого понадобятся lambda-функции.
В этом случае, чтобы округлить числа из списка до 1 знака после запятой, можно использовать следующий приём:
a = [0, 0.333, 0.667, 1]
result = list(map(lambda x: round(x, 1), a))
Здесь
lambda x: round(x, 1)
создает анонимную функцию, которая принимает аргумент x
и вызывает функцию round()
с параметром 1
для округления числа x
до 1 знака после запятой. Затем map()
применяет эту анонимную функцию ко всем элементам списка.Результатом будет новый список, содержащий округленные значения:
[0, 0.3, 0.7, 1]
Таким образом, используя
map()
с анонимными функциями, можно применить функцию с параметром к элементам списка и получить нужный результат.Генератор кортежей
Генераторы списков — это конструкции вида
#
Чаще всего их используют для создания списков на лету. Но можно создавать и словари, если использовать фигурные скобки и пары значений, разделенных двоеточием:
Кортеж так создать не получится, потому что круглые скобки зарезервированы под генераторные выражения.
Но если все же хочется создать кортеж на лету именно этим способом, то можно вот так:
То есть, распаковываем и ставим запятую, чтобы обозначить, что это кортеж. Такие дела!
Генераторы списков — это конструкции вида
[x for x in range(5)]
#
[0, 1, 2, 3, 4]
Чаще всего их используют для создания списков на лету. Но можно создавать и словари, если использовать фигурные скобки и пары значений, разделенных двоеточием:
{n: n**2 for n in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Кортеж так создать не получится, потому что круглые скобки зарезервированы под генераторные выражения.
Но если все же хочется создать кортеж на лету именно этим способом, то можно вот так:
*(x for x in range(5)),
# (0, 1, 2, 3, 4)
То есть, распаковываем и ставим запятую, чтобы обозначить, что это кортеж. Такие дела!
Вау, в Python будет можно по желанию отключить GIL. В мейн буквально пару часов назад вмержили эту настройку
https://github.com/python/cpython/pull/116338
GIL (Global Interpreter Lock) — это механизм в CPython, который предотвращает одновременное выполнение нескольких потоков.
Это всю дорогу означало, что даже если мы пишем программу на Python как многопоточную, то в любой момент времени может выполняться только один тред.
С одной стороны, это ограничивало возможности параллельного выполнения кода даже на многоядерных процессорах. С другой, облегчало управление памятью в Python: такое решение исключает все особенности многопоточного программирования и делает проще работу программиста.
Наличие GIL годами было предметом дебатов и критики из-за ограничений на многопоточность. Я рада, что парадигма однопоточности Python наконец сдвигается: это реально изменит разработку на этом языке.
https://github.com/python/cpython/pull/116338
GIL (Global Interpreter Lock) — это механизм в CPython, который предотвращает одновременное выполнение нескольких потоков.
Это всю дорогу означало, что даже если мы пишем программу на Python как многопоточную, то в любой момент времени может выполняться только один тред.
С одной стороны, это ограничивало возможности параллельного выполнения кода даже на многоядерных процессорах. С другой, облегчало управление памятью в Python: такое решение исключает все особенности многопоточного программирования и делает проще работу программиста.
Наличие GIL годами было предметом дебатов и критики из-за ограничений на многопоточность. Я рада, что парадигма однопоточности Python наконец сдвигается: это реально изменит разработку на этом языке.
GitHub
gh-116167: Allow disabling the GIL with `PYTHON_GIL=0` or `-X gil=0` by swtaarrs · Pull Request #116338 · python/cpython
In free-threaded builds, running with PYTHON_GIL=0 or -X gil=0 will now disable the GIL. #116322 and #116329 track follow-up work to re-enable the GIL when loading an incompatible extension, and to...
Вы, наверное, знаете, что из-за того, что числа в памяти представлены в двоичной форме, в Python есть ошибка вида
В Python модуль
А вот кто скажет, почему возникает разница в примерах ниже?
1️⃣
2️⃣
Жду ваши ответы в комментариях!
print(0.1 + 0.2)
# 0.30000000000000004
В Python модуль
decimal
поддерживает точную арифметику десятичных чисел. Она важна в областях, требующих высокой точности, например, в финансах или научных расчетах.А вот кто скажет, почему возникает разница в примерах ниже?
1️⃣
from decimal import Decimal
a = Decimal(0.1)
b = Decimal(0.2)
print(a + b)
# 0.3000000000000000166533453694
2️⃣
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b)
# 0.3
Жду ваши ответы в комментариях!