Привет! Мы обожаем квизы, посвященные языкам программирования. В нашем блоге мы разместили уже целых три: первый — по Python, PHP, Golang, DevOps, второй — полностью по Go, третий — только по PHP. Сегодняшний квиз посвящен исключительно Python.


Предлагаем вам размяться в честь конца ещё одной летней недели и в преддверии PyCon Russia 2018. (Кстати, кто едет? Мы там будем).


Под катом — семь вопросов, советы от друга, Чапаев, отрывки из ABBA (что? да!) и крутой мерч.



Призы


Призы распределим между десяткой лучших. Первому, кто правильно ответит на все вопросы Python-викторины, отправим продвинутый набор Авито-мерча: толстовку, носки и холиварные кости — можно будет погадать, на каком бэкенд-языке и фронтенд-фреймворке будет написан ваш новый проект. Второго участника, справившегося с заданиями, наградим холиварными костями, носками и футболкой. Третьему достанется тот же набор, но без футболки/толстовки. Среди оставшихся семи участников разыграем термобутылку с карабином, которую можно взять хоть в поход, хоть на хакатон.


image


Вопросы


*Во всех случаях речь про Python 3.


Вопрос 1


Какой результат будет в переменной t:


>>> t = (1, 2, [30,40])
>>> t[2] += [50, 60]

Варианты ответов:


  • вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),
  • вылетит TypeError, в t будет (1, 2, [30, 40]),
  • (1, 2, [30, 40, 50, 60]),
  • (1, 2, [30, 40]).

Вопрос 2


Есть у тебя такая структура модулей:


foo_app/
    snatch/
        qwerty.py
bar_app/
    snatch/
        mamamia.py

Как бы так сделать, чтобы можно было в коде импортировать эти модули таким образом:


from snatch import qwerty, mamamia

Варианты ответов:


  • перед запуском скрипта выполнить export PYTHONPATH=foo_аpp:bаr_аpp,
  • в начало скрипта добавить:
    import sys
    sys.path.extend([‘foo_app’, ‘bar_app’])
  • оба варианта выше — работающие,
  • так нельзя сделать.

Вопрос 3


Есть скрипт:


class A:
    def get_some(self):
        super().get_some()

class B:
    def get_some(self):
        print('Some')

class C(A, B):
    def get_some(self):
        super().get_some()

c = C()
c.get_some()

Что будет на выходе?


Варианты ответов:


  • AttributeError: 'C' object has no attribute 'get_some',
  • AttributeError: 'super' object has no attribute 'get_some',
  • Some,
  • пустота (без Чапаева).

Вопрос 4


Что будет выведено на экран при запуске такого кода:


class A:
   def foo(self):
       print('foo A')

class B:
   def foo(self):
       print('foo B')

class C(A, B):
   def foo(self):
       super().foo()

class D(B, A):
   def foo(self):
       super().foo()

class E(C, D): pass

e = E()
e.foo()

Варианты ответов


  • foo A,
  • foo B,
  • TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.

Вопрос 5


Представь, у тебя есть модуль foo.py:


def bar():
    print(‘Привет, друг!’)

И ты запускаешь другой скрипт:


import importlib

import foo
from foo import bar

input(‘Друг, нажми ввод’)
importlib.reload(foo)
bar()

Пока он ждет ввода, ты меняешь модуль foo.py:


def bar():
    print(‘Пока, друг!’)

Далее ты жмешь «ввод» в foo.py, чтобы он продолжил работу и видишь...


Варианты ответов:


  • ModuleReloadedException: method bar() was reloaded,
  • Пока, друг!,
  • Привет, друг!,
  • пустоту (и опять нет Чапаева).

Вопрос 6


Что будет выведено на экран при запуске такого кода:


class A:
   def __init__(self):
       print('__init__ A', end=' ')

class B:
   def __init__(self):
       print('__init__ B', end=' ')

class C(A, B): pass

c = C()

Варианты ответов:


  • __init__ A __init__ B
  • __init__ B __init__ A
  • __init__ A
  • __init__ B

Вопрос 7


Что будет в выводе после выполнения следующего кода?


def not_(value): return not value
result = not_(0), all(any([not_(x) for x in range(b)]) for b in range(10))
print(result)

Варианты ответов:


  • (True, True),
  • (True, False),
  • ValueError: need more than 2 values to unpack,
  • def not_(value): return value
                         ^
    SyntaxError: invalid syntax


Подведение итогов


Ответы на вопросы выложим апдейтом к посту в среду, 25 июля. Если будете решать — кладите ответы под спойлер, чтобы другим участникам было интереснее решать вопросики.
И (!) не забывайте проверять личку Хабра после окончания квиза.

Комментарии (54)


  1. Vadem
    19.07.2018 13:59

    Заголовок спойлера
    1. 1
    2. 3
    3. 3
    4. 3
    5. 3
    6. 3
    7. 2


    Python 3. В пятом вопросе я предположил, что идентация там правильная.


  1. acerikfy
    19.07.2018 14:00

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),
    2. оба варианта выше — работающие,
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False),


  1. Histiophryne
    19.07.2018 14:02

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. Swezy_ua
    19.07.2018 14:02

    ответ
    Вопрос 1
    вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),

    Вопрос 2
    оба варианта выше — работающие

    Вопрос 3
    Some

    Вопрос 4
    TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.

    Вопрос 5
    Привет, друг!

    Вопрос 6
    init A

    Вопрос 7
    (True, False)


  1. SlonPC
    19.07.2018 14:03

    Заголовок спойлера
    Вопрос 1
    вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),

    Вопрос 2
    оба варианта выше — работающие

    Вопрос 3
    Some

    Вопрос 4
    TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.

    Вопрос 5
    Привет, друг!

    Вопрос 6
    init A

    Вопрос 7
    (True, False)


  1. noth
    19.07.2018 14:06

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие,
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. svam4ik
    19.07.2018 14:12

    Заголовок спойлера
    1 — 1
    2 — 4
    3 — 3
    4 — 3
    5 — 4
    6 — 3
    7 — 2


  1. IIRoadRunnerII
    19.07.2018 14:12

    ответ
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. term1nal
    19.07.2018 14:12

    Заголовок спойлера
    1 — вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2 — оба варианта выше — работающие
    3 — Some
    4 — TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 — Привет, друг!
    6 — __init__ A
    7 — (True, False)


  1. alexchromets
    19.07.2018 14:12

    Скрытый текст
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. suharik
    19.07.2018 14:14

    Ответы
    1-вылетит TypeError, в t будет (1, 2, [30, 40]),
    2-import sys
    sys.path.extend([‘foo_app’, ‘bar_app’])
    3-Some,
    4-TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5-ModuleReloadedException: method bar() was reloaded,
    6-__init__ A
    7-(True, False),


  1. Tihon_V
    19.07.2018 14:16

    Скрытый текст
    1. TypeError, (1, 2, [30, 40, 50, 60])
    2. оба вариата — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. paultsv
    19.07.2018 14:20

    Заголовок спойлера
    1. Вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. так нельзя сделать.
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A.
    7. (True, False).


  1. 3t3rn1ty
    19.07.2018 14:31

    Заголовок спойлера
    1 — вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2 — •так нельзя сделать
    3 — Some
    4 — TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 — Привет, друг!
    6 — __init__ A
    7 — (True, False)


  1. nlykl
    19.07.2018 14:35

    Мои ответы
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. перед запуском скрипта выполнить export PYTHONPATH=foo_barapp:bar_app
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5. Привет, друг.
    6. __init__ A
    7. (True, False)


  1. ddreyman
    19.07.2018 14:49

    спойлер
    1. (1, 2, [30, 40, 50, 60])
    2. так нельзя сделать
    3. AttributeError: 'super' object has no attribute 'get_some'
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Пока, друг!
    6. __init__ A
    7. (True, True)


  1. sunman
    19.07.2018 14:56

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),
    2. оба варианта выше — работающие (но есть нюанс — в папках foo_app и bar_app не должно быть файла init.py, иначе интерпретатор python будет считать, что это в этих папках лежат 2 разных модуля foo_app.snatch и bar_app.snatch, и не даст подключить обе этих папки под одним и тем же именем)
    3. Some,
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!, (т.к. функция bar уже экспортирована, в первоначальном виде. Чтобы отредактированный код перезагрузился, нужно ее заново экспортировать — сделать from foo import bar)
    6. init A
    7. (True, False),


  1. shimi_elder
    19.07.2018 15:33

    Заголовок спойлера
    Вопрос 1. 3-й вариант ('(1, 2, [30, 40, 50, 60])')
    Вопрос 2. 3-й вариант ('оба варианта выше — работающие')
    Вопрос 3. 3-й вариант ('Some')
    Вопрос 4. 3-й вариант ('TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.')
    Вопрос 5. 3-й вариант ('Привет, друг!')
    Вопрос 6. 3-й вариант ('__init__ A')
    Вопрос 7. 1-й вариант ('(True, True)')


  1. VanVanuch
    19.07.2018 15:55
    +1

    Ответы
    все ответы актуальны только для python3, для python2.7 в некоторых местах будет совпадать, а в некоторых будет ошибка
    1 — вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2 — так нельзя сделать(c текущей структурой, необходимы __init__.py в модулях)
    3 — Some
    4 — TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 — Привет, друг!
    6 — __init__ A
    7 — (True, False)


  1. grt_pretender
    19.07.2018 15:55

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. antoshadcam
    19.07.2018 16:04

    Заголовок спойлера
    1 вариант 2 (1, 2, [30, 40, 50, 60])
    2 вариант 2 оба варианта выше — работающие
    3 вариант 2 some
    4 вариант 2 TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5 вариант 2 Привет, друг!
    6 вариант 2 __init__ A
    7 вариант 1 (True, False)


  1. artkra
    19.07.2018 16:21

    Заголовок спойлера
    1.2
    2.3
    3.3
    4.3
    5.3
    6.3
    7.2


  1. Zelgadiss
    19.07.2018 16:21

    1. Вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. Оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. init A
    7. (True, False)


    1. walkingpendulum Автор
      19.07.2018 16:22

      Zelgadis пожалуйста уберите ответы под кат


      1. Zelgadiss
        19.07.2018 16:27

        У меня кат недоступен среди элементов оформления.


        1. walkingpendulum Автор
          19.07.2018 16:29

          попробуйте вручную написать теги
          < \spoiler title=«Заголовок спойлера»>
          text
          </ \spoiler>

          только \ уберите перед этим


          1. Zelgadiss
            19.07.2018 16:30

            Оно ещё и для редактирования недоступно.
            Если есть возможность удалить ответ, я напишу новый.


            1. rafinirovannoe
              19.07.2018 16:34

              Да, редактировать на хабре можно только первые несколько минут. Возможно, получится удалить у вас, Zelgadiss, хотя я не уверена. Автор поста точно не может удалить комментарий.


              1. Zelgadiss
                19.07.2018 16:35

                Я тоже к сожалению не могу удалить.


                1. rafinirovannoe
                  19.07.2018 16:38

                  Что написано на Хабре — не вырубишь топором :)


  1. martbln
    19.07.2018 16:25

    Заголовок спойлера
    Вопрос 1
    вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])

    Вопрос 2
    оба варианта выше — работающие

    Вопрос 3
    Some

    Вопрос 4
    TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B

    Вопрос 5
    Привет, друг!

    Вопрос 6
    __init__ A

    Вопрос 7
    (True, False)


  1. Vash
    19.07.2018 16:40

    Скрытый текст
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


    1. walkingpendulum Автор
      19.07.2018 16:43

      Vash если есть возможность, пожалуйста, уберите ответы под кат


  1. MindHatter
    19.07.2018 16:45

    «Ответы»
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. так сделать нельзя (предложенными вариантами)
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. samodum
    19.07.2018 16:52

    Заголовок спойлера
    1) вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),
    2) оба варианта выше — работающие,
    3) Some,
    4) TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5) Привет, друг!
    6) __init__ A
    7) (True, False)


  1. Shpawel
    19.07.2018 16:55

    Заголовок спойлера
    1 — 1
    2 — 4
    3 — 2
    4 — 1
    5 — 1
    6 — 3
    7 — 2


  1. ipatov_dn
    19.07.2018 16:59

    Заголовок спойлера
    1 вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2 оба варианта выше — работающие
    3 Some
    4 TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 Привет, друг!
    6 __init__ A
    7 (True, False)


  1. maksimmysak
    19.07.2018 17:34

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. так сделать нельзя (предложенными вариантами)
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. Quyxor
    19.07.2018 18:48

    Ответы
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. оба варианта выше — работающие,
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. __init__ A
    7. (True, False),


  1. Closius
    19.07.2018 18:59

    Зачем это все?


  1. atoshin
    19.07.2018 19:29

    Заголовок спойлера
    1. 1
    2. 4
    3. 3
    4. 3
    5. 3
    6. 3
    7. 4


  1. pashcovich
    19.07.2018 21:54

    Ответы
    1) вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2) в начало скрипта добавить
    import sys
    sys.path.extend(['foo_app', 'bar_app'])

    3) Some
    4) TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5) Привет, друг!
    6) __init__ A
    7) (True, False)

    Ну и вместо символов
    и

    все таки использовать
    '


  1. remkudusov
    19.07.2018 22:57

    Ответы
    1. Вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. Оба варианта выше — работающие
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5. Привет, друг!
    6. init A
    7. (True, False)


  1. dimka665
    20.07.2018 08:22

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2. в начало скрипта добавить…
    3. Some
    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5. Привет, друг!
    6. __init__ A
    7. (True, False)


  1. hippy_azimov
    20.07.2018 08:22

    Заголовок спойлера
    1. вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])


      ??t = (1, 2, [30,40])
      ?temp = t[2]
      ?temp += [50, 60]
      ?t[2] = temp??

      https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/operator.py#L337


    2. в начало скрипта добавить:
      import sys
      sys.path.extend(['foo_app', 'bar_app'])


    3. Some


    4. TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.


    5. Привет, друг!


    6. __init__ A


    7. (True, False)



  1. overcot
    20.07.2018 10:48

    Заголовок спойлера
    1 — вылетит TypeError, в t будет (1, 2, [30, 40])
    2 — так нельзя сделать
    3 — Some
    4 — TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 — Привет, друг!,
    6 — __init__ A
    7 — (True, False)


  1. retd
    20.07.2018 11:29

    Ответы
    1 — вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60]),
    2 — оба варианта выше — работающие,
    3 — Some,
    4 — TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.
    5 — Привет, друг!,
    6 — __init__ A
    7 — (True, False),


  1. Alibeksan
    20.07.2018 13:46

    Заголовок спойлера
    1) 1
    2) 2
    3) 2
    4) 1
    5) 3
    6) 1
    7) 4


  1. JohnMark
    20.07.2018 13:46

    (с) «Но я не уверен»

    Заголовок спойлера
    1. 'вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])'
    # нельзя редакировать элементы в кортеже

    2. 'оба варианта выше — работающие'
    # *второй вариант не работает в windows и не стоит менять глобальные параметры
    # *третий вариант работает, только апострофы надо поенять на одинарные ковычки

    3. 'Some'
    # алгоритм линеаризации наследования не находит в методе 'А::get_some()' метод super().get_some()
    # поэтому вызывается метод класса 'B'

    4. 'TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B.'

    5. 'Привет, друг!'
    # т.к. метод bar() был проимпортирован отдельно 'from foo import bar'
    # если хотим чтобы менялся, надо высызвать метод из модуля 'foo.bar()'

    6. '__init__ A'
    # опять алгоритм линеаризации
    # поиск идёт слево направо

    7. '(True, False)'
    # для диапазона [0-9] метод not будет возвращать всегда 'True' для '0' и 'False' для остальных
    # т.е. всегда будет хотябы одно отличающееся значение в диапазоне
    # поэтому условие 'all' вернет 'False'


  1. alinyou
    20.07.2018 13:46

    Зачем так просто?


  1. Fian
    20.07.2018 13:46

    3/7 вопросов на знание множественного наследования, когда по-хорошему нужно знать, что множественное наследование это bad practice.


    1. walkingpendulum Автор
      20.07.2018 13:50

      множественное наследование это нормальная практика, если не доводить до чего-то такого

      (картинка из википедии)
      image


  1. institoris
    21.07.2018 12:11

    Ответы
    1: вылетит TypeError, в t будет (1, 2, [30, 40, 50, 60])
    2: оба варианта выше — работающие
    3: Some
    4: TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B
    5: Привет, друг!
    6: __init__ A
    7: (True, False)


  1. Leonid72
    22.07.2018 00:44

    Заголовок спойлера
    1 — 1
    2 — 4
    3 — 2
    4 — 1
    5 — 1
    6 — 3
    7 — 2