Hello World – Telegram
Hello World
1.68K subscribers
71 photos
6 videos
3 files
161 links
Be so good that you cannot be ignored. And then, go one step beyond.
Download Telegram
Чай из itertools

Если вы читали предыдущие посты про итераторы, то примерно представляете как они работают (если нет, ищите по тегу #generators). Итератор обычно выдает значения по одному (с помощью метода __next__, например). Это означает, что получать значения из итератора может только один потребитель. Однако, это можно исправить.

📌tee принимает два аргумента: исходный итератор и количество новых итераторов, на которые разделится исходный. А возвращает он кортеж из новых итераторов.
from itertools import tee

def get_iter():
for i in range(5):
yield i

one, two, three = tee(get_iter(), 3)

print(f'next is {next(one)}')
print(f'next is {next(two)}')
for item in three:
print(f'next is {item}')


Вывод:
next is 0
next is 0
next is 0
next is 1
next is 2
next is 3
next is 4


Видно, что каждый из полученных итераторов по сути является независимой копией исходного get_iter.

Несколько замечаний:
📌Не следует пытаться итерировать исходный get_iter, иначе производные итераторы могут потерять некоторые значения.
📌tee хранит в памяти извлеченные элементы, чтобы остальные потребители могли их получить, даже если исходный итератор уже сместился. Поэтому, если элементов много либо они большие, это может серьезно повлиять на расход памяти.

#tee #iterators
Немного новостей 🗒

📌Сейчас мы плотно заняты разработкой обучающего курса о создании ботов в телеграме. Что там вообще будет? А будет там много информации о самой библиотеке pyTelegramBotAPI, об обработчиках, о клавиатурах, о базах данных конечно и о веб хуках. Лично от меня — базы данных, платежки, встраивание платежек в бота.

📌Мы планируем продавать данный курс всем заинтересованным в этом людям. Вырученные деньги пойдут на развитие канала и закупы рекламы, поскольку я уже давно этим не занимался, а надо бы. Цена не будет слишком высокой. Это будет самое оно для тех, у кого давно есть идея создания собственного бота, но с реализацией напряг.

📌Кроме того, потихоньку осваиваю data science дальше, и изучаю нейросети. Нашел для вас отличную статью (не реклама, статья правда отличная) по машинному обучению. В планах сейчас освоение нейронок на хорошем уровне + создание своего приложения.

#news
Замыкания с поздним связыванием.

Один из распространенных источников путаницы в Python — способ связывания переменных в замыканиях (closures).

Например, вы пишите:
def create_multipliers():
return [lambda x: i * x for i in range(5)]


for multiplier in create_multipliers():
print(multiplier(2), end=" ... ")
print()


Что вы ожидаете:
Out [0]: 0 … 2 … 4 … 6 … 8 …


Что происходит на самом деле:
Out [0]: 8 … 8 … 8 … 8 … 8 …


Создаются пять функций, и все они умножают x на 4. Почему?

📌В языке Python замыкания имеют позднее связывание
📌Значения переменных, использованных в замыканиях, определяются в момент вызова внутренней функции

🔎В нашем примере, когда вызывается любая из возвращаемых функций, значение переменной i определяется с помощью окружающей области видимости в момент вызова. К этому моменту цикл завершает свою работу и i получает итоговое значение равное четырем.

#closures
Как же тогда написать правильно? А вот об этом уже в следующий раз.

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

Мы в теме ботов уже давно, если кто-то помнит наш бот по ставкам на футбольные матчи (сейчас бот в стадии обновления, парсеры переписаны с нуля и без использования splinter, который дико тормозил и нагружал систему).

Курс по ботам включает в себя работу с базами данных, с веб хуками и платежной системой QIWI. Он не требует каких-то особенных знаний Python и рассчитан преимущественно на новичков. Для записи пишите в бота @bots_course_bot

P.S. На следующей неделе запланировано поднятие цен, так что поспешите.
For masochists only.

А как вы относитесь к математике? Знакомы ли с векторным-тензорным анализом? Удовлетворяет ли вас институтский/школьный курс, или ничего вообще непонятно? Хотелось бы вам видеть больше математики на канале, даже не применительно только к языку Python?

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

Недавно мы выяснили как работает позднее связывание в замыканиях в Python. Теперь попробуем устранить проблему, которая возникала при создании замыкания.

Наиболее общее решение, возможно, станет костылем. Из-за поведения Python при определении аргументов по умолчанию для функций, вы можете создать замыкание, которое немедленно связывается со своими аргументами про помощи аргумента по умолчанию:
def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]


Либо воспользоваться functools.partial():
from functools import partial
from operator import mul

def create_multipliers():
return [partial(mul, i) for i in range(5)]


В таком случае,
Out [0]: 0 … 2 … 4 … 6 … 8 …

#closures
5 способов форматирования строк

1.
Конкатенация.
Грубый способ форматирования, в котором мы просто склеиваем несколько строк с помощью операции сложения.

name = "Дмитрий"
age = 25
print("Меня зовут " + name + ". Мне " + str(age) + " лет.")
# Output: Меня зовут Дмитрий. Мне 25 лет.


2. %-форматирование.
Самый популярный способ, который перешел в Python из языка С. Передавать значения в строку можно через списки и кортежи , а также и с помощью словаря. Во втором случае значения помещаются не по позиции, а в соответствии с именами.

name = "Дмитрий"
age = 25
print("Меня зовут %s. Мне %d лет." % (name, age))
# Output: Меня зовут Дмитрий. Мне 25 лет.

print("Меня зовут %(name)s. Мне %(age)d лет." % {"name": name, "age": age})
# Output: Меня зовут Дмитрий. Мне 25 лет.


3. Template-строки.
Этот способ появился в Python 2.4, как замена %-форматированию (PEP 292), но популярным так и не стал. Поддерживает передачу значений по имени и использует $-синтаксис как в PHP.

from string import Template

name = "Дмитрий"
age = 25
s = Template('Меня зовут $name. Мне $age лет.')
print(s.substitute(name=name, age=age))
# Output: Меня зовут Дмитрий. Мне 25 лет.


4. Форматирование с помощью метода format().
Этот способ появился в Python 3 в качестве замены %-форматированию. Он также поддерживает передачу значений по позиции и по имени.

name = "Дмитрий"
age = 25
print("Меня зовут {}. Мне {} лет.".format(name, age)
# Output: Меня зовут Дмитрий. Мне 25 лет.

print("Меня зовут {name} Мне {age} лет.".format(age=age, name=name)
# Output: Меня зовут Дмитрий. Мне 25 лет.


5. f-строки.
Форматирование, которое появилось в Python 3.6 (PEP 498). Этот способ похож на форматирование с помощью метода format(), но гибче, читабельней и быстрей.

name = "Дмитрий"
age = 25
print(f"Меня зовут {name} Мне {age} лет.")
# Output: Меня зовут Дмитрий. Мне 25 лет.


#string
Погружение в f-строки

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

name = "Олег"
age = 20
print(f"Меня зовут {name} Мне {age} лет.")
# Output: Меня зовут Олег. Мне 20 лет.


📌f-строки также поддерживают расширенное форматирование чисел:

from math import pi
print(f"Значение числа pi: {pi:.2f}")
# Output: Значение числа pi: 3.14


📌С помощью f-строк можно форматировать дату без вызова метода strftime():

from datetime import datetime as dt

now = dt.now()
print(f"Текущее время {now:%d.%m.%Y %H:%M}")
# Output: Текущее время 24.02.2017 15:51


📌Они поддерживают базовые арифметические операции. Да, прямо в строках:

x = 10
y = 5
print(f"{x} x {y} / 2 = {x * y / 2}")
# Output: 10 x 5 / 2 = 25.0


📌Позволяют обращаться к значениям списков по индексу:

planets = ["Меркурий", "Венера", "Земля", "Марс"]
print(f"Мы живем на планете {planets[2]}")
# Output: Мы живем на планете Земля


📌А также к элементам словаря по ключу:

planet = {"name": "Земля", "radius": 6378000}
print(f"Планета {planet['name']}. Радиус {planet['radius']/1000} км.")
# Output: Планета Земля. Радиус 6378.0 км.


📌Причем вы можете использовать как строковые, так и числовые ключи. Точно также как в обычном Python коде:

digits = {0: 'ноль', 'one': 'один'}
print(f"0 - {digits[0]}, 1 - {digits['one']}")
# Output: 0 - ноль, 1 - один


📌Вы можете вызывать в f-строках методы объектов:

name = "Олег"
print(f"Имя: {name.upper()}")
# Output: Имя: ОЛЕГ


📌А также вызывать функции:

print(f"13 / 3 = {round(13/3)}")
# Output: 13 / 3 = 4


f-строки очень гибкий и мощный инструмент для создания самых разнообразных шаблонов.

Со всеми возможностями f-строк вы можете ознакомится в PEP498.
Не забывайте, что их можно использовать только в версиях Python >= 3.6

#fstring
Что выведет функция print?

class A:
pass

class B:
value = 1

class C:
value = 3

class D(A, B, C):
def __str__(self):
return str(self.value)

print(D())
В этом простом примере Python ищет необходимый атрибут в родительских классах, поскольку они перечислены слева направо. То есть, Python начнет с просмотра A и, если A не имеет атрибута, то будет смотреть на B.

Таким образом, правильный ответ — 1.

📌Более подробно об этом можно почитать тут (MRO).
Что такое itertools?

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

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

Ранее мы уже немного касались itertools (tee, islice, permutations) а так же когда разбирали различия между генераторами и итераторами (здесь первая часть).
Chains 🔗

itertools.chain
Возвращает по одному элементу из первого итератора, потом из второго, до тех пор, пока итераторы не кончатся. Итоговый массив содержит все элементы данных итераторов.

📌Пример использования:

from itertools import chain

print(list(chain(['a', 'b', 'c'], range(4))))
# Output: ['a', 'b', 'c', 0, 1, 2, 3]


itertools.chain.from_iterable
Работает аналогично chain. Также выполняется объединение списков. Отличие заключается в том, что аргумент только один – вложенный список со списками, которые надо объединить.

📌Пример использования:

from itertools import chain

print(list(chain.from_iterable([['a', 'b', 'c'], range(4)])))
# Output: ['a', 'b', 'c', 0, 1, 2, 3]


#iterators #chain
This media is not supported in your browser
VIEW IN TELEGRAM
График популярности языков программирования, основанная на количестве заданных на Stack Overflow вопросов по соответствующему языку.

В целом, приятно за возросший интерес к языку Python. Но оно и понятно, в data science и machine learning без него никуда.

Все еще сомневаетесь, что пишете на лучшем языке в мире?
Что выведет функция?

def func(x, *y, **z):
print(z)

func(1,2,3)


upd: вместо None я имел в виду пустой словарь {}.
Hello World
Что выведет функция? def func(x, *y, **z): print(z) func(1,2,3) upd: вместо None я имел в виду пустой словарь {}.
Функция выведет пустой словарь {}

В момент инициализации функции, Python создает пустой словарь. Поскольку никаких именованных параметров не было передано в функцию (по сути мы передали 1 в x и (2, 3) в y), Python распечатает именно пустой словарь.
Распознавание лиц и верификация пользователей по ним – будущее или уже существующая реальность? Даже больше, каждый уже может написать свою подобную программу. Это настолько просто, что требуется буквально двадцать строк кода и всего лишь полчаса времени для понимания.

Читать статью
This media is not supported in your browser
VIEW IN TELEGRAM
Streamlit позволяет создавать приложения для проектов машинного обучения с обманчиво простыми скриптами Python. Он поддерживает горячую замену, поэтому ваши обновления обновляются в процессе редактирования и сохранения файла. Все, что вам нужно, это ваш любимый редактор и браузер. Посмотрите на Streamlit в действии.
Python имеет ужасную репутацию, когда речь идет о возможности параллельных вычислений. Не обращая внимания на типичные рассуждения о его потоках и GIL (который обычно нормально работает), реальная проблема многопоточности Python не техническая, а педагогическая. Распространенные руководства о библиотеках threading и multiprocessing в целом неплохие, но тяжеловаты для понимания.

Именно по этой причине я написал статью в которой рассматриваются возможности multiprocessing, доступные каждому.

Читать статью