Все знают, что
Offtop mode on
Если нет, дайте знать, расскажу в следующем посте.
Offtop mode off
А ещё каждому известно, что Python дружелюбен и готов простить строку import в середине кода.
Но есть страшная тайна о манипуляциях со временем, и путешествием в будущее, которое нельзя отложить на потом. 🤫
Да, вы верно догадались. Речь об импорте будущего. А если быть точным о:
Получим:
Как ни крути, а импортировать будущее можно лишь в начале пути.
И да, вопрос об использовании в Python точки с запятой вызывает споры среди неокрепших умов джуниоров и тех, кто привык к ним в Си-подобных языках.
Но что точно неоспоримо, так это отказ от фигурных скобок. Даже в далёком будущем и с импортом в начале файла:
нет и шанса на работу с фигурными скобками:
🤓
import принято писать в начале файла. И обычно все знают об особенностях сортировки импортов. Offtop mode on
Если нет, дайте знать, расскажу в следующем посте.
Offtop mode off
А ещё каждому известно, что Python дружелюбен и готов простить строку import в середине кода.
Но есть страшная тайна о манипуляциях со временем, и путешествием в будущее, которое нельзя отложить на потом. 🤫
Да, вы верно догадались. Речь об импорте будущего. А если быть точным о:
from __future__ import ...Получим:
SyntaxError: from __future__ imports must occur at the beginning of the fileКак ни крути, а импортировать будущее можно лишь в начале пути.
И да, вопрос об использовании в Python точки с запятой вызывает споры среди неокрепших умов джуниоров и тех, кто привык к ним в Си-подобных языках.
Но что точно неоспоримо, так это отказ от фигурных скобок. Даже в далёком будущем и с импортом в начале файла:
from __future__ import bracesнет и шанса на работу с фигурными скобками:
SyntaxError: not a chance🤓
👏7🤔2
Немного кода для чтения байт порциями 🍰
Если коротко, то открываем бинарный файл и считываем блоки байт фиксированного размера до конца файла.
А если подробнее, то:
- получаем указатель на файл, который открыли для чтения байт;
- в цикле функция
- функция
- цикл завершается когда
-
from functools import partial
BLOCK_SIZE = 64
path = '/home/user/bindata.bin'
with open(path, 'rb') as f:
for block in iter(partial(f.read, BLOCK_SIZE), b''):
print(block)
Если коротко, то открываем бинарный файл и считываем блоки байт фиксированного размера до конца файла.
А если подробнее, то:
- получаем указатель на файл, который открыли для чтения байт;
- в цикле функция
partial читает из файла блоки размером в BLOCK_SIZE байт;- функция
iter позволяет работать с полученными блоками в цикле, сохраняя их последовательно в переменную block;- цикл завершается когда
iter получает на вход пустой блок - b''. Он указан в качестве второго аргумента функции;-
print в примере для красоты. Не писать же тайный код, который обрабатывает бинарник. У каждого он свой 😉👍3🤔1
По (не)многочисленным просьбам немногочисленных подписчиков пост о сортировке импортов.
Открою секрет, никто их не сортирует. Всего лишь упорядочивают по правилу:
1. Модули из стандартной библиотеки
2. Модули из PyPI, он же Python Package Index, он же pip install ...
3. Свои модули
Между группами оставляют пустую строку. Внутри группы сначала идут import и import as. Далее from import и from import as.
Подобный стиль облегчает чтение кода коллег. Дайте знак-реакцию знали ли вы о подобных рекомендациях и используете ли эти знания 😉
P.S. Павел, персональный лайк 👍
Открою секрет, никто их не сортирует. Всего лишь упорядочивают по правилу:
1. Модули из стандартной библиотеки
2. Модули из PyPI, он же Python Package Index, он же pip install ...
3. Свои модули
Между группами оставляют пустую строку. Внутри группы сначала идут import и import as. Далее from import и from import as.
Подобный стиль облегчает чтение кода коллег. Дайте знак-реакцию знали ли вы о подобных рекомендациях и используете ли эти знания 😉
import random as rnd
from pprint import pprint
import requests
import numpy as np
from models import User
from best_package.best_module import best_func as bf
P.S. Павел, персональный лайк 👍
👍25🤔4👌1🤨1
Однажды подписчик канала прислал такой код 👨💻
главный закон вселенной принцип Don't Repeat Yourself (DRY) 😱
В такой ситуации стоит посылать всех к моржу 🦭
with open(path, 'rb') as f:Предполагаем, что константа и путь до файла определены выше. Но всё равно что-то тут не так. Мы используем в коде две одинаковые строки
block = f.read(BLOCK_SIZE)
while block:
print(block)
block = f.read(BLOCK_SIZE)
block = f.read(BLOCK_SIZE) и тем самым нарушаем В такой ситуации стоит посылать всех к моржу 🦭
BLOCK_SIZE = 64Моржовый оператор
path = '/home/user/bindata.bin'
with open(path, 'rb') as f:
while block := f.read(BLOCK_SIZE)
print(block)
👌6🥰1
py.png
527 B
16 октября 2000 года вышел Python 2.0
По сути это было очередное плановое обновление Python, но двухтысячный год добавил свои 2K нотки.
Всех, кто застал или не застал Py2K поздравляю с памятной датой. 🎂
P.S. На картинке иконка Py2K. О паре стилизованных змеек тогда никто и не думал. 😉
По сути это было очередное плановое обновление Python, но двухтысячный год добавил свои 2K нотки.
Всех, кто застал или не застал Py2K поздравляю с памятной датой. 🎂
P.S. На картинке иконка Py2K. О паре стилизованных змеек тогда никто и не думал. 😉
🎉10
После одного мема вспомнилась реальная история. Смешная и страшная одновременно. 😂😱
Итак, коллега по коду решил оценить асимптотику своего кода. Делал подобное он впервые. Поэтому с огромной гордостью заявил, что написал код обработки массива данных за константное время. Вау! Круто!
Далее выясняется, что это время равно 3.5 секундам, что на микромассиве из 10 элементов, что на массиве из 10_000. 🤔
Забегу вперёд, нобелевку ему не дали не смотря на верно работающий код. Почему? Замеры делались не верно. 😥
Коллега прикрутил input, чтобы вручную задавать параметры замеров. Но вместо того, чтобы передавать их в оцениваемый код, он прописал их внутри кода. 🤯
Как результат 3.5 секунды на ввод данных. Плюс 0.000002 секунды на обсчёт 10 элементов. Или плюс 0.002 на обсчёт 10к элементов.
Выводы делайте сами. Отличного дня 😉
Итак, коллега по коду решил оценить асимптотику своего кода. Делал подобное он впервые. Поэтому с огромной гордостью заявил, что написал код обработки массива данных за константное время. Вау! Круто!
Далее выясняется, что это время равно 3.5 секундам, что на микромассиве из 10 элементов, что на массиве из 10_000. 🤔
Забегу вперёд, нобелевку ему не дали не смотря на верно работающий код. Почему? Замеры делались не верно. 😥
Коллега прикрутил input, чтобы вручную задавать параметры замеров. Но вместо того, чтобы передавать их в оцениваемый код, он прописал их внутри кода. 🤯
Как результат 3.5 секунды на ввод данных. Плюс 0.000002 секунды на обсчёт 10 элементов. Или плюс 0.002 на обсчёт 10к элементов.
Выводы делайте сами. Отличного дня 😉
😁6👍4
Немного смайликов в пятничную ленту. 😉
Знаете ли вы, что в основе синтаксиса Python лежит латиница и английский алфавит? Конечно знаете. 😄
А знаете ли вы, что Python 3 отлично работает с любыми символами из UTF-8 внутри str? 😏
P.S. Программа проверяет является ли число простым. 😁
Знаете ли вы, что в основе синтаксиса Python лежит латиница и английский алфавит? Конечно знаете. 😄
А знаете ли вы, что Python 3 отлично работает с любыми символами из UTF-8 внутри str? 😏
def is_prime(num: int) -> bool:Отличной всем пятницы 🙃
f['🤓'] = num
for f['🏃'] in range(f['👫'], f['🤓']):
if f['🤓'] % f['🏃'] == f['🤪']:
return f['😈']
return f['😇']
f = {'😇': True,
'😈': False,
'🤪': 0,
'👫': 2,
'🤯': is_prime,
}
print(f['🤯'](73))
P.S. Программа проверяет является ли число простым. 😁
😁7🤯1
Проводя собеседования речь иногда заходит об ООП в Python. И 9 из 10 участников не могут внятно ответить что такое self. 😱
Ловите несколько фактов.
- self не является частью синтаксиса. Вместо него можно писать this, me, что угодно. Python вас поймёт. Коллеги по проекту - нет.
- количество параметров в методе класса всегда на один больше, чем количество принимаемых аргументов. Первый параметр self не принимает аргумент в привычном стиле.
- self является указателем экземпляру класса на самого себя.
Взгляните на код:
Ловите несколько фактов.
- self не является частью синтаксиса. Вместо него можно писать this, me, что угодно. Python вас поймёт. Коллеги по проекту - нет.
- количество параметров в методе класса всегда на один больше, чем количество принимаемых аргументов. Первый параметр self не принимает аргумент в привычном стиле.
- self является указателем экземпляру класса на самого себя.
Взгляните на код:
class User:Казалось бы два одинаковых экземпляра класса user1 и user2. Но каждый занимает своё место в оперативной памяти. Адреса не совпадают.
def __init__(self, name):
self.name = name
print(f'{self = }')
def me(self):
return self
user1 = User('Python')
print(f'{user1 = }')
user2 = User('Python')
print(f'{user2 = }')
print(user1 is user1.me())
self = <__main__.User object at 0x00000283CD2BE1D0>А вот self экземпляра и сам экземпляр совпадают, т.к. являются одним и тем же объектом.
user1 = <__main__.User object at 0x00000283CD2BE1D0>
self = <__main__.User object at 0x00000283CD77C7C0>
user2 = <__main__.User object at 0x00000283CD77C7C0>
user1 is user1.me() всегда True 🤓👍9🤔3
Пост о юных подаванах и опытных сеньорах.
Две недели назад вышел Python 3.11.0. Уже привычное большое ежегодное обновление. Удивительно, что пара знакомых сразу же кинулись ставить его. И не просто ставить, а обновлять версию в своих рабочих и pet проектах. 😱
Обратите внимание, что даже у Python 3.10.8 от 11 октября статус bugfix.
Коллеги айтишники, используйте безопасные стабильные версии софта в ваших проектах. 🙏 Экономия времени и нервов колоссальные. 🤓
А если очень хочется чего-то новенького, экспериментируйте вне рабочих проектов. Да прибудет с вами логика, а с вашими проектами Python 3.9.15 security 💂♀
Две недели назад вышел Python 3.11.0. Уже привычное большое ежегодное обновление. Удивительно, что пара знакомых сразу же кинулись ставить его. И не просто ставить, а обновлять версию в своих рабочих и pet проектах. 😱
Обратите внимание, что даже у Python 3.10.8 от 11 октября статус bugfix.
Коллеги айтишники, используйте безопасные стабильные версии софта в ваших проектах. 🙏 Экономия времени и нервов колоссальные. 🤓
А если очень хочется чего-то новенького, экспериментируйте вне рабочих проектов. Да прибудет с вами логика, а с вашими проектами Python 3.9.15 security 💂♀
👍12👏1👌1
Всех с пятницей 👋
Ни для кого не секрет, что язык Python назван в честь шоу Летающий цирк Монти Пайтон. Но что вы знаете о шоу? 🤔
Как насчёт Священного Грааля? Знаете ли вы о том, что африканская ласточка способна перенести кокос на другой континент? А как насчёт святой гранаты из серии игр про червячков Worms? Откуда она?
Предлагаю проникнуться духом Монти Пайтон и посмотреть полуторачасовой Святой Грааль вместе. Устроим выходные в стиле Python IT Geek. 💻
P.S. Уже заливаю видео в комментарии к посту. 🍿
Ни для кого не секрет, что язык Python назван в честь шоу Летающий цирк Монти Пайтон. Но что вы знаете о шоу? 🤔
Как насчёт Священного Грааля? Знаете ли вы о том, что африканская ласточка способна перенести кокос на другой континент? А как насчёт святой гранаты из серии игр про червячков Worms? Откуда она?
Предлагаю проникнуться духом Монти Пайтон и посмотреть полуторачасовой Святой Грааль вместе. Устроим выходные в стиле Python IT Geek. 💻
P.S. Уже заливаю видео в комментарии к посту. 🍿
👍6
Посмотрели Монти Пайтон и святой Грааль?
Anonymous Poll
5%
Смотрел в низком качестве
3%
Смотрел в среднем качестве
6%
Смотрел в высоком качестве
12%
Смотрел раньше
2%
Скачал/смотрел в сети
72%
Пока не смотрел
Коротко о четырёх основных способах выполнения кода в Python
Синхронное выполнение 📄
По сути любая программа с переменными, ветвлениями, циклами и прочим, где действия выполняются строка за строкой. Классика, где Python создаёт один процесс с одним потоком внутри.
Многопоточное выполнение 🗂
Берём синхронный код и запускаем функцию несколько раз для "параллельного" выполнения. Снова один Python процесс внутри которого несколько потоков очень быстро переключаются между собой. Настолько быстро, что кажется словно работают одновременно. Но задействуется один поток в одном ядре CPU.
Многопроцессорное выполнение 📚
Основной Python процесс создаёт другие Python процессы. Внутри синхронное выполнение кода в одном потоке. Снаружи несколько процессов выполняемых одновременно разными ядрами/процессорами ПК.
Асинхронное выполнение 🔀
Снова один процесс с одним потоком внутри. Но синхронные функции превращаются в асинхронные сопрограммы - coroutine. Корутины работают по очереди, переключаясь между собой. Похоже на многопоточность, но переключаются не потоки, а функции внутри одного потока.
Синхронное выполнение 📄
По сути любая программа с переменными, ветвлениями, циклами и прочим, где действия выполняются строка за строкой. Классика, где Python создаёт один процесс с одним потоком внутри.
Многопоточное выполнение 🗂
Берём синхронный код и запускаем функцию несколько раз для "параллельного" выполнения. Снова один Python процесс внутри которого несколько потоков очень быстро переключаются между собой. Настолько быстро, что кажется словно работают одновременно. Но задействуется один поток в одном ядре CPU.
Многопроцессорное выполнение 📚
Основной Python процесс создаёт другие Python процессы. Внутри синхронное выполнение кода в одном потоке. Снаружи несколько процессов выполняемых одновременно разными ядрами/процессорами ПК.
Асинхронное выполнение 🔀
Снова один процесс с одним потоком внутри. Но синхронные функции превращаются в асинхронные сопрограммы - coroutine. Корутины работают по очереди, переключаясь между собой. Похоже на многопоточность, но переключаются не потоки, а функции внутри одного потока.
👍7🤯1
В продолжение поста о способах выполнения кода. Немного о том где какой вариант применять
📄 Синхронные решения отлично подходят для небольших, срочных и одноразовых задач. Быстро писать. Легко проводить отладку. Улучшения так же не требуют лишних усилий. И даже если ежечасно парсить сайт и тратить несколько секунд на обработку данных, синхронный код отлично справится с задачей.
🗂 Многопоточные решения создаются для задач с обилием ввода и вывода информации. I/O bound подразумевает ожидание ответов, длительное выполнение запросов и т.п. И пока один поток ждёт свой I/O, другой решает задачу. Тот же пример с парсингом, но не одного, а десятков сайтов одновременно. Быстро по очереди отправляем запросы по одному на поток, а потом обрабатываем в порядке получения ответов.
📚 Многопроцессорные решения нужны для CPU bound задач. Обычно это обработка большого объёма данных, которую можно разбить на части. Например парсим сайт, а он возвращает терабайт в ответ. Каждый процесс обрабатывает свой кусочек терабайта изолировано, а ПК нагружает все ядра процессора. Мы же не зря запустили по одному процессу на каждое ядро CPU.
🔀 Асинхронные решения подходят для I/O bound задач. Стоп! Но ведь потоки для них. Всё верно. Если не придираться к деталям, асинхронный подход можно считать современной альтернативой многопоточных решений. Вполне возможно кто-то из вас сталкивался с потоками в legacy проектах и при обновлении софта менял их на асинхронные корутины.
📄 Синхронные решения отлично подходят для небольших, срочных и одноразовых задач. Быстро писать. Легко проводить отладку. Улучшения так же не требуют лишних усилий. И даже если ежечасно парсить сайт и тратить несколько секунд на обработку данных, синхронный код отлично справится с задачей.
🗂 Многопоточные решения создаются для задач с обилием ввода и вывода информации. I/O bound подразумевает ожидание ответов, длительное выполнение запросов и т.п. И пока один поток ждёт свой I/O, другой решает задачу. Тот же пример с парсингом, но не одного, а десятков сайтов одновременно. Быстро по очереди отправляем запросы по одному на поток, а потом обрабатываем в порядке получения ответов.
📚 Многопроцессорные решения нужны для CPU bound задач. Обычно это обработка большого объёма данных, которую можно разбить на части. Например парсим сайт, а он возвращает терабайт в ответ. Каждый процесс обрабатывает свой кусочек терабайта изолировано, а ПК нагружает все ядра процессора. Мы же не зря запустили по одному процессу на каждое ядро CPU.
🔀 Асинхронные решения подходят для I/O bound задач. Стоп! Но ведь потоки для них. Всё верно. Если не придираться к деталям, асинхронный подход можно считать современной альтернативой многопоточных решений. Вполне возможно кто-то из вас сталкивался с потоками в legacy проектах и при обновлении софта менял их на асинхронные корутины.
👍4👀1
💩2
Поздравляю всех подписчиков канала с Новым годом! 🎄
Творческих успехов, завершённых pet-проектов, меньше горящих дедлайнов и больше кода в удовольствие. 🎁
В новом году вас ждут небольшие посты на канале, интересные авторские статьи на Хабре и конечно же ITшный юмор. 🧑💻
Живите долго и процветайте. До новых встреч. 🖖
P.S. Картинка к посту создана нейросетью специально для этого поста. 🤓
Творческих успехов, завершённых pet-проектов, меньше горящих дедлайнов и больше кода в удовольствие. 🎁
В новом году вас ждут небольшие посты на канале, интересные авторские статьи на Хабре и конечно же ITшный юмор. 🧑💻
Живите долго и процветайте. До новых встреч. 🖖
P.S. Картинка к посту создана нейросетью специально для этого поста. 🤓
🍾8
Встретил на просторах сети эту картинку ☝
Слышали ли вы о том, что ИИ умеет рисовать картины по текстовому запросу?
Модели, обучение, тестирование... Много времени, крутые видеокарты, сложные манипуляции... Ага, как на кадре слева. 🤯
Захотелось научить всех рисовать так же легко и просто, как мост на кадре справа. Ловите ссылку. Делитесь запросами и их результатами в комментариях. 👨🎨
Кстати, со старым новым годом вас 🎄
Слышали ли вы о том, что ИИ умеет рисовать картины по текстовому запросу?
Модели, обучение, тестирование... Много времени, крутые видеокарты, сложные манипуляции... Ага, как на кадре слева. 🤯
Захотелось научить всех рисовать так же легко и просто, как мост на кадре справа. Ловите ссылку. Делитесь запросами и их результатами в комментариях. 👨🎨
Кстати, со старым новым годом вас 🎄
👍4👨💻1
От 🌹 лица 🌹 IT 🌹 сообщества 🌹 поздравляю 🌹 лучшую 🌹 половину 🌹 канала 🌹 с 🌹 международным 🌹 женским 🌹 днём 🌹
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9💅2