Практичні завдання python. Мова програмування Python – з чого починати? Метакласи та дескриптори

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

Але Python популярний не тільки тому, що він популярний. Його легко вчити, читається він як псевдо-код і дуже динамічний. Однак вивчення нової мови може виявитися досить проблематичним заняттям, знайшовши правильне місце для навчання і людей від яких можна дізнатися нову інформацію, ви вирішите половину поставленого завдання. Наш путівник допоможе вам у цьому. Це буде ваш надійний план, який полегшить вивчення Python, зробить процес навчання веселим та цікавим.

Завдання 1: почніть з основ

На момент написання цієї статті існує дві основні версії Python: Python 2.7 і Python 3.2. Яку версію ви виберете для вивчення не так важливо, тому що відмінності будуть мінімальними-особливо для новачка. Але вам варто знати, що Python 2 підтримує більше сторонніх бібліотек, в той час як Python 3 в основному фокусується на розробниках, які працюють над покращенням мови. Вибір залишається за вами, якщо код з будь-якого туторіалу працює не так, як задумано, переконайтеся, що ви використовуєте відповідну версію Python з цього туторіалу.

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

Ви не знайдете кращого джерела інформації, ніж офіційна документація на сайті python.org. Тим не менш, якщо ви хочете почати відразу звідси, це може виявитися поганою ідеєю.

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

Для початківців найпомітнішою відмінністю Python 2 від Python 3 швидше за все буде можливість у Python 2 використовувати print без дужок. Дужки в Python 3 є обов'язковими, на цьому мабуть все.

Завдання 2: туторіали та скринкасти

Плейлист NewBoston завжди чудовий і ви можете вивчити багато мов. "Bucky" чудовий інструктор, його цікаво слухати, тому що він знайшов баланс між бути смішним та інформативним, що він намагається донести завжди легко сприймається. Я рекомендую ознайомитися з будь-яким із його плейлистів-особливо з плейлистом Python. Не потрібно мати будь-які знання в програмуванні, після перегляду його відео туторіалів у вас з'явиться міцне розуміння мови.

Nettuts+ Python з нуля

Непоганим введенням у мову Python буде курс Giles Lavelle. Як і у випадку з серією від The ​​New Boston, Lavelle має на увазі, що у вас немає досвіду в програмуванні.

Якщо ви хочете побачити реальні програми або хочете зрозуміти веб-розробку на Python, ця серія підійде, як не можна до речі.

У цьому скринкасті ви створите динамічний веб-сайт з нуля, використовуючи Python фреймворк Django.

Скринкаст по Python від ShowMeDo

StackOverflow відомий не тільки новачками, помилками та проблемами.

ShowMeDo має величезний каталог відео що відносяться до Python. Хоча може здатися, що на сайті не найкращий інтерфейс користувача, там знаходиться величезний набір корисних відео, як інформація для новачків, так і просунуті методи використання Python. Вам обов'язково варто ознайомитись із цим сайтом.

Створити Python бота, який може грати у веб-ігри

У цьому туторіалі ви познайомитеся зі специфічним матеріалом, я не рекомендую його абсолютним новачкам. Однак я думаю, його варто згадати. У цьому уроці, Chris Kiehl покаже, як створити дуже цікавого Python бота, який буде грати в просту гру для вас. Туторіал покаже вам силу Python; він може стати в нагоді для вирішення повсякденних завдань, які можна застосувати для керування вашим комп'ютером.

Завдання 3: безкоштовні електронні книги

Хороша книга безсумнівно є надійним помічником під час вивчення чогось нового, навколо мови Python утворилося приголомшливе та дружелюбне співтовариство, внаслідок чого можна знайти великий вибір безкоштовних електронних книг. Нижче ви побачите невеликий список найкращих книг. Можна скачати безкоштовну електронну версію кожної з них або купити друковане видання (або пожертвувати) якщо хочете підтримати автора, я впевнений, що вони це оцінять.

Learn Python the Hard Way

Незважаючи на назву книги - "Не простий підхід вивчення Python", вивчення Python все також є простим заняттям-як це має бути! У цій книзі, Zed A. Shaw дає вам повний і докладний посібник, із завданнями та прикладами за допомогою яких ви можете перевірити свої сили в програмуванні. Книга написана неформальною мовою, проте детально описує безліч подробиць, тим самим у вас не виникне труднощів при її прочитанні і результат не змусить себе чекати.

Think Python: Як на Think Like a Computer Scientist

Ви не знайдете кращого джерела інформації, ніж офіційна документація python.org.

Як говорить підзаголовок, "Думати, як програміст", тут ви знайдете багато теоретичного матеріалу. Можливо новачки можуть засмутитися і книга здасться їм складною, але повірте мені, вона варта того, щоб її прочитали, тут ви знайдете інформацію про теорію алгоритмів і концепції високого рівня.

Invent With Python

Якщо вас більше цікавить практична частина, створення своєї гри, буде справді корисним досвідом! У цій книзі, Al Sweigart припускає, що ви не маєте впевненого знання Python і допомагає створити вам гру. Незважаючи на те, що ця книга про розробку ігор, вона також цілком підійде повним новачкам. Пізніше у цій статті я згадав схожу книгу, проте для неї потрібне впевнене володіння Python. Якщо ви відчуваєте, що добре знаєте мову, інша книга виявиться більш інформативним джерелом для вас.

The Django Book

У тому випадку, якщо хочете навчитися веб-розробці на Python, найімовірніше ви будете використовувати фреймворк Django. Ви можете бути не знайомі з фреймворком Django, проте повинні добре розбиратися в Python для читання цієї книги. Інформація в ній незамінна для будь-якого веб-розробника-початківця.

Книги з Python

Якщо всіх вищезгаданих книг недостатньо або вас цікавить специфічна тема, перейдіть за цим посиланням. Діти з python.org створили великий список книг, відсортували їх за складністю та тематикою.

Завдання 4: ознайомтеся зі StackOverflow

Тисячі розробників зазнали тих самих проблем, з якими вам доведеться зіткнутися віч-на-віч. StackOverflow чудове джерело інформації, де будь-який розробник може знайти вирішення своєї проблеми. Коли ви зіткнетеся з черговим багом і у вас не буде ідей, як його виправити, шукайте відповідь на StackOverflow. Швидше за все там вже є інформація, як інші люди вирішують аналогічне завдання.

Але StackOverflow відомий не лише новачками, помилками та проблемами; на цьому сайті повно дуже розумних людей, готових допомогти - навчайтеся у них!

Більшості хитрощів і порад, які ви тут знайдете, немає в жодному з туторіалів, вони будуть дуже корисні просунутим користувачам або користувачеві з середнім рівнем знань Python.

Завдання 5: проект Euler


Project Euler (вимовляється 'Oil-er", запам'ятайте це, щоб не вдарити в бруд обличчям, у майбутньому) один з моїх улюблених веб-сайтів. Після створення облікового запису, ви можете взяти участь і вирішити приблизно 400 завдань, на цьому веб-сайті Кожне завдання на 50 відсотків математики, на 50 відсотків програмування, на мій погляд, найбільш правильний підхід вивчення кожного з цих предметів.

Завдання починаються з простих, щоб перевірити ваш рівень знань мови, після чого складність зростатиме, згодом з'являться завдання, які не зможе вирішити, навіть досвідчений програміст. Зрештою, вам доведеться знайти найефективніший алгоритм - на той випадок, якщо у вас немає часу, чекати кілька годин на обчислення правильної відповіді.

Ніщо не зможе зробити вас чудовим програмістом швидше, ніж пошук найефективнішого вирішення завдань на Project Euler.

Коли вам вдасться отримати вирішення чергової проблеми, для вас відкриється сторінка форуму, де люди обговорюють рішення та ідеї один з одним щодо цього завдання. Більшість цих рішень будуть мовою Python. Це той самий ключ, який допоможе значно покращити можливості програмування. Якщо хтось знайшов швидше рішення, не бійтеся витратити час і проаналізуйте його, тим самим ви зможете зрозуміти які моменти варто переробити. З часом, ви почнете розуміти всі хитрощі і навик володіння мовою Python покращити, результат не змусить себе чекати.

На додаток до цього, є кілька інформативних блогів, де можна знайти вирішення завдань з Python на Project Euler. Якщо застрягли на якомусь завданні, нічого страшного якщо ви ознайомитеся з рішенням інших розробників, найголовніше навчитися чогось нового від них. Ось два мої улюблені блоги:

Завдання 6: створіть гру

Крім створення своєї гри, лише кілька речей можуть приносити задоволення.

Крім створення своєї гри, лише кілька речей можуть приносити задоволення. Це може виявитися досить крутою кривою під час процесу навчання, але це точно того варте. PyGame найвідоміша бібліотека для розробки ігор на Python, і вам не важко знайти безкоштовні туторіали про неї. Нижче найкращі з них.

Офіційна PyGame документація

Як і у випадку з туторіалами Python, розробники PyGame зробили документацію - введення. У матеріалі повно технічної термінології, якщо хочете приступити відразу до розробки ігор. Однак, як завжди, документація для розробників буде найкращим джерелом інформації; тому я й рекомендую цей сайт.

Invent With Python (With PyGame)

Безкоштовна електронна книга від AI Sweigart знайомить читача з бібліотекою PyGame, навіть якщо ви нічого не знаєте про цю бібліотеку, після прочитання ви зможете зробити пару ігор. Прості ігри будуть відмінним фундаментом для створення власного проекту, якщо у вас є бажання. Sweigart надає докладні коментарі до свого коду, щоб допомогти у процесі навчання.

Це черговий плейлист від The ​​New Boston. Відмінне введення в PyGame. Знову ж таки можна бути незнайомим з цією бібліотекою, читаючи книгу ви почнете розбиратися в PyGame, проте на відміну від InventWithPython ви не робитимете повноцінну гру.

Завдання 7: вивчіть популярні бібліотеки та інструменти

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

PyPy

Якщо у вас виникне бажання зібрати інформацію з HTML сторінок... BeautifulSoup зробить все необхідне та заощадить величезну кількість часу.

Виконуючи дію, які вимагають багато ресурсів процесора і вам здається, що Python споживає ці ресурси, PyPy прийде на допомогу. PyPy є альтернативним компілятором для Python, який може прискорити обчислення.

NumPy + SciPy

Ці бібліотеки зазвичай використовуються разом (SciPy залежить від NumPy). Якщо вам доведеться виконати роботу пов'язану з математичними обчисленнями або науковими дослідженнями, ці бібліотеки стануть чудовим помічником. NumPy та SciPy розширюють математичні функції та можливості Python, внаслідок чого значно прискорять вирішення поставлених завдань.

BeautifulSoup

BeautifulSoup просто приголомшливий. Збір інформації з HTML сторінок може виявитися досить стомлюючим заняттям і на вас чекає багато розчарування. BeautifulSoup зробить все за вас і заощадить величезну кількість часу. Дуже рекомендую цю бібліотеку, із нею цікаво працювати.

Python Image Library

Бібліотека для роботи із зображеннями (PIL) відмінно підходить для будь-яких завдань, пов'язаних з обробкою зображень. Якщо є необхідність будь-яким чином взаємодіяти із зображенням, швидше за все PIL допоможе виконати це завдання.

Django

Як я вже згадував у цій статті, якщо вас цікавить веб-розробка, ваш вибір – фреймворк Django. Це найпопулярніший фреймворк на Python і по ньому існує безліч навчальних ресурсів.

Завдання 8: візьміть участь у проектах з відкритим вихідним кодом

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

Тому проекти з відкритим вихідним кодом настільки популярні. Github та Bitbucket веб-сайти, звідки вам варто почати. Не хвилюйтеся, якщо люди будуть критикувати ваш код, ви не повинні робити внесок в ці проекти, негайно. Завжди можна працювати на окремій гілці цього проекту, розібратися, як він влаштований і робити з ним все що завгодно. Якщо раптом ви знайдете моменти, які слід покращити, чудово! Зробіть це і надішліть ваші поліпшення. Проекти з відкритим кодом для цього і існують.

Висновок

Сподіваюся мені вдалося надати надійну базу для вивчення мови Python для вас. На той випадок, якщо я забув згадати будь-які ресурси, дайте знати в коментарях нижче, щоб допомогти іншим користувачам!

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

Типи даних, основні конструкції

  1. Як отримати список усіх атрибутів об'єкту
  2. Як отримати список усіх публічних атрибутів об'єкту
  3. Як отримати список методів об'єкту
  4. У якій "магічній" змінній зберігається вміст help?
  5. Є два кортежі, отримати третій як конкатенацію перших двох
  6. Є два кортежі, отримати третій як поєднання унікальних елементів перших двох кортежів
  7. Чому якщо цикл змінюється список, то використовується for x in lst[:] , що означає [:] ?
  8. Існують два списки однакової довжини, в одному ключі, в іншому значення. Скласти словник.
  9. Існують два списки різної довжини, в одному ключі, в іншому значення. Скласти словник. Для ключів, для яких немає значень використовувати None як значення. Значення для яких немає ключів ігнорувати.
  10. Є словник. Інвертувати його. Тобто. пари ключ: значення поміняти місцями – значення: ключ.
  11. Є рядок в юнікоді, отримати 8-бітовий рядок у кодуванні utf-8 та CP1251
  12. Є рядок у кодуванні CP1251, отримати юнікодний рядок

Функції

    Написати функцію, якою можна передавати аргументи або списком/кортежем, або по одному. Функція здійснює підсумовування всіх аргументів.

    >>> f(1, 2, 3) 6 >>> f() 6 >>> f((3, 5, 6)) 14 >>> f(3, (5, 6)) 14

    Написати функцію-фабрику, яка повертатиме функцію додавання з аргументом.

    >>> add5 = addition(5) # функція addition повертає функцію додавання з 5 >>> add5(3) # поверне 3 + 5 = 8 8 >>> add5(8) # поверне 8 + 5 = 13 13 >>> add8 = addition(8) >>> add8(2) # поверне 2 + 8 = 10 10 >>> add8(4) # поверне 4 + 8 = 12 12

    Написати варіанти зі звичайною "внутрішньою" та анонімною lambda-функцією.

    Написати фабрику, аналогічну п.2, але яка повертає список таких функцій

    >>> additionals = addition_range(0, 5) # список з функцій додавання від 0 до 5 включно

    тобто. аналогічне

    Написати аналог map:

    • першим аргументом іде або функція, або список функцій
    • другим аргументом - список аргументів, які будуть передані функцій
    • вважається, що ці функції - функції одного аргументу
    >>> mymap(, ) [(1, 2, 3), (2, 3, 4), (3, 4, 5)]

    в даному випадку "розгорнутий" запис буде: [(add0(1), add0(2), add0(3)), (add1(1), add1(2), add1(3)), (add2(1), add2(2), add2(3))]

Ітератори

    Написати функцію-генератор cycle яка би повертала циклічний ітератор.

    >>> i = iter() >>> c = cycle(i) >>> c.next() 1 >>> c.next() 2 >>> c.next() 3 >>> c.next () 1

    Написати функцію-генератор chain, яка послідовно ітерує передані об'єкти (довільна кількість)

    >>> i1 = iter() >>> i2 = iter() >>> c = chain(i1, i2) >>> c.next() 1 >>> c.next() 2 >>> c. next() 3 >>> c.next() 4 >>> c.next() 5 >>> c.next() Traceback (most recent call last): ...

Для функцій та ітераторів написати доктести

Модулі

  1. У нас є імпортований модуль foo, як дізнатися про фізичний шлях файлу, звідки він імпортований?
  2. З модуля foo ви імпортуєте модуль feedparser. Версія X feedparser"а є в загальносистемному каталозі site-packages, версія Y - поряд з модулем foo. Визначена змінна оточення PYTHONPATH, і там теж є feedparser, версії Z. Яка версія буде використовуватися?
  3. Як переглянути список каталогів, в яких Python шукає модулі?
  4. У вас є модуль foo, в ньому імпортується модуль bar. Поруч із модулем foo є файли bar.py та bar/__init__.py Який модуль буде використовуватися.
  5. Що означає і для чого використовується конструкція __name__ == "__main__"

Класи

    Написати базовий клас Observable, який дозволяв би спадкоємцям:

    1. при передачі **kwargs заносити відповідні значення як атрибути
    2. зробити так, щоб при print відображалися всі публічні атрибути
    >>> class X(Observable): ... pass >>> x = X(foo=1, bar=5, _bazz=12, name="Amok", props=("One", "two")) >>> print x X(bar=5, foo=1, name="Amok", props=("One", "two")) >>> x.foo 1 >>> x.name "Amok" > >> x._bazz 12
  1. Написати клас, який за всіма зовнішніми ознаками був би словником, але дозволяв звертатися до ключів як до атрибутів.

    >>> x = DictAttr([("one", 1), ("two", 2), ("three", 3)]) >>> x ( "one": 1, "three": 3, "two": 2) >>> x["three"] 3 >>> x.get("one") 1 >>> x.get("five", "missing") "missing" >>> x .one 1 >>> x.five Traceback (найменший останній останній): ... AttributeError

    Пункт 2 із ускладненням: написати батьківський клас XDictAttr так, щоб у спадкоємця динамічно визначався ключ за наявністю методу get_ .

    >>> class X(XDictAttr): ... def get_foo(self): ... return 5 ... def get_bar(self): ... return 12 >>> x = X(("one": 1 , "two": 2, "three": 3)) >>> x X: ( "one": 1, "three": 3, "two": 2) >>> x["one"] 1 > >> x.three 3 >>> x.bar 12 >>> x["foo"] 5 >>> x.get("foo", "missing") 5 >>> x.get("bzz", "missing") "missing"

    Написати клас, який реєструє свої екземпляри та надає інтерфейс ітератора за ними

    >>> x = Reg() >>> x >>> y = Reg() >>> y >>> z = Reg() >>> for i in Reg: ... print i

Написати юніт-тести за основу брати тести вище, але не обмежуючись ними.

Метакласи та дескриптори

  1. Для чого використовуються, які аргументи отримують, що мають повертати: методи __new__ та __init__ класів
  2. Які аргументи отримує __new__ та __init__ у метакласу?

    Реалізувати дескриптори, які фіксували б тип атрибута

    >>> class Image(object): ... height = Property(0) ... width = Property(0) ... path = Property("/tmp/") ... size = Property(0) > >> img = Image() >>> img.height = 340 >>> img.height 340 >>> img.path = "/tmp/x00.jpeg" >>> img.path "/tmp/x00.jpeg >>>>

    Реалізувати базовий клас (використовуючи метаклас), який би фіксував тип атрибуту

    >>> class Image(Object): ... height = 0 ... width = 0 ... path = "/tmp" ... size = 0 >>> img = Image() >>> img.height = 340 >>> img.height 340 >>> img.path = "/tmp/x00.jpeg" >>> img.path "/tmp/x00.jpeg" >>> img.path = 320 Traceback (most recent call last): ... TypeError

    Реалізувати базовий клас (використовуючи метаклас) та дескриптори, які б на основі класу створювали SQL-схему (ANSI SQL) для моделі:

    >>> class Image(Table): ... height = Integer() ... width = Integer() ... path = Str(128) >>> print Image.sql() CREATE TABLE image (height integer, width integer, path varchar(128))

    реалізовувати NULL, PRIMARY KEY, FOREIGN KEY, CONSTRAINTS не потрібно. Достатньо реалізації двох типів: Integer та Str.

  • Ціль 1- допомогти посиланнями, матеріалами, тим, хто збереться вивчати програмування та першою мовою візьме Python. Показати, що це не так складно, як здається.
  • Ціль 2- Зібрати в коментарях посилання на корисні та цікаві матеріали з цієї теми.

0. А чи вийде у мене?

З самого початку я сумнівався в тому, що мені вдасться зробити щось більше, ніж Hello World. Мені здавалося, що програмування це дуже складно і понад магія. До того ж є робота, хобі, сім'я, що відволікатиметься від повноцінного вивчення.

Даремно боявся і вам не раджу. Програмування, напевно, ніколи не стане моєю основною професією, але це відмінний спосіб творчої реалізації. Це шахи та Civilization в одному флаконі.

Все простіше, ніж здається і набагато цікавіше.

1. Література

Марк Лутц "Програмування на Python"- його радять читати на багатьох форумах та курсах. Мені він здався надто докладним та навантаженим для новачка. Читати багато, мало програмувати. Набагато корисніше читати його після оволодіння Python мінімуму.

Марк Саммерфілд “Програмування на Python 3”- динамічно, з відмінними прикладами та завданнями. Без зайвого поглиблення, що тільки все ускладнює на початку. Я рекомендую почати саме з цієї книги, вона допоможе швидко вникнути, не лякаючи складнощами.

Всі інші книги виявилися менш корисними та інформативними. Взагалі, хорошу літературу з цієї теми важко просто взяти і купити в магазині або в цифровій версії.

2. Що читати в інтернеті

http://pythonworld.ru/ - простою і зрозумілою мовою розповідається про ази мови, часто використовував, як шпаргалку.

Ще через два місяці я зміг створити свій перший додаток на Django. Але головне, що тепер маю достатньо знання для самостійного розвитку та навчання. Найважче – це дістатися до цієї точки.

Ще через місяць я підключився до двох проектів на GitHub і беру участь у них. Завдання вирішую звичайно поки що прості, але натомість отримую поради та навчання.

навчання python, навчання програмуванню

Кожному, хто вивчає Python, потрібно писати код для закріплення. До вашої уваги пропонуються кілька завдань для реалізації (не надто простих (крім першої) і не надто складних).

Також для цих завдань є репозиторій із тестами та моїми рішеннями (щоб перевірити себе).

Для запуску тестів для вашої функції найпростіше додати код з папки з тестами в кінець файлу з функцією.

А тепер, власне, завдання:

Найпростіші арифметичні операції (1)

Написати функцію аритметичного, що приймає 3 аргументи: перші 2 - числа, третій - операція, яка повинна бути проведена над ними. Якщо третій аргумент + скласти їх; якщо - , то відняти; * - помножити; / - Розділити (перше на друге). В інших випадках повернути рядок "Невідома операція".

Високосний рік (2)

Написати функцію is_year_leap , що приймає 1 аргумент - рік, і повертає True, якщо високосний рік, і False інакше.

Квадрат (3)

Написати функцію square , що приймає 1 аргумент - сторону квадрата, і повертає 3 значення (за допомогою ): периметр квадрата, площа квадрата та діагональ квадрата.

Пори року (4)

Написати функцію season, що приймає 1 аргумент - номер місяця (від 1 до 12), і повертає пору року, якому цей місяць належить (зима, весна, літо чи осінь).

Банківський внесок (5)

Користувач робить внесок у розмірі a рублів строком на роки під 10% річних (кожний рік розмір його вкладу збільшується на 10%. Ці гроші додаються до суми вкладу, і на них наступного року теж будуть відсотки).

Написати функцію bank , що приймає аргументи a і years , і суму, яка повертається на рахунку користувача.

Прості числа (6)

Написати функцію is_prime , що приймає 1 аргумент - число від 0 до 1000 і повертає True, якщо воно просте, і False - інакше.

Правильна дата (7)

Написати функцію date , що приймає 3 аргументи - день, місяць та рік. Повернути True, якщо така дата є у нашому календарі, та False інакше.

XOR-шифрування (8)

Написати функцію XOR_cipher , яка приймає два аргументи: рядок, який потрібно зашифрувати, і ключ шифрування, який повертає рядок, зашифрований шляхом застосування функції XOR (^) над символами рядка з ключем. Написати також функцію XOR_uncipher , яка по зашифрованому рядку та ключу відновлює вихідний рядок.

Підготовка до співбесіди на позицію Python-розробника

Під час підготовки використовувалися матеріали: The Vital Guide to Python Interviewing , 15 Essential Python Interview Questions , 15

На сьогоднішній день число Python-програмістів продовжує зростати, проте кількість робочих місць для них збільшується не так швидко. Сучасному розробнику необхідно бути конкурентоспроможним, щоб пробитися на бажану позицію. Ми підготували статтю з темами та питаннями, які роботодавець може торкнутися співбесіди, і доповнили їх невеликими поясненнями - по суті, це завдання програмування на Python з рішеннями. Матеріал буде корисним для повторення, а початківцям допоможе зорієнтуватися, куди робити перші кроки, на що звернути увагу. Сприймайте як своєрідний маяк.

Робота зі списками

Лямбда-вирази, генератори списків та вирази-генератори

Лямбда-вирази- Скорочений метод створення однолінійних анонімних функцій. Їхня простота часто (але не завжди) робить код більш струнким і читабельним, ніж класичне оголошення функцій. З іншого боку, та ж простота обмежує можливості та зони застосування лямбда-виразів.

Генератори списківзабезпечують короткий синтаксис створення списків. Вони використовуються для складання списків, у яких кожен елемент - результат деякої операції (операцій) з елементами іншої послідовності чи ітератором. Генератори списків можуть використовуватися для створення підпослідовності елементів, члени яких задовольняють певній умові. Генератори списків Python - своєрідна альтернатива вбудованим функцій map() і filter() .

Лямбда-вирази з функціями map() і filter() і генератори списків схожі, тому вибір однієї з цих інструментів суб'єктивний залежить від випадку. Але слід зазначити, що генератори списків виконуються дещо швидше – виклик лямбда-функції створює новий стіковий кадр.

Вирази-генераторисинтаксично та функціонально схожі на генератори списків, але є важливі відмінності між їх механізмами роботи та областями застосування. Ітерація при накладенні виразу-генератора або генератора списку буде робити те ж саме, але генератор списків спочатку створить цілий список в пам'яті, в той час як вираз-генератор створюватиме елементи на ходу при необхідності. Вирази-генератори можуть бути використані у великій чи навіть нескінченній кількості послідовностей. А генерування значень на вимогу забезпечує підвищення продуктивності та зниження використання пам'яті. Проте слід зазначити, що стандартні методи списків list Python можуть застосовуватися на результатах виконання генератора, але не на самому генераторі.

У чому різниця між списком та кортежем?

Основна різниця: список може змінюватися, а кортеж – ні. Робота з кортежами швидше, ніж зі списками. Якщо необхідно визначити постійний набір значень, і все, що з ним будь-коли треба робити, - це перебирати його елементи, раціональніше використовувати кортеж замість списку. Кортеж також може бути ключем для словників, на відміну від списку.

Найпросунутіші кандидати скажуть, що кортежі неоднорідні та їх використання аналогічне використанню struct у мові програмування С. Списки ж аналогічні звичним масивам.

Налагодження коду та тестування

Який підхід ви використовуєте для модульного тестування Python?

Фундаментальна відповідь на це питання відноситься до використання фреймворку Python-unittest.

Unittest підтримує автоматизацію тестів, використання загального коду для налаштування та завершення тестів, об'єднання тестів до груп, а також дозволяє відокремлювати тести від фреймворку для формування звітів. Модуль unittest представляє класи, що спрощують підтримку цих якостей для набору тестів.

Вас можуть попросити описати ключові елементи структури unittest, а саме:

  • випробувальний стенд (test fixture);
  • тестовий випадок (test case);
  • набір тестів (test suite);
  • виконавець тестів (Test Runner).

Ітератори

Що таке ітератор?

Ітератор - інтерфейс, що надає доступ до елементів колекції (масиву або контейнера) та навігацію по них. У різних системах ітератори можуть мати різні загальноприйняті назви. У термінах систем управління базами даних ітератори називають курсорами. У найпростішому випадку ітератором у низькорівневих мовах є покажчик.

У чому різниця між ітератором та генератором?

Ці терміни тісно пов'язані (будь-який генератор - це ітератор), їх досить часто плутають, що іноді призводить до непорозуміння. Ітератор – більш загальна концепція. Це об'єкт, який має два методи: __next__ і __iter__ . З іншого боку, генератор – це ітератор. Але не навпаки. Генератор може виходити за допомогою ключового слова yield в тілі функції.

Def squares(start, stop): for i in range(start, stop): yield i generator = squares(a, b)

GIL

Концепція GIL у тому, що у кожен час лише один потік може виконуватися процесором. Це зроблено для того, щоб між потоками не було боротьби за окремі змінні. Потік, що виконується, отримує доступ до всього оточення. Така особливість реалізації потоків у Python значно спрощує роботу з потоками та дає певну потокобезпеку (thread safety).

Передача аргументів

Як передаються незмінні об'єкти?

Незмінні об'єкти передаються «за значенням». Такі об'єкти, як цілі чи рядки, передаються як посилань на об'єкти, а чи не як копій об'єктів.

Як передаються об'єкти, що змінюються?

Об'єкти, що змінюються, передаються «за вказівником». Такі об'єкти, як списки та словники, також передаються у вигляді посилань на об'єкти, що дуже схоже на те, як у мові C передаються покажчики на масиви – об'єкти, що змінюються, допускають можливість безпосередньої зміни всередині функції так само, як і масиви в мові C.

>>> def f(a): # Імені a присвоюється переданий об'єкт... a = 99 # Змінюється тільки локальна змінна... >>> b = 88 >>> f(b)# Спочатку імена a і b посилаються на те саме число 88 >>> print(b) # Змінна b не змінилася 88

У цьому фрагменті в момент виклику функції f(b) змінної a присвоюється об'єкт 88 але змінна a існує тільки всередині викликаної функції. Зміна змінної a всередині функції не впливає на оточення, звідки була викликана функція – просто в момент виклику створюється абсолютно новий об'єкт a .

Що буде виведено після другого дзвінка append() у коді нижче?

>>> def append(list=): ... # додавання довжини списку до списку... list.append(len(list)) ... return list ... >>> append(["a"," b"]) ["a", "b", 2] >>> >>> append() # виклик без аргументу використовує значення list за замовчуванням >>> >>> append() # Але що станеться при повторному виклику append без аргументу?

Коли значенням за промовчанням для аргументу функції є вираз, воно обчислюється лише один раз, а чи не завжди під час виклику функції. Таким чином, після того, як аргумент list був ініціалізований у порожній масив, подальші виклики функції без аргументів продовжать використовувати той самий масив, що був ініціалізований спочатку.

>>> append() # при першому виклику без аргументу використовується значення за замовчуванням >>> append() # але потім... >>> append() # послідовні виклики розширюють список за замовчуванням >>> append() # і так продовжується...

Як можна змінити застосування методу append у попередньому питанні, щоб уникнути небажаної поведінки, описаної там?

Є альтернативна реалізація методу append, яка вирішить проблему:

>>> def append(list=None): ... if list is None: list = # Збільшує довжину списку... list.append(len(list)) return list ... >>> append() >> > append()

Питання поза певними категоріями

Як можна змінити місцями значення двох змінних усередині рядка в Python?

Розглянемо простий приклад:

>>> x = "X" >>> y = "Y"

У багатьох інших мовах програмування при заміні значень X і Y потрібно виконати щось на зразок цього:

>>> tmp = x >>> x = y >>> y = tmp >>> x, y ("Y", "X")

Але в Python існує можливість зробити це за допомогою одного рядка коду таким чином:

>>> x,y = y,x >>> x,y ("Y", "X")

Що буде виведено останнім оператором?

>>> flist = >>> for i in range(3): ... flist.append(lambda: i) ... >>> # що буде виведено?

У будь-якому замиканні Python змінні зв'язуються по імені. Таким чином, у наведеному вище рядку коду буде виведено наступне:

>>> flist = >>> for i in range(3): ... flist.append(lambda i = i: i) ... >>>

Навіщо служить ключове слово "self"?

Ключове слово self - змінна, яка відноситься до екземпляра об'єкта. Коли створюється клас, явне посилання на об'єкт того ж типу класу відсутнє. Тому, щоб посилатися на поточний клас або об'єкт, Python використовується ключове слово self .

Class User: def __init__(self): self.name = "Ivan Ivanov" self.age = 16 user_obj = User() user_obj.name # self.name містить "Ivan Ivanov" як значення

Навіщо служить ключове слово «yield»?

Ключове слово yield може звернути будь-яку функцію у генератор. Воно працює подібно до оператора return, з тією різницею, що ключове слово повертатиме об'єкт-генератор. Також функція може здійснювати кілька дзвінків ключового слова yield.

Def testgen(index): weekdays = ["sun","mon","tue","wed","thu","fri","sat"] yield weekdays yield weekdays day = testgen(0) print next( day), next(day) #output: sun mon

Що таке __init__.py? Як імпортувати клас із іншого каталогу?

Init__.py використовується в основному для ініціалізації пакетів Python.

Файл __init__.py в каталозі lstm_m вказує інтерпретатору Python, що цей каталог має бути оброблений як пакет Python.

Як імпортувати клас із іншого каталогу?

Зазвичай __init__.py є порожнім файлом. А якщо нам потрібно використовувати lstm.py у файлі run.py, то його потрібно імпортувати таким чином:

З lstm_m import lstm

Крім того, всередині папки модуля має бути файл __init__.py, призначений для імпорту.

Які вбудовані типи існують у Python?

Існують змінні та незмінні вбудовані типи Python.

Змінювані:

  • списки;
  • множини;
  • словники.

Незмінні:

  • рядки;
  • кортежі;
  • числа.

Слід пам'ятати, що перераховані вище лише основні типи. Насправді їх понад шість.

Що таке docstring у Python?

Рядок документації в Python (docstring) - спосіб документування функцій, модулів та класів. Стандарти оформлення - на офіційному сайті.

Як можна конвертувати число в рядок?

Для перетворення числа в рядок зазвичай використовують вбудовану функцію str() , хоча є й інші способи, такі як "(0:d)".format(число) і "%d"%число. Якщо ви хочете перетворити десяткове число у вісімкове (oct - octal) або шістнадцяткове (hex - hexadecimal), використовуйте вбудовану функцію oct() або hex() відповідно.

У чому різниця між Xrange та range?

Функція xrange() повертає об'єкт xrange , тоді як range() повертає список і використовує ту саму кількість пам'яті, незалежно від розміру функції.

Як побачити методи чи атрибути об'єкта?

Команда dir(x) повертає відсортований список імен атрибутів для будь-якого переданого об'єкта. Якщо жоден об'єкт не вказано, dir() повертає імена у поточній області видимості.

Додатково

Якщо ви володієте англійською мовою, рекомендуємо пройти онлайн-тести і перевірити свої знання перед співбесідою.

Вибір матеріалів для вивчення Python від нас: , . Короткі, а також. Не забудьте вирішити завдання: ось де це можна зробити.

Висновок

Питання та поради, подані в цій статті, можуть бути дуже цінними допоміжними засобами для підготовки претендентів до співбесід. Ми сподіваємося, що розробники знайдуть їх корисними для самостійного тестування своїх знань перед зустріччю з роботодавцем. Але не слід забувати, що всі подані вище питання – один із кількох інструментів відбору кандидатів на посаду у складі певної стратегії. Готуйтеся уважно та ретельно. Успіхів!