Python просто | з Коропом
222 subscribers
68 photos
43 links
Легко і доступно розказую про Пайтон

Ви завжди знайдете тут щось нове та корисне для себе 😊

Автор — @kor0p, практикуючий Пайтоніст з п'ятирічним досвідом 😎


Чат — @python_kor0p_chat
Download Telegram
Python просто | з Коропом
При написанні типових користувацьких програм варто додавати пояснення та контекст для деяких помилок Але при цьому не завжди треба ловити цю помилку. Для цього можна у блоці except дописати raise і помилка піде далі, аж поки не зупинить виконання програми…
Я уже розповідав про ре-рейз помилок, але й сам забув, що замість print'а краще використати метод add_note() 😅

Цей метод дозволяє додати нотатку для будь-якої помилки, щоб мати більше контексту

Усі ці нотатки зберігаються у атрибуті __notes__ (але якщо нотаток не було, то й атрибута не буде, це важливо)

Він доступний лише з версії 3.11, але уже встиг увійти у активний обіг (принаймні у мене 👀)

Документація

А за посиланням нижче є аж 4 додаткових приклади 😉

Спробувати самостійно | Підписатись
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥11
Конструкція try/except має багато можливостей, хоч і не всі їх розуміють
Серед таких є і блок else, який виконається тільки у тому випадку, якщо у блоці try не було помилки

Якщо ви хочете бути впевненими, що змінна, створена у блоці try буде доступна, то замість того, щоб писати код після усієї конструкції, додайте цей код у блок else

По суті це вбудований if/else в залежності від того чи була помилка, але з усією красою та функціональністю try/except

Якщо хтось знайомий з Promise у JS, то блок else можна порівняти з колбеком .then


Спробувати самостійно
| Підписатись
❤8👍11
finally — ще один блок конструкції try/except

Використовуйте finally, коли треба щось виконати, незалежно від результату інших блоків
Наприклад: закрити файл, закрити конекшин/транзакцію у БД тощо

Побічний ефект: цей блок виконається перед return, тому можна уникнути створення зайвої змінної для повернення результату з функції
Теж саме стосується і break, і continue, якщо try/except знаходиться в циклі

Документація

Спробувати самостійно | Підписатись
❤5👍2🔥11
else
Так знову 👀, але тепер у for 😅

Якщо у циклі не буде виклику break, виконається код у блоці else
Якщо не буде жодного елемента, також виконається (всьо логічно ж 🤷‍♂️)

Цю можливість можна використати для вкладених циклів, або для повернення дефолтного значення у блоці else

Я сам інколи юзаю цю штуку, але завжди дописую коментерам умови, за яких виконається ця частина коду, і для чого саме так побудовано

Тобто, це крутий інструмент, але доволі складний для розуміння, тому майте це на увазі у ваших проєктах)


Спробувати самостійно | Підписатись
👍4❤3😁1111
Яким буде результат у останньому рядку?

#вікторини
🤯221
Яким буде результат у останньому рядку?
Anonymous Quiz
25%
Помилка у циклі ❌
55%
[1, 6, 4]
15%
[1, 40, 6, 4]
2%
[1, 25, 6, 4]
3%
Не знаю 🤷‍♂️
🤯1
Відповідь: [1, 40, 6, 4]

Пояснення:

При ітерації, не варто видаляти елементи з масиву — Пайтон губиться і може пропустити елемент 😢

Так відбувається через те, що для ітерації по масиву, Пайтон зберігає індекс, а видалення одного елемента зміщує індекс для інших

Тому, якщо вам таки треба видалити об'єкт з масиву, по якому ви ітеруєтесь, скопіюйте масив через .copy() чи [:]

Все те саме стосується і будь-яких інших змін у масиві — треба бути дуже обережним)



Спробувати самостійно | Підписатись
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤71
А що це тут таке складне? 🫠
А це — дескриптори

Нумо читати статтю на Друкарні 😉

Спробувати самостійно | Підписатись
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯3❤1👌11
Погані звички, які прийшли від купи старих гайдів 🫠
Одна з причин, чому я завів цей канал, це боротьба з ними 😅

Так от, with open це прекрасно, але навіщо вам трактор, якщо вам треба лопата?)
Лопатою я тут назвав Path — дуже простий спосіб копати ями працювати з файлами
Якщо треба зробити це швидко і небагато — ви візьмете лопату 😉

Записати текст у файл? file.write_text
Зчитати текст з файлу? Тю, file.read_text

Ви колись бачили щось простіше?)

Звісно, ніхто не каже викидати open, просто це більш гнучкий інструмент, який буде корисним у складніших операціях, але з яким треба вміти поводитись (трактором от можна й танк тягнути 😉)


Спробувати самостійно | Підписатись
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍3🔥1
Нова рубрика — задачки по Пайтону! 🔥

Я уже раніше анонсував її, і вирішив, що не варто зволікати)
Для початку, вибрав доволі стандартну задачку, але, надіюсь, вам сподобається 😊

Задача #1:
Потрібно написати функцію fib, що повертатиме н-ний елемент послідовності Фібоначчі

Послідовність починається з двох одиниць, і продовжується сумою двох попередніх елементів, тобто: 1, 1, 2, 3, 5, 8, 13, 21 і тд

Ваші відповіді надсилайте у бот @python_kor0p_bot

Переможці:
1. Код, що виконується найшвидше
2. Код, що сподобається підписникам у голосуванні

Винагорода (на вибір):
- 2 години менторства від мене
- 100 грн

Як буде перевірятись коректність та швидкодія — описую у окремому JupyterLite

Відповіді приймаються до 9 червня 23:59
За мною залишається право задавати питання по вашій реалізації, щоб впевнитись, що код не крадений (ну або не від ШІ 😅)

10 червня буде проведено опитування серед підписників за найцікавішу відповідь, щоб визначити переможця #2

11 червня обидва переможці отримають свою винагороду, і їхні відповіді будуть опубліковані на каналі
Також, я опублікую свій варіант розв'язку, якщо вам цікаво)

Дуже чекаю ваших варіантів у боті ☺️
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥2
Яка реалізація вам сподобалась найбільше?
Final Results
17%
61%
Hidden
2🤔1
Сьогодні будемо обирати найцікавіший варіант вирішення 😎
Голосування (пост вище) буде відкрите до 23:59

Реалізації можна глянути ось тут:
- @pvlvld (від @pvlvld)
- @olsinika (від @olsinika)
- @krond (від @krond)
- hidden (від Hidden)

Як і обіцяв, завтра опублікую і свій варіант
P.S. він б не переміг 😭

Усім дякую за участь, було цікаво слідкувати за потоком думок і реалізацій
У декого було декілька варіантів, і вони будуть опубліковані завтра (за згоди автора, звісно)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2😎11
Python просто | з Коропом
Яка реалізація вам сподобалась найбільше?
Отже, переможці першого змагання:
1. @krond (від @krond) за найшвидший результат (0.00148с)
2. hidden (від Hidden), за якого проголосувало найбільше людей (61%)


Мої варіанти:
- звичайний (на фото — саме він)
- математичний


Додаткові варіанти від @krond:
- перший
- другий
- третій


А тепер коротенька історія:
В універу у нас були командні проєкти, до яких доєднювали менторів — людей, які працювали в айті і могли дати непідробні знання
Але на перший семестр першого курсу команда в нас не склалась якось...
Ніхто не хотів нічого робити, та й ментор не дуже за нами слідкував
Але на кінець семестру на нього трохи натиснули, і він почав нас ганяти по Пайтону (бо проєкт мав бути саме на ньому), і задача була саме написати функцію для послідовності Фібоначчі
Скільки часу ми тоді не гуглили, скільки б не думали (а я уже тоді вважав себе супер-крутим знавцем Пайтону, бо пройшов 2-3 безкоштовні курси, хєх) — ми не могли додуматись до того рішення, яке від нас очікував ментор

Так от, вирішення було майже таким як на фото. Різниця була в тому, що всередині циклу додавався yield, а в умові задачі стояло "вивести послідовність до числа n". І за один виклик fib(100) ти отримував масив чисел з послідовності Фібоначчі, де усі числа менші за 100
Мені не сподобався такий однобокий підхід, хоч я і був вражений простотою рішення

Тому, хоч ця задача і не є якоюсь складною, у неї є багато рішень, і вона для мене особлива)
Ще раз усім дякую за участь ❤️
❤3👍3🤯1🎉1🏆11
❗️Уникайте створення функцій в циклах

Про що я таке говорю?) 🙃
▫️У Пайтоні кожна функція та клас мають свою область видимості (скоуп), і відповідно — локальні змінні

▫️Коли створюється функція всередині будь-якого блоку, вона запам'ятовує скоуп, в якому вона була створена

▫️При виклику, функція може використовувати як і локальні змінні, так і змінні вищого скоупа

▫️Цикли не мають свого скоупа
Це означає, що значення, яке змінюється в циклі, змінюється в скоупі, де існує цикл

▫️Якщо створити функцію всередині циклу, то той скоуп, який збереже функція для подальшого використання буде тим самий скоупом, який змінюється в циклі


Що відбувається в прикладі:
▫️Після завершення циклу значення змінної number рівне 2
▫️При виклику, функція callback дивиться в скоуп по змінну number і знаходить там 2
▫️У результаті виводиться 3 двійки підряд 🙈 😢


Як це виправити?
▫️Спробуйте порефакторити код так, щоб функції не створювались в циклі
▫️Або ж спробуйте використати functools.partial
Тут можливо прийдеться додати аргументи до функції, які будуть передаватись через partial, а раніше брались напряму зі скоупу


Спробувати самостійно | Підписатись
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1😁1🤯1🦄1