Меня периодически спрашивают о тестовых заданиях по 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): ... StopIteration

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

Модули

  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 (most recent call last): ... 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 .

Python 3 - это современный язык, на котором просто и приятно писать программы.

Для печати значений в Питоне есть функция print(). Внутри круглых скобок через запятую мы пишем то, что хотим вывести. Вот программа, которая делает несколько вычислений:

Print(5 + 10) print(3 * 7, (17 - 2) * 8) print(2 ** 16) # две звёздочки означают возведение в степень print(37 / 3) # один слэш - это деление с ответом-дробью print(37 // 3) # два слэша считают частное от деления нацело # это как операция div в других языках print(37 % 3) # процент считает остаток от деления нацело # это как операция mod в других языках

Для ввода данных в программу мы используем функцию input() . Она считывает одну строку.

Вот программа, которая считывает имя пользователя и приветствует его:

Пётр print("Как вас зовут?") name = input() # считываем строку и кладём её в переменную name print("Здравствуйте, " + name + "!")

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

Попробуем написать программу, которая считывает два числа и выводит их сумму. Для этого считаем два числа и сохраним их в переменные a и b , пользуясь оператором присваивания = . Слева от оператора присваивания в программах на Питоне ставится имя переменной - например, строка из латинских букв. Справа от оператора присваивания ставится любое выражение. Имя станет указывать на результат вычисления выражения. Проиграйте эту программу и посмотрите на результаты её работы:

5 7 a = input() b = input() s = a + b print(s)

Мы видим, что программа выводит 57 , хотя в реальной жизни 5 + 7 будет 12 . Это произошло потому, что Питон в третьей строчке «сложил» две строки, а не два числа. В Питоне две строки складываются так: к первой строке приписывается вторая.

Обратите внимание, что в визуализаторе содержимое переменных a и b заключено в кавычки. Это означает, что в a и b лежат строки, а не числа.

В Питоне все данные называются объектами. Число 2 представляется объектом «число 2», строка "hello" – это объект «строка "hello" ».

Каждый объект относится к какому-то типу. Строки хранятся в объектах типа str , целые числа хранятся в объектах типа int , дробные числа (вещественные числа) - в объектах типа float . Тип объекта определяет, какие действия можно делать с объектами этого типа. Например, если в переменных first и second лежат объекты типа int , то их можно перемножить, а если в них лежат объекты типа str , то их перемножить нельзя:

First = 5 second = 7 print(first * second) first = "5" second = "7" print(first * second)

Чтобы преобразовать строку из цифр в целое число, воспользуемся функцией int() . Например, int("23") вернет число 23 .

Вот пример правильной программы, которая считывает два числа и выводит их сумму:

5 7 a = int(input()) b = int(input()) s = a + b print(s)

Сколько на самом деле существует языков программирования? Их насчитывается несколько десятков. Они разработаны под различные задачи, на любой вкус, размер и цвет. Почему я выбрал именно этот язык? Python способен выполнять очень широкий круг задач, начиная от простого скрипта до создания целых сайтов. Python для начинающих достаточно прост, лаконичен и удобен в изучении.

Из этой статьи вы узнаете:

Привет, привет! На связи Гридин Семён. Наконец — то, я добрался до основной тематики этого блога, программирование интеллектуальных систем с помощью языка Python. Я долго шёл к этому, готовился. И вот, я готов писать вам интересные статьи и изучать глубоко эту тему.

Для чего мне это нужно? Для начала я ставил себе такую задачу о разработке , машинного обучения и компьютерного зрения.

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

Тогда начну свою повесть))...

Возможности языка программирования Python

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

Чем же может быть полезен Python?

  1. Работа с xml/html файлами
  2. Работа с http запросами
  3. GUI (графический интерфейс)
  4. Создание веб-сценариев
  5. Работа с FTP
  6. Работа с изображениями, аудио и видео файлами
  7. Робототехника (применение одноплатных компьютеров)
  8. Программирование математических и научных вычислений

И тому подобное. Python способен выполнять львиную долю рутинных задач.

На Питоне можно собрать и резервное копирование, и работу с электронными письмами, и простейший калькулятор, и скрипт для сайта. Язык ничем не ограничен. Что самое интересное, используется в таких IT-гигантах, как Google и Yandex.

В этой статье мы рассмотрим с вами программирование Python с нуля.

Для того чтобы у вас работала программа на определённом устройстве, неважно какая ОС — windows, linux, RaspbianOS, MacOS. Важно, чтобы у вас находился интерпретатор, который будет понимать команды и выполнять.

Делаем следующим образом, скачиваем IDE python c официального источника .

Знакомство с интерпретатором

Итак интерпретатор обрабатывает текстовый код программы. Существует интерактивный режим среды разработки. Можно запустить несколькими способами:

  1. Из обычной командной строки сmd — введите команду python ;
  2. C рабочего стола (ярлык);
  3. С помощью меню Пуск — Python IDLE;

Вам откроется это окошечко:

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

Для Arduino тоже есть своя программная оболочка . Почитайте.

С чего начать обучение python? Давайте попробуем написать первую программу?

Создание первой программы

Программа на языке Python — это обычный текстовый файл с написанным кодом. Расширение этого файла.py. Запустить программу можно, указав соответствующее имя в командной строке. Напишем с вами простейшую стандартную программу «Hello world!».

Задача такая — вывести на экран "Hello world!". Запускаем NotePad.

Пишем следующий код:

Python

print ("Hello world!!!")

print ("Hello world!!!" )

И сохраняем в папку соблюдая путь C:\MyScripts . Рекомендую все проекты скидывать в эту папку.

Для того, чтобы нам запустить скрипт, выберите командную строку и введите путь к вашему файлу:

По поводу книг. На самом деле, хоть язык и прост в плане создания кода, но очень много нюансов и различных библиотек для реализации гигантского спектра задач.

Лучшая книга по python для начинающих по праву считается самоучитель Майка МакГрата. Исчерпывающее руководство по составлению кода на языке Питон.

Извините за качество фото, по другому не получается. Остальные книги пока не рекомендую покупать, так как они на самом деле громоздкие и объёмные. Для базиса достаточно будет и МакГрата.

Ребят, на этом у меня всё, если у вас есть какие-то вопросы, вы всегда можете мне написать. Подписывайтесь на новости блога. Рассылайте друзьям. Спасибо за внимание.

С уважением, Гридин Семён

Каждому изучающему Python нужно писать код для закрепления. Вашему вниманию предлагаются несколько задач для реализации (не слишком простых (кроме первой) и не слишком сложных).

Также для этих задач есть репозиторий с тестами и моими решениями (чтобы проверить себя).

Для запуска тестов для вашей функции проще всего будет добавить код из папки с тестами в конец файла с функцией.

А теперь, собственно, задачи:

Простейшие арифметические операции (1)

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

Високосный год (2)

Написать функцию is_year_leap , принимающую 1 аргумент - год, и возвращающую True, если год високосный, и False иначе.

Квадрат (3)

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

Времена года (4)

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

Банковский вклад (5)

Пользователь делает вклад в размере a рублей сроком на years лет под 10% годовых (каждый год размер его вклада увеличивается на 10%. Эти деньги прибавляются к сумме вклада, и на них в следующем году тоже будут проценты).

Написать функцию bank , принимающая аргументы a и years , и возвращающую сумму, которая будет на счету пользователя.

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

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

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

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

XOR-шифрование (8)

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

  • Цель 1 - помочь ссылками, материалами, тем, кто соберется изучать программирование и первым языком возьмет Python. Показать, что это не так сложно, как кажется.
  • Цель 2 - собрать в комментариях ссылки на полезные и интересные материалы по этой теме.

0. А получится ли у меня?

С самого начала я сомневался в том, что у меня получится сделать что-то большее чем Hello World. Мне казалось, что программирование это сверх сложно и сверх магия. К тому же есть работа, хобби, семья, что будет отвлекаться от полноценного изучения.

Зря боялся и вам не советую. Программирование наверное никогда не станет моей основной профессией, но это отличный способ творческой реализации. Это шахматы и Civilization в одном флаконе.

Все проще чем кажется и гораздо интереснее.

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

Марк Лутц “Программирование на Python” - его советуют читать на многих форумах и курсах. Мне он показался излишне подробным и нагруженным для новичка. Читать много, программировать мало. Гораздо полезнее его читать после овладевания Python минимума.

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

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

2. Что читать в интернете

http://pythonworld.ru/ - простым и понятным языком рассказывается об азах языка, часто использовал, как шпаргалку.

Еще через два месяца я смог создать свое первое приложение на Django. Но главное, что теперь у меня достаточно знания для самостоятельного развития и обучения. Самое трудное - это добраться до этой точки.

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

Теги: обучение python, обучение программированию