Всех, кто не знает или знал, но забыл - приглашаю на вебинар сегодня в 20.00
https://geekbrains.ru/go/Fmbnia
https://geekbrains.ru/go/Fmbnia
Сегодня отличный день, чтобы вернуть канал к жизни. Тем более историй за последние годы накопилось предостаточно.
В планах уйти от вебинаров (но не забрасывать их на совсем), добавить немного кода, историй... Чтобы было что почитать, поделиться с друзьями.
#intro
В планах уйти от вебинаров (но не забрасывать их на совсем), добавить немного кода, историй... Чтобы было что почитать, поделиться с друзьями.
#intro
👍4
И вот вам история из практики преподавания.
Однажды студент пожаловался, что не может написать рабочую функцию. Попросив код, с лёгкостью запустил его в своей IDE. У меня работает. 🤔 Спустя почти час переписки со студентом, танцев с бубном вокруг проверок интерпретатора, IDE, переменных окружения, версий и прочих безумных гипотез, причина была найдена. Ответ на картинке. 😉
#истории #lifehack
Однажды студент пожаловался, что не может написать рабочую функцию. Попросив код, с лёгкостью запустил его в своей IDE. У меня работает. 🤔 Спустя почти час переписки со студентом, танцев с бубном вокруг проверок интерпретатора, IDE, переменных окружения, версий и прочих безумных гипотез, причина была найдена. Ответ на картинке. 😉
#истории #lifehack
😁4
Привет.
Поздравляю всех с Днём Победы. Счастья, радости, здоровья, мира и благополучия вам.
И ловите немного приветов миру 🕊
Традиционно изучение языка программирования начинают с вывода Hello world! И есть один классический способ для Python.
Лично я знаю ещё парочку.
И секретный способ.
У кого есть другие варианты, делитесь в комментариях. 😉
#познавательно
Поздравляю всех с Днём Победы. Счастья, радости, здоровья, мира и благополучия вам.
И ловите немного приветов миру 🕊
Традиционно изучение языка программирования начинают с вывода Hello world! И есть один классический способ для Python.
print('Hello world!')Лично я знаю ещё парочку.
input('Hello world!')И секретный способ.
import __hello__
У кого есть другие варианты, делитесь в комментариях. 😉
#познавательно
👍6🔥3
Что быстрее?
Вопрос не про время набора, конечно же, а про время выполнения кода.
Ответ очевиден, если заглянуть под капот операции через модуль
С квадратными скобками получаем:
Функция
А если вам интересно продолжение этой истории, ставьте 👍 Тогда с меня подробные исследования в следующем выпуске.
#структуры_данных #познавательно
data_one = []
data_two = list()
Вопрос не про время набора, конечно же, а про время выполнения кода.
Ответ очевиден, если заглянуть под капот операции через модуль
dis.С квадратными скобками получаем:
1 0 BUILD_LIST 0
2 STORE_NAME 0 (data_one)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
Функция
list отработает чуть медленнее. Смотрите сами:1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (data_two)
6 LOAD_CONST 0 (None)
8 RETURN_VALUE
А если вам интересно продолжение этой истории, ставьте 👍 Тогда с меня подробные исследования в следующем выпуске.
#структуры_данных #познавательно
👍57🔥1
Продолжение истории про
А тем, кто недавно заглянул на огонёк сброшу ссылку на свой плейлист на YouTube. Если (а точнее когда) буду проводить вебинары, видео обязательно буду дублировать туда 👇
https://youtube.com/playlist?list=PL2Bb1BU5KbvphJCe7ZyOA611wXyRUQiux
#intro #видео
list() и [] оказалось длинным и с картинками. Пока решаю где её удобнее разместить. Продолжение однозначно следует... А тем, кто недавно заглянул на огонёк сброшу ссылку на свой плейлист на YouTube. Если (а точнее когда) буду проводить вебинары, видео обязательно буду дублировать туда 👇
https://youtube.com/playlist?list=PL2Bb1BU5KbvphJCe7ZyOA611wXyRUQiux
#intro #видео
🔥5
Одна из историй преподавания или часть 1. Пара слов о рекурсии в Python
- Рекурсивный код предполагает вызов функцией самой себя.
Следовательно нам нужна функция
- Рекурсия обязана иметь базовый случай, когда она возвращает ответ. Без него получаем переполнение стека функций. А это страшнее зависания в бесконечном цикле 😈
Следовательно нам нужен
- Вызов функцией самой себя должен упрощать задачу, приближать вычисления к базовому случаю.
Следовательно нам нужны передача аргументов
и вызов себя с более простой задачей
Собрав пункты вместе получим рекурсивный алгоритм. Например так можно считать сумму натуральных чисел от 1 до n через рекурсию:
А если у вас не работает, ответ лежит 👉 тут 👈
- Рекурсивный код предполагает вызов функцией самой себя.
Следовательно нам нужна функция
def func():- Рекурсия обязана иметь базовый случай, когда она возвращает ответ. Без него получаем переполнение стека функций. А это страшнее зависания в бесконечном цикле 😈
Следовательно нам нужен
return result
- Вызов функцией самой себя должен упрощать задачу, приближать вычисления к базовому случаю.
Следовательно нам нужны передача аргументов
def func(*args, **kwargs):и вызов себя с более простой задачей
return func(*spam, **eggs)Собрав пункты вместе получим рекурсивный алгоритм. Например так можно считать сумму натуральных чисел от 1 до n через рекурсию:
def func(n):
if n == 1:
return n
return n + func(n - 1)
А если у вас не работает, ответ лежит 👉 тут 👈
👍6😁3❤1🔥1
Одна из историй преподавания или часть 2. Пара слов про ленивые and и or в Python
Для повышения быстродействия при проверке условий в
Вначале рассмотрим
А теперь читайте медленно слева направо. Замечаете? Если первым идёт
А теперь аналогичная "лень" для
В случае
Вывод. В 2-х случаях из 4-х проверки через
Ленивый
В этом примере когда
Для повышения быстродействия при проверке условий в
if, Python ленится, когда условий несколько в связке с and и/или or.Вначале рассмотрим
and.True and True == True
True and False == False
False and True == False
False and False == False
А теперь читайте медленно слева направо. Замечаете? Если первым идёт
False, то в итоге всегда будет False независимо от второго значения.А теперь аналогичная "лень" для
or.True or True == True
True or False == True
False or True == True
False or False == FalseВ случае
or если слева идёт True, то и в результате будет True.Вывод. В 2-х случаях из 4-х проверки через
and и or знают ответ заранее, не глядя на второе условие. Так зачем тратить вычисления.if False and 2 + 2 == 4:
print("Этот текст никогда не будет выведен!")Ленивый
if помогает экономит ресурсы ☝️. Но новички легко наступают на грабли, не продумав все последствия 👇if a > 0 or a / b > 1:
print("Текст")В этом примере когда
b = 0 получим ошибку деления на ноль. Но не всегда, а только если a <= 0.👍8🔥2
Одна из историй преподавания или часть 3. Как благодаря ленивому and функция работает рекурсивно
Перед нами квинтэссенция рекурсии и лени. При любом натуральном x функция рекурсивно досчитывает до нуля, который и возвращает.
1. Функция получает на вход натуральное число, например так
2. Происходит неявное преобразование целого числа 5 из
3. Функция переходит к проверке выражения после
4. Переходим к пункту 1.
4.1 В какой-то момент
5 (он же новый п. 2). Происходит неявное преобразование целого числа 0 из
6. Ленивый
7. Happy end и ответ в виде нуля при любом натуральном
def a(x):
return x and a(x - 1)
Перед нами квинтэссенция рекурсии и лени. При любом натуральном x функция рекурсивно досчитывает до нуля, который и возвращает.
1. Функция получает на вход натуральное число, например так
print(a(5))2. Происходит неявное преобразование целого числа 5 из
int в логический True.3. Функция переходит к проверке выражения после
and и вызывает сама себя. Но число передаётся на единицу меньше.4. Переходим к пункту 1.
4.1 В какой-то момент
x уменьшается до нуля. 5 (он же новый п. 2). Происходит неявное преобразование целого числа 0 из
int в логический False.6. Ленивый
if отказывается идти дальше and. Никакого нового вызова функции не происходит. Возвращается ноль.7. Happy end и ответ в виде нуля при любом натуральном
x на входе. Если конечно мы не переполняем стек вызова функций. Но это уже другая история... 😉👍5👏5❤2
Одна из историй преподавания или часть 4. Что за стек вызова функций из 1 и 3 части?
Каждый запуск функции кладёт на стек информацию о ней. Удаление информации происходит после завершения работы функции. И обычно стек почти пустой. Ведь даже в крутом выводе на печать списка уникальных элементов из введённой пользователем строки всего 6 функций максимально на стеке. 👇
С рекурсией ситуация хуже. Пример рекурсивного подсчёта суммы от 1 до n 👉 этот 👈 сломается на любом
Впрочем, ограничение можнообойти изменить в большую сторону. Достаточно задать новый лимит через встроенную в модуль
Но помните. С большим стеком приходит большая ответственность. 🕸
Каждый запуск функции кладёт на стек информацию о ней. Удаление информации происходит после завершения работы функции. И обычно стек почти пустой. Ведь даже в крутом выводе на печать списка уникальных элементов из введённой пользователем строки всего 6 функций максимально на стеке. 👇
print(list(set(map(str, input("Filter unique simbols: ")))))С рекурсией ситуация хуже. Пример рекурсивного подсчёта суммы от 1 до n 👉 этот 👈 сломается на любом
n больше ≈995. Стек не резиновый, ОЗУ не бесконечна. Стандартное ограничение в Python составляет 1000 элементов на стеке.Впрочем, ограничение можно
sys функцию.sys.setrecursionlimit(new_limit)Но помните. С большим стеком приходит большая ответственность. 🕸
👍6🔥3
Чем заняться в выходные? Может почитать одно старое, но от этого ничуть не утратившее актуальность интервью со мной. 🤓
Хотя. Оно скорее не обо мне, а о Python. Но и вы собрались в канале ради языка программирования. Так что смело click по ссылке. 💻
https://habr.com/ru/company/habr_career/blog/454182/
Комментарии можно и туда, и сюда 🔁
Хотя. Оно скорее не обо мне, а о Python. Но и вы собрались в канале ради языка программирования. Так что смело click по ссылке. 💻
https://habr.com/ru/company/habr_career/blog/454182/
Комментарии можно и туда, и сюда 🔁
🔥3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Изначально завершить историю о рекурсии хотел рассказом о хвостовой рекурсии и крутым приёмом по её реализации в Python. Да, язык изначально её не поддерживает. Но чем больше статей по оптимизации хвостов рекурсии в Python читал, тем больше слёз от костылей, кривокода и плясок с бубном текло из моих глаз 😢
В итоге пришёл к двум выводам.
1. Гвидо шикарный программист и я полностью согласен с его нежеланием заниматься Устранением хвостовой рекурсии.
2. Если есть рекурсивное решение задачи, но оно может переполнить стек, задачу надо переписать через циклы.
Было:
Стало:
Или даже так, в Python Style:
В итоге пришёл к двум выводам.
1. Гвидо шикарный программист и я полностью согласен с его нежеланием заниматься Устранением хвостовой рекурсии.
2. Если есть рекурсивное решение задачи, но оно может переполнить стек, задачу надо переписать через циклы.
Было:
def func(n):
if n == 1:
return n
return n + func(n - 1)
Стало:
def func(n):
res = n
while n != 1:
n -= 1
res += n
return res
Или даже так, в Python Style:
def py_func(n):
return sum(range(1, n + 1))
🔥7
Если ваш код на Python активно взаимодействует с операционной системой... Или вы решили сделать простенький эмулятор терминала для прокачки навыков программирования. В любом случае обратите внимание на функцию system из модуля os.
os.system('python --version')
Быстро, просто, коротко.👍5
Простенький эмулятор терминала ver_1.0.alpha из прошлого поста
Та неловкая ситуация, когда комментарии интереснее, чем сам пост. 😊
import osUPD 12:30
print('OS terminal started')
while True:
cmd = input('>>> ')
os.system(cmd)
Та неловкая ситуация, когда комментарии интереснее, чем сам пост. 😊
Программисты живут кодом. Но иногда надо отдыхать. И я не про сон и еду, без которых никак. Прогулка, пробежка, поездка на велосипеде, поход подальше от цивилизации с ночёвкой. Дела и места без ноутбука, интернета, а иногда и без электричества.
Но что делать, если гениальная мысль пришла именно в такой момент?
Мой личный Top-3 для Android телефона Python-разработчика. 😉
PyDroid 3 лучшая из мобильных IDE, которые встречал. Она может не только код 🤓
Консоль, терминал интерпретатора, pip, отладчик,... 😍 https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
CodeBoard клавиатура отлично помогает уйти от багов автозамены. А когда к ней привыкаешь, уровень восторга зашкаливает 😊 https://play.google.com/store/apps/details?id=com.gazlaws.codeboard
Pocket Git великолепно справляется с базовыми операциями. А синхронизироваться с облаком можно по возвращению из похода. 💡
https://play.google.com/store/apps/details?id=com.aor.pocketgit
Если у вас есть свои любимые телефонные программы ITшника, делитесь в комментариях. ✏
Но что делать, если гениальная мысль пришла именно в такой момент?
Мой личный Top-3 для Android телефона Python-разработчика. 😉
PyDroid 3 лучшая из мобильных IDE, которые встречал. Она может не только код 🤓
Консоль, терминал интерпретатора, pip, отладчик,... 😍 https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
CodeBoard клавиатура отлично помогает уйти от багов автозамены. А когда к ней привыкаешь, уровень восторга зашкаливает 😊 https://play.google.com/store/apps/details?id=com.gazlaws.codeboard
Pocket Git великолепно справляется с базовыми операциями. А синхронизироваться с облаком можно по возвращению из похода. 💡
https://play.google.com/store/apps/details?id=com.aor.pocketgit
Если у вас есть свои любимые телефонные программы ITшника, делитесь в комментариях. ✏
👍8
В Python логический тип данных (он же класс
Есть лишь две логических константы
И так как "логика" основана на "целых", константы могут участвовать в математических выражениях.
bool) основан на целых числах, т.е. на классе int.Есть лишь две логических константы
True и False.И так как "логика" основана на "целых", константы могут участвовать в математических выражениях.
True преобразуется в единицу, а False в ноль.>>> 4 + TrueОдин из вариантов применения - получить переменную знак (
5
>>> 5 / False
ZeroDivisionError: division by zero
+1 или -1) из логической:sign = is_bool * 2 - 1Теперь можем оперировать числом или его инвертированным значением:
res = data * sign
👍6
Кстати, про истину и ложь. Все давно перестали замечать последнюю строку вывода ваших программ. Вот эту:
Как быть? Понять ипростить знать об этой особенности. И может быть вспомнить Zen Python: "Явное лучше неявного". 🤓
Process finished with exit code 0Ноль в конце говорит об успешном завершении программы. Для ОС ноль как раз является истиной. А если программа завершается с ошибкой, получаем какое-то отличное от нуля число. И это плохо, это ложь.
Как быть? Понять и
❤2👍2
Когда-то давно в одном проекте нужна была система помощи в принятии решения. Не буду вдаваться в подробности. 🤐
Но проверить работу кода решил не через тест-кейсы, а сразу на реальных данных. Взял из DB "CША" и...
Код не заработал. Спустя несколько часов в попытках найти баг составил в корне новый алгоритм и написал вторую версию кода. И снова ничего. Часы отладки, а результата нет. 😔
В чём была проблема узнал лишь на следующий день, когда сделал это:
Буква "C" оказалась латинской, а "ША" из кириллицы. 😱
Так я впервые познакомился с набором из 11 заглавных и 6 строчных букв, а именно: "А, В, С, Е, Н, К, М, О, Р, Т, Х, а, с, е, о, р, х." Внешне они одинаковы, но код для латиницы и кириллицы разный. 🤓
В тот же день была написана обёртка к коду, которая исправляет случайный ввод пользователя и приводит символы к нужной раскладке. 😎
И да, с тех пор глядя на строки зелёного кода я могу разглядеть девушку в красном платье. 💃
Но проверить работу кода решил не через тест-кейсы, а сразу на реальных данных. Взял из DB "CША" и...
Код не заработал. Спустя несколько часов в попытках найти баг составил в корне новый алгоритм и написал вторую версию кода. И снова ничего. Часы отладки, а результата нет. 😔
В чём была проблема узнал лишь на следующий день, когда сделал это:
data = "CША"
for char in data:
print(ord(char))
Буква "C" оказалась латинской, а "ША" из кириллицы. 😱
Так я впервые познакомился с набором из 11 заглавных и 6 строчных букв, а именно: "А, В, С, Е, Н, К, М, О, Р, Т, Х, а, с, е, о, р, х." Внешне они одинаковы, но код для латиницы и кириллицы разный. 🤓
В тот же день была написана обёртка к коду, которая исправляет случайный ввод пользователя и приводит символы к нужной раскладке. 😎
И да, с тех пор глядя на строки зелёного кода я могу разглядеть девушку в красном платье. 💃
❤6🔥4😁4👍3
