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
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, доступные каждому.

Читать статью
В общем, мы создали объединенный чат нескольких каналов для взаимопомощи в программировании и просто общения – @python_chat_ru
Wolfram for Python

Может быть, кому то из вас это будет полезно. Не так давно появилась библиотека, которая позволит напрямую и эффективно вызывать Wolfram Language из языка Python.

Я, например, иногда использую вольфрам для символьных вычислений.

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

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

Читать статью
Комбинация значений

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

📌combinations;
📌combinations_with_replacement;
📌permutations;
📌product.

combinations

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

from itertools import combinations
data = list(combinations('DOG', 2))
print(data)

# Output: [('D', 'O'), ('D', 'G'), ('O', 'G')]


Как видно из кода, метод получает строку DOG, которая впоследствии раскладывается на отдельные символы. Далее происходит группировка по 2 буквы так, чтобы каждая новая выборка отличалась от всех существующих. Функция print выводит полученный список data на экран, отображая все сформированные пары символов D, O, G.

combinations_with_replacement

Более продвинутая вариация предыдущего итератора предоставляет программе возможность делать выборку из отдельных элементов с учетом их порядка. В следующем образце кода показано использование combinations_with_replacement с уже известными аргументами.

from itertools import combinations_with_replacement
for i in combinations_with_replacement('DOG', 2):
print(''.join(i))

# Output:
DD
DO
DG
OO
OG
GG


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

permutations

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

from itertools import permutations
for i in permutations('DOG', 2):
print(''.join(i))

# Output:
DO
DG
OD
OG
GD
GO


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

product

Последний из комбинационных итераторов получает в качестве параметра массив данных, состоящий из нескольких групп значений. Функция product библиотеки itertools в Python 3 позволяет получить из введенной последовательности чисел или символов новую совокупность групп во всех возможных вариациях. Следующий пример показывает исполнение этого метода.

from itertools import product
data = list(product((0, 1), (2, 3)))
print(data)

# Output: [(0, 2), (0, 3), (1, 2), (1, 3)]


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

#itertools #combinations
Мой коллега написал бота, который отправляет котиков и собачек. Советую ознакомиться с ним, поскольку даже в таком простейшем боте есть интересные вещи, например админская панель, позволяющая делать масс-рассылки. К тому же, код заботливо выложен на гитхаб.

Кстати, это только первая часть нашего с ним общего проекта. Но об этом уже немного позже.