okpython.net
Все для начинающих

Тесты по основам Python

На странице представлены тесты на знание базовых теоретических основ Python. Желательно проходить их по ходу чтения учебника перед решением задач соответствующей темы.

На данный момент в сборнике представлено более 180 тестов по Питону с ответами и пояснениями в сложных случаях. Однако не забывайте, что нужно стараться получать верный результат самостоятельно. Если же количество неверных ответов по текущей теме достаточно велико, следует пройти тесты повторно.

Ответы к тестам группы А (*) доступны всем авторизованным пользователям, а группы В (*) – только пользователям, оформившим подписку на дополнительные учебные материалы сайта.

Введение в Пайтон

Теоретический материал по теме можно почитать во втором и третьем параграфах нашего учебника здесь и здесь.

1.1.* Выберите верные утверждения о языке программирования Python.

Варианты ответов: а) высокоуровневый,   б) низкоуровневый,   в) интерпретируемый,   г) компилируемый.   Показать решение.

Ответ. а) высокоуровневый,  в) интерпретируемый.

1.2.* Обязательно ли в Пайтоне объявлять тип переменной?

Варианты ответов: а) по желанию программиста,   б) обязательно,   в) зависит от ситуации,   г) объявлять тип не нужно.   Показать решение.

Ответ. г) объявлять тип не нужно.

1.3.* Какие из представленных фрагментов кода являются литералами?

Варианты ответов: а) '#',   б) 0.77,   в) 5**2,   г) b = [1, 2].   Показать решение.

Ответ. а) '#',  б) 0.77.

'#' – литерал строки, 0.77 – литерал вещественного числа, 5**2 – выражение, b = [1, 2] – инструкция присваивания значения.

1.4.* Какие из предлагаемых имен допустимы в Python?

Варианты ответов: а) s_5,   б) _5s,   в) 5_s,   г) Щ5.   Показать решение.

Ответ. а) s_5,  б) _5s,  г) Щ5.

В Питоне имена чувствительны к регистру символов, должны начинаться с буквы любого алфавита в Юникоде или символа подчеркивания (_), после чего могут следовать любые буквы, цифры или символы подчеркивания. При этом с цифры имена начинаться не должны, иначе интерпретатор не сможет отличить их от чисел.

1.5.* Что по умолчанию служит концом инструкции в Python?

Варианты ответов: а) конец строки,   б) запятая,   в) точка,   г) точка с запятой.   Показать решение.

Ответ. а) конец строки.

Общее правило в Python гласит, что конец строки автоматически считается концом инструкции, находящейся в этой строке. Точка же с запятой необходима для разделения коротких инструкций, расположенных друг за другом в одной строке.

1.6.* Для выделения блоков кода одного уровня вложенности в Питоне используются...

Варианты ответов: а) круглые скобки,   б) квадратные скобки,   в) фигурные скобки,   г) идентичные отступы.   Показать решение.

Ответ. г) идентичные отступы.

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

1.7.* Какие из представленных символов или их комбинаций используются в Python для комментирования кода?

Варианты ответов: а) #,   б) //,   в) <!-- -->,   г) /* */.   Показать решение.

Ответ. а) #.

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

Числа и математические выражения

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

2.1.* Какой тип данных в Python представляет целые числа?

Варианты ответов: а) complex,   б) float,   в) int,   г) bool.   Показать решение.

Ответ. в) int.

2.2.* Какие из представленых литералов чисел относятся к типу float?

Варианты ответов: а) 1.7+4.3j,   б) 5.0,   в) 88,   г) -.4?   Показать решение.

Ответ. б) 5.0,  г) -.4.

Ноль для действительных чисел разрешается опускать, используя только точку.

2.3.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2.5,   б) 2,   в) 3,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 5
y = 2
z = x//y
print(z)

Ответ. б) 2.

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

2.4.* Что будет выведено на экран в результате выполнения инструкции print(4 + 3.0)?

Варианты ответов: а) 7.0,   б) 4 + 3.0,   в) 7,   г) ошибка.   Показать решение.

Ответ. а) 7.0.

Результат был приведен к более общему типу, т.е. типу float.

2.5.* Какое число будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2.5,   б) 1,   в) 0.1,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 5
y = 2
z = x%y
print(z)

Ответ. б) 1.

Получили остаток от деления.

2.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 5,   б) 0,   в) 10,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 5
x += x - x
print(x)

Ответ. а) 5.

Эквивалентно инструкции x = x + x - x.

2.7.* Выберите литералы чисел, представленные в шестнадцатеричной системе счисления.

Варианты ответов: а) 0X755,   б) 16755,   в) 0x1101,   г) 0o1675. Показать решение.

Ответ. а) 0X755,  в) 0x1101.

В шестнадцатеричной системе счисления запись целого числа должна начинаться с нуля и латинской буквы X в верхнем или нижнем регистре (т.е. 0x или 0X), после чего должны идти символы последовательности 0123456789ABCDEF, представляющих данную систему счисления. При этом буквы также разрешается использовать в любом регистре. Например, 0x7F, 0XDD5A, -0xfF9. Если будут использованы символы не входящие в данный диапазон, интерпретатор сгенерирует сообщение об ошибке.

2.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 9.0,   б) 9,   в) 6.0 + 3,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 3
y = 3.0
z = '3'
print(x + y + z)

Ответ. г) ошибка.

Числа разных типов могут участвовать в операции сложения и вычитания, а вот числа и строки – нет.

2.9.* Какой оператор используется для получения остатка от деления в Python?

Варианты ответов: а) /,   б) //,   в) **,   г) %. Показать решение.

Ответ. г) %.

2.10.* Что будет выведено на экран в результате выполнения инструкции print(5**(5 - 2))?

Варианты ответов: а) 15,   б) 125,   в) 45.0,   г) ошибка.   Показать решение.

Ответ. б) 125.

Сочетание символов ** используется в Питоне для возведения в степень. При этом 0**0 = 1.

2.11.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 9.4,   б) 9.35,   в) 9.15,   г) 9.45.   Показать решение.

Условие pythonCodes
x = round(3.153, 2)
y = round(6.25)
print(x + y)

Ответ. в) 9.15.

Первое число было округлено до двух знаков после запятой, а второе до целой части (по умолчанию). Поэтому и получили 3.15 + 6 = 9.15.

2.12.* Какая из встроенных функций Python может быть использована для нахождения модуля числа?

Варианты ответов: а) round,   б) abs,   в) divmod,   г) pow.   Показать решение.

Ответ. б) abs.

2.13.* Выберите допустимые записи вещественного числа 0.135 в исходном коде.

Варианты ответов: а) 135E-1,   б) 1.35e-1,   в) .135,   г) 1.35-e1.   Показать решение.

Ответ. б) 1.35e-1,  в) .135.

В Пайтон допустима запись вещественных чисел в экспоненциальной форме. При этом для представления степени 10n используется латинская буква E в верхнем или нижнем регистре (т.е. e или E), следующий за ней необязательный знак плюс или обязательный знак минус, а также сам показатель степени в виде положительного целого числа или нуля. Кроме того, ведущий ноль разрешается опускать.

Текстовые строки

Теоретический материал по строкам можно почитать в нашем учебнике здесь.

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

3.1.* Посчитайте количество литералов строк среди предложенных: '-23.5', '2 + 3', "яблоко", ['груша'], "[5, 7]".

Варианты ответов: а) 2,   б) 3,   в) 4,   г) 5.   Показать решение.

Ответ. в) 4.

'-23.5' и '2 + 3' – строки в одинарных кавычках, "яблоко" и "[5, 7]" – строки в двойных кавычках.

3.2.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 7 + 3,   б) 10,   в) 73,   г) ошибка.   Показать решение.

Условие pythonCodes
x = '7'
y = '3'
z = x + y
print(z)

Ответ. в) 73.

В результате конкатенации строк '7' + '3' получили строку '73'.

3.3.* Какой из операторов используется для повторения строки в Python?

Варианты ответов: а) +,   б) *,   в) /,   г) %.   Показать решение.

Ответ. б) *.

Например, результатом выполнения инструкции 'б'*3 будет строка 'ббб'.

3.4.* Какая последовательность символов представляет собой экранированную последовательность, соответствующую переводу строки?

Варианты ответов: а) \n,   б) /n,   в) \\n,   г) //n.   Показать решение.

Ответ. а) \n.

Экранированная последовательность – это специальная последовательность символов, начинающаяся со знака обратного слеша, которая обозначает символ, не всегда представимый внутри строки другими способами. Например, \n или \u000A – перевод строки, \" или \u0022 – двойная кавычка и т.д.

3.5.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 55,   б) 52,   в) 25,   г) ошибка.   Показать решение.

Условие pythonCodes
x = '5'
y = '2'
z = x*int(y)
print(z)

Ответ. а) 55.

Здесь строка '2' была сперва приведена к целому чилу. Поэтому в результате умножения '5'*2 была получена строка '55'.

3.6.* Что будет выведено на экран в результате выполнения инструкции print("123456789"[5])?

Варианты ответов: а) 12345,   б) 5,   в) 6,   г) ошибка.   Показать решение.

Ответ. в) 6.

Все символы строки нумеруются, начиная с нуля. Поэтому на экран будет выведен символ строки '6', т.е. символ с индексом 5.

3.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 33,   б) 6,   в) 32,   г) ошибка.   Показать решение.

Условие pythonCodes
x = '3'
y = '2'
z = int(x*y)
print(z)

Ответ. г) ошибка.

Операция умножения строк между собой в Питоне не разрешена.

3.8.* Какой из методов используется для преобразования строки в верхний регистр?

Варианты ответов: а) upper(),   б) capitalize(),   в) lower(),   г) title().  Показать решение.

Ответ. а) upper().

Например, 'she'.upper() вернет копию строки 'SHE'.

3.9.* Что будет выведено на экран в результате выполнения инструкции print("123456789"[:5])?

Варианты ответов: а) 12345,   б) 5,   в) 6,   г) ошибка.   Показать решение.

Ответ. а) 12345.

Здесь нужно получить срез строки, начиная с первого символа с индексом 0 и заканчивая символом с индексом 4 (это '5').

3.10.* Что выведет на экран инструкция print('okpython.net\')?

Варианты ответов: а) okpython.net,   б) okpython.net\,   в) okpython.net\',   г) ошибка.  Показать решение.

Ответ. г) ошибка.

Неформатированные строки не могут заканчиваться неэкранированным символом обратного слеша, т.к. он будет экранировать кавычки в конце строки. В таких случаях можно добавить его отдельно при помощи конкатенации (например, r'D:\text' + '\\'), продублировать и затем удалить при помощи среза (например, r'D:\text\\'[:-1]) или не использовать подавление вообще, экранировав все слеши в обычной строке (например, 'D:\\text\\').

3.11.* Какой из методов используется для соединения подстрок в одну строку по заданному разделителю?

Варианты ответов: а) split(),   б) join(),   в) replace(),   г) strip().  Показать решение.

Ответ. б) join().

Например, ''.join(['G', 'P', 'T', '5']) вернет строку 'GPT5'.

3.12.* Дана строка s = "012345". Перечислите инструкции, которые выведут на экран 3.

Варианты ответов: а) print(s[3]),   б) print(s[-3]),   в) print(s[3::3]),   г) все предыдущие варианты.  Показать решение.

Ответ. г) все предыдущие варианты.

Символ строки '3' доступен по положительному индексу 3, т.к. нумерация символов начинается с нуля, а также по отрицательному индексу -3, если получать доступ к нему с конца строки (в этом случае нумерация начинается с -1). Также данный символ является первым и единственным символом среза строки s[3::3], поскольку для получения второго элемента среза у строки не хватает длины.

3.13.* Что будет выведено на экран в результате выполнения инструкции print('Гостиница 'Орбита', 3 звезды.')?

Варианты ответов: а) Гостиница Орбита, 3 звезды.,   б) Гостиница 'Орбита', 3 звезды.,   в) 'Гостиница 'Орбита', 3 звезды.',   г) ошибка.   Показать решение.

Ответ. г) ошибка.

Использование кавычек любого разрешенного типа внутри строковых литералов, заключенных в кавычки того же типа, разрешается при условии предварительного экранирования их при помощи обратного слеша. В нашем случае правильно было бы написать print('Гостиница \'Орбита\', 3 звезды.'). Также можно было бы использовать двойные кавычки.

3.14.* Что возвращает функция len() при передаче в неё строки?

Варианты ответов: а) количество слов,   б) количество символов,   в) количество байт,   г) ошибка.  Показать решение.

Ответ. б) количество символов.

Например, len("груша") вернет 5.

3.15.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) ccc,   б) bbb,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
s = 'abc'*3
s = s[2] + s[5]
s += s[8]
print(s)

Ответ. г) ошибка.

После выполнения второй инструкции s = s[2] + s[5] в переменной будет храниться строка 'cc' длиной в два символа. Поэтому попытка получения символа строки с индексом 8 приведет к ошибке.

3.16.* Какой из методов используется для удаления пробельных символов с начала и конца строки?

Варианты ответов: а) lstrip(),   б) rstrip(),   в) strip(),   г) все предыдущие варианты.  Показать решение.

Ответ. в) strip().

Например, ' ddd '.strip() вернет 'ddd'.

3.17.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 6,   б) 7,   в) 8,   г) 9.   Показать решение.

Условие pythonCodes
s = 'bc abc aabc'
s = s.replace('a', 'bc')
s = s.replace('bc', '1')
print(len(s))

Ответ. в) 8.

После выполнения инструкций замены в переменной будет храниться строка '1 11 111' длиной в восемь символов.

3.18.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 'холливуд',   б) 'голливуд',   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
s_1 = 'холливуд'
s_2 = s_1
s_2[0] = 'г'
print(s_1)

Ответ. г) ошибка.

Помним, что строки неизменяемы. Поэтому инструкция s_2[0] = 'г' приведет к ошибке.

Списки

Теоретический материал по спискам можно почитать в нашем учебнике здесь.

Не забываем, что списки, в отличие от строк и кортежей, мы можем изменять непосредственно.

4.1.* Какие из представленых литералов относятся к типу list?

Варианты ответов: а) ['1', '2', '3'],   б) '[1, 2, 3]',   в) [(1, 2, 3)],   г) ([1], [2], [3]).   Показать решение.

Ответ. а) ['1', '2', '3'],  в) [(1, 2, 3)].

['1', '2', '3'] – список из трех строковых элементов, а [(1, 2, 3)] – список из одного элемента в виде кортежа.

4.2.* Как в Пайтоне создать пустой список?

Варианты ответов: а) li = [],   б) li = None,   в) li = 0,   г) li = list().   Показать решение.

Ответ. а) li = [],  г) li = list().

4.3.* Выберите верные утверждения о списках.

Варианты ответов: а) неизменяемые,   б) упорядоченные,   в) последовательности,   г) изменяемые.   Показать решение.

Ответ. б) упорядоченые,  в) последовательности,  г) изменяемые.

4.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) [3],   б) [1, 1, 1],   в) [1, 1, 1, 1],   г) ошибка.   Показать решение.

Условие pythonCodes
li = [1]
li += li*3
print(li)

Ответ. в) [1, 1, 1, 1].

В первой инструкции был создан список с одним элементом. Во второй инструкции к нему был присоединен список [1, 1, 1], полученный в результате операции умножения li*3 (объединение с самим собой 3 раза, т.е. li + li + li).

4.5.* Как добавить элемент elem в конец списка li?

Варианты ответов: а) li.append(elem),   б) li.insert(len(li), elem),   в) li.extend([elem]),   г) li += [elem].   Показать решение.

Ответ. Все варианты верны.

И это еще не все. Можно, например, использовать срез li[len(li):len(li)] = [elem]

4.6.* Что будет выведено на экран в результате выполнения инструкции print(['a', 'b', 'cd', 'e', 'f'][3])?

Варианты ответов: а) d,   б) e,   в) cd,   г) c.   Показать решение.

Ответ. б) e.

В списке содержится пять строковых элементов, просто один элемент представляет собой строку из двух символов. Элементом с индексом 3 является строка 'e'.

4.7.* Как удалить из списка li элемент elem по его индексу i?

Варианты ответов: а) li.pop(i),   б) del li[i],   в) li.remove(elem),   г) li.clear().   Показать решение.

Ответ. а) li.pop(i),  б) del li[i].

Третий вариант удаляет из списка первый попавшийся элемент, имеющий значение elem. Последний вариант удаляет все элементы из списка.

4.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) [1, 2, 3, 4, 5],   б) [1, 2, 4, 5],   в) [1, 3, 4, 5],   г) ошибка.   Показать решение.

Условие pythonCodes
li = [1, 2, 3, 4, 5]
li = li[0:2] + li[3:]
print(li)

Ответ. б) [1, 2, 4, 5].

Во второй инструкции объединяются списки [1, 2] (результат среза li[0:2]) и [4, 5] (результат среза li[3:]).

4.9.* Дан список li = ['a', 'b', 'cd', 'e', 'f']. Перечислите инструкции, которые выведут на экран символ d.

Варианты ответов: а) print(li[2][1]),   б) print(li[2][2]),   в) print(li[3]),   г) print(li[-3][1]).  Показать решение.

Ответ. а) print(li[2][1]),  г) print(li[-3][1]).

Для доступа к элементам списка, которые сами являются последовательностями, используется цепочка квадратных скобок с указанием требуемых индексов. В нашем случае доступ к строке 'cd' можно получить через li[2] или же через li[-3], если считать с конца списка. Вторые квадратные скобки дают доступ уже к самому символу 'd' строки.

4.10.* Как в Пайтоне объединить два списка в один?

Варианты ответов: а) li_1.join(li_2),   б) li_1 + li_2,   в) li_1.extend(li_2),   г) li_1.append(li_2).   Показать решение.

Ответ. б) li_1 + li_2,  в) li_1.extend(li_2).

Метод join() имеется у строк, у списков такой метод отсутствует. В последнем случае метод append() не объединит списки, а добавит второй список в первый в качестве нового элемента.

4.11.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) True,   б) None,   в) False,   г) ошибка.   Показать решение.

Условие pythonCodes
li = ['a', 'b', ['cd'], 'e', 'f']
ans = 'cd' in li
print(ans)

Ответ. в) False.

В списке li имеется элемент ['cd'] (список), а не 'cd' (строка).

4.12.* Как в Питоне обратить порядок элементов в списке?

Варианты ответов: а) li.reverse(),   б) li = li[::-1],   в) reverse(li),   г) никак.   Показать решение.

Ответ. а) li.reverse(),  б) li = li[::-1].

Встроенная функция reverse() в Пайтоне отсутствует.

4.13.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) ['теплое', 'море'],   б) ['холодное', 'море'],   в) ['холодное', 'теплое', 'море'],   г) ошибка.   Показать решение.

Условие pythonCodes
li_1 = ['теплое', 'море']
li_2 = li_1
li_2[0] = 'холодное'
print(li_1)

Ответ. б) ['холодное', 'море'].

Обе ссылки li_1 и li_2 ссылаются на один и тот же изменяемый объект (список) в памяти и полное или частичное изменение этого объекта доступно через любую из них. Соответственно через любую из ссылок видны и последствия таких изменений.

4.14.* Как добавить элемент x в конец списка li, используя срез?

Варианты ответов: а) li[len(li):len(li)] = [x],   б) li[len(li):len(li)] = x,   в) li[-1:] = [x],   г) li[-1:] = x.   Показать решение.

Ответ. а) li[len(li):len(li)] = [x].

Самостоятельно подумайте над результатами выполнения всех предложенных инструкций и проверьте ответы в интерпретаторе.

4.15.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) [1, 2, 3],   б) [1, 2, 3, 'abc'],   в) [1, 2, 3, 'a', 'b', 'c'],   г) ошибка.   Показать решение.

Условие pythonCodes
li = [1, 2, 3]
li.extend('abc')
print(li)

Ответ. в) [1, 2, 3, 'a', 'b', 'c'].

li.extend(iterable) – добавляет элементы из итерируемого объекта iterable в конец списка li (тоже самое что и li[len(li):len(li)] = iterable).

Кортежи

Теоретический материал по кортежам можно почитать в нашем учебнике здесь.

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

5.1.* Какой тип данных в Python представляет кортежи?

Варианты ответов: а) dict,   б) list,   в) tuple,   г) set.   Показать решение.

Ответ. в) tuple.

dict – словарь, list – список, set – множество.

5.2.* Выберите верные утверждения о кортежах.

Варианты ответов: а) неизменяемые,   б) изменяемые,   в) неупорядоченые,   г) упорядоченые.   Показать решение.

Ответ. а) неизменяемые,  г) упорядоченные.

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

5.3.* Какие из представленых литералов относятся к кортежам?

Варианты ответов: а) (1,),   б) '(1, 2, 3)',   в) ([1, 2, 3]),   г) ("Питон").   Показать решение.

Ответ. а) (1,),  г) ("Питон",).

Вариант б) – строка, в) – список.

5.4.* Как в Python создать пустой кортеж?

Варианты ответов: а) tpl = (),   б) tpl = {},   в) tpl = tuple(),   г) tpl = tuple(0).   Показать решение.

Ответ. а) tpl = (),  в) tpl = tuple().

Вариант б) – пустой словарь, г) – ошибка, т.к. в конструктор нужно передавать итерируемый объект.

5.5.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) (3,),   б) (1, 1, 1),   в) (1, 1, 1, 1),   г) ошибка.   Показать решение.

Условие pythonCodes
t = (1,)
t += t*3
del t[0]
print(t)

Ответ. г) ошибка.

Кортежи неизменяемы, а значит удалять элементы из них запрещается.

5.6.* Как удалить из кортежа tpl элемент elem с индексом i?

Варианты ответов: а) tpl.pop(i),   б) del tpl[i],   в) tpl.remove(elem),   г) никак.   Показать решение.

Ответ. г) никак.

Кортежи неизменяемы, а значит удалять элементы из них запрещается.

5.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) (1,),   б) (1, [2]),   в) (1, [3]),   г) ошибка.   Показать решение.

Условие pythonCodes
tpl = (1, [2, 3])
del tpl[1][1]
print(tpl)

Ответ. б) (1, [2]).

Здесь все в порядке, т.к. элемент кортежа, которым является список, не удаляется, а изменяется.

5.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 0----,   б) 76543,   в) 10987,   г) ----.   Показать решение.

Условие pythonCodes
tpl = (1, 2, ('-3-4-5-6', '-7-8-9-10'))
print(tpl[2][1][-1::-2])

Ответ. а) 0----.

Здесь был получен доступ к строке '-7-8-9-10' вложенного кортежа и взят ее срез с использованием отрицательного шага.

Словари

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

6.1.* Какой тип данных в Python представляет словари?

Варианты ответов: а) dict,   б) list,   в) tuple,   г) set.   Показать решение.

Ответ. а) dict.

list – список, tuple – кортеж, set – множество.

6.2.* Какие из утверждений о словарях верны?

Варианты ответов: а) изменяемые,   б) неизменяемые,   в) доступ к элементам по индексу,   г) доступ к элементам по ключу.   Показать решение.

Ответ. а) изменяемые,  г) доступ к элементам по ключу.

6.3.* Какие из представленых литералов относятся к словарям?

Варианты ответов: а) {'красный', 'синий'},   б) {1: 'Январь', 2: 'Февраль'},   в) ({'name': 'Оля'}, {'age': 18}),   г) {'list': [1, 2, 3]}.   Показать решение.

Ответ. б) {1: 'Январь', 2: 'Февраль'},  г) {'list': [1, 2, 3]}.

Вариант а) – множество, в) – кортеж из двух словарей.

6.4.* Как в Питоне создать пустой словарь?

Варианты ответов: а) d = dict(),   б) d = (),   в) d = {},   г) d = [].   Показать решение.

Ответ. а) d = dict(),  в) d = {}.

Вариант б) – пустой кортеж, г) – пустой список.

6.5.* Выберите верные способы создания словаря с двумя элементами.

Варианты ответов: а) d = dict(name='Eva', age=33),   б) d = dict(('name', 'Eva'), ('age', 33)),   в) d = dict('name'='Eva', 'age'=33),   г) d = dict((name, 'Eva'), (age, 33)).   Показать решение.

Ответ. а) d = dict(name='Eva', age=33),  б) d = dict(('name', 'Eva'), ('age', 33)).

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

6.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2,   б) 3,   в) 4,   г) ошибка.   Показать решение.

Условие pythonCodes
d = {1: 'a', '2': ['b', {'c': 3}], (5, '6'): ('f', 'g')}
print(len(d))

Ответ. б) 3.

Словарь содержит три элемента с ключами 1, '2' и (5, '6').

6.7.* Какие из представленых литералов могут быть использованы в качестве ключей словаря?

Варианты ответов: а) (1,),   б) [2,],   в) '3',   г) -.4.   Показать решение.

Ответ. а) (1,),  в) '3',  г) -.4.

В качестве ключей разрешается использовать только хешируемые элементы. Так что список отпадает.

6.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1, 1, 1},   б) {'1', '1', '1'},   в) {1: '1', 1: '1', 1: '1'},   г) ошибка.   Показать решение.

Условие pythonCodes
d = {1: '1'}
d += d*2
print(d)

Ответ. г) ошибка.

Операция умножения на число для словарей не определена.

6.9.* Как получить значение из словаря d по ключу key?

Варианты ответов: а) d.value(key),   б) d[key],   в) d.get(key),   г) d.setdefault(key).   Показать решение.

Ответ. б) d[key],  в) d.get(key),  г) d.setdefault(key).

Метод value() у словарей отсутствует.

6.10.* Как удалить значение из словаря d по ключу key?

Варианты ответов: а) del d[key],   б) d.pop(key),   в) d.remove(key),   г) никак.   Показать решение.

Ответ. а) del d[key],  б) d.pop(key).

Метод remove() у словарей отсутствует.

6.11.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1: 'one', 2: 'два', 3: 'три'},   б) {},   в) {1: 'один', 2: 'два', 3: 'три'},   г) ошибка.   Показать решение.

Условие pythonCodes
d = {1: 'one'}
d.update([(1, 'один'), (2, 'два')])
d[3] = 'три'
print(d)

Ответ. в) {1: 'один', 2: 'два', 3: 'три'}.

В процессе обновления словаря значение 'one' ключа 1 было обновлено значением 'один'.

6.12.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) ['a', 'b'],   б) ['a', 'b', 'c'],   в) dict_keys(['a', 'b']),   г) ошибка.   Показать решение.

Условие pythonCodes
d = {'a': 1, 'b': 2, 'c': 3}
k = d.keys()
del d['c']
print(list(k))

Ответ. а) ['a', 'b'].

Здесь стоит помнить, что представление ключей динамически изменяется в процессе изменения словаря.

Множества

Теоретический материал по множествам можно почитать в нашем учебнике здесь.

7.1.* Какой тип данных в Питоне представляет множества?

Варианты ответов: а) tuple,   б) list,   в) dict,   г) set.   Показать решение.

Ответ. г) set.

7.2.* Какие из утверждений о множествах верны?

Варианты ответов: а) коллекции неизменяемых объектов,   б) изменяемые коллекции объектов,   в) неупорядоченные коллекции объектов,   г) упорядоченные коллекции объектов.   Показать решение.

Ответ. а) коллекции неизменяемых объектов,  б) изменяемые коллекции объектов,  в) неупорядоченные коллекции объектов.

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

7.3.* Какие из представленых литералов относятся к типу set?

Варианты ответов: а) {'кот', "ток"},   б) "{1, 2, 3}",   в) {[], (), {}, ''},   г) [{'set': {1, 2, 3}}].   Показать решение.

Ответ. а) {'кот', "ток"},  в) {[], (), {}, ''}.

Вариант б) – строка, г) – список.

7.4.* Как создать пустое множество в Пайтоне?

Варианты ответов: а) st = (),   б) st = set(),   в) st = [],   г) st = {}.   Показать решение.

Ответ. б) st = set().

Вариант а) – пустой кортеж, в) – пустой список, г) – пустой словарь.

7.5.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {3},   б) {1, 1, 1},   в) {1, 1, 1, 1},   г) ошибка.   Показать решение.

Условие pythonCodes
st = {1}
st += st*3
print(st)

Ответ. г) ошибка.

Как и для словарей, операция умножения на число у множеств не определена.

7.6.* Даны два множества {'a', 'b', 'c'} и {'b', 'c', 'd'}. Какое из множеств является их пересечением?

Варианты ответов: а) {'a', 'b'},   б) {'b', 'c'},   в) {'c', 'd'},   г) {}.   Показать решение.

Ответ. б) {'b', 'c'}.

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

7.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {'о', 'н', 'л', 'а', 'я'},   б) {'о'},   в) {'н', 'а'},   г) ошибка.   Показать решение.

Условие pythonCodes
st_1 = {'о', 'н', 'а'}
st_2 = {'о', 'л', 'я'}
print(st_1 | st_2)

Ответ. а) {'о', 'н', 'л', 'а', 'я'}.

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

7.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1, 2, 3},   б) {(2, 3), 1},   в) {2, 3},   г) ошибка.   Показать решение.

Условие pythonCodes
st = set()
st.add(1)
st.add((2, 3))
print(st)

Ответ. б) {(2, 3), 1}.

Добавлять неизменяемые элементы в множество разрешается.

7.9.* Как удалить элемент elem из множества st?

Варианты ответов: а) st.remove(elem),   б) st.discard(elem),   в) st.pop(elem),   г) никак.   Показать решение.

Ответ. а) st.remove(elem),  б) st.discard(elem).

Метод pop() у множеств не принимает в качестве аргумента элемент. Он просто удаляет и возвращает произвольный элемент множества или, если множество окажется пустым, возбуждает исключение KeyError.

7.10.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1, 2, 3, 4},   б) {(1, 2), [3, 4]},   в) [3, 4],   г) ошибка.   Показать решение.

Условие pythonCodes
st = set()
st.add((1, 2))
st.add([3, 4])
print(st)

Ответ. г) ошибка.

Добавлять изменяемые элементы в множество запрещается.

7.11.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {'1', '2'},   б) {},   в) {1, 2, '1', '2'},   г) ошибка.   Показать решение.

Условие pythonCodes
fst = frozenset({1, 2})	
fst.clear()
fst.add('1', '2')
print(fst)

Ответ. г) ошибка.

Изменять замороженное множество запрещается.

7.12.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1, 2, 3},   б) True,   в) None,   г) ошибка.   Показать решение.

Условие pythonCodes
st_1 = {1, 2}
st_2 = st_1.add(3)
print(st_2)

Ответ. в) None.

Элемент в множество st_1 конечно же добавлен будет. Однако метод хоть и изменяет свое множество, но возвращает не его, а значение None.

Логический тип

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

8.1.* Какой тип данных в Пайтоне представляет логические значения?

Варианты ответов: а) NoneType,   б) bool,   в) float,   г) int.   Показать решение.

Ответ. б) bool.

NoneType – тип NoneType, float – вещественные числа, int – целые числа.

8.2.* Выберите верные варианты написания имен булевых констант.

Варианты ответов: а) TRUE,   б) True,   в) false,   г) False.   Показать решение.

Ответ. б) True,  г) False.

Регистр написания имен имеет значение.

8.3.* Какое значение будет иметь выражение True and False?

Варианты ответов: а) True,   б) False,   в) None,   г) ошибка.   Показать решение.

Ответ. б) False.

Еще раз посмотрите таблицу №3 параграфа.

8.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1,   б) 10,   в) 11,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 10
res = True + x*False
print(res)

Ответ. а) 1.

Булевы константы можно использовать в математических выражениях на равных с числами, оперируя True как 1, а False как 0.

8.5.* Что выведет на экран инструкция print(False < (7 <= 10))?

Варианты ответов: а) None,   б) True,   в) False,   г) ошибка.   Показать решение.

Ответ. б) True.

Операции сравнения возвращают булевы значения, кроме того, 0 < 1 (см. предыдущий тест).

8.6.* Что выведет на экран инструкция print(11 > 0 is True)?

Варианты ответов: а) None,   б) True,   в) False,   г) ошибка.   Показать решение.

Ответ. в) False.

11 > 0 is True эквивалентно (11 > 0) and (0 is True). Это касасется и других комбинированных условий сравнения: в общем виде expr_1 op expr_2 op expr_3 эквивалентно (expr_1 op expr_2) and (expr_2 op expr_3).

8.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3 or три,   б) 3,   в) три,   г) True.   Показать решение.

Условие pythonCodes
x = 3
y = 'три'
print(x or y)

Ответ. б) 3.

Здесь 3 интерпретируется как True, поэтому правый операнд уже не вычислялся. Вместо этого был просто возвращен результат вычисления левого операнда (см. подробнее в учебнике).

8.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) Ok!,   б) not True or foo(),   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
def foo(): print('Ok!')
not True or foo()

Ответ. а) Ok!.

Здесь наоборот, not True интерпретируется как False, поэтому был возвращен результат вычисления правого операнда, т.е. вызов функции (см. подробнее в учебнике).

Приведение типов

Теоретический материал по приведению типов можно почитать в нашем учебнике здесь.

9.1.* Каким будет результат преобразования типа для инструкции bool(-1)?

Варианты ответов: а) False,   б) True,   в) None,   г) 1.   Показать решение.

Ответ. б) True.

Среди чисел только нулевые значения преобразуются в False.

9.2.* Каким будет результат преобразования типа для инструкции str([1, '2', 3])?

Варианты ответов: а) [1, '2', 3],   б) "1, '2', 3",   в) "[1, '2', 3]",   г) ['1', '2', '3'].   Показать решение.

Ответ. в) "[1, '2', 3]".

Будет выведено строковое представление объекта, в данном случае списка.

9.3.* Каким будет результат преобразования типа для инструкции float('-42 ')?

Варианты ответов: а) -42,   б) -42.0,   в) -4.2e-1,   г) ошибка.   Показать решение.

Ответ. б) -42.0.

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

9.4.* Каким будет результат преобразования типа для инструкции bool(' False ')?

Варианты ответов: а) False,   б) 'False',   в) True,   г) ошибка.   Показать решение.

Ответ. в) True.

Непустые строки преобразуются в True.

9.5.* Каким будет результат преобразования типа для инструкции tuple(" hello ")?

Варианты ответов: а) (' ', 'h', 'e', 'l', 'l', 'o', ' '),   б) ('h', 'e', 'l', 'l', 'o'),   в) (" hello ",),   г) (" hello ").   Показать решение.

Ответ. а) (' ', 'h', 'e', 'l', 'l', 'o', ' ').

Все элементы итерируемого объекта, т.е. символы переданной строки, стали элементами кортежа.

9.6.* Каким будет результат преобразования типа для инструкции set([1, 2, 3, 3])?

Варианты ответов: а) {1, 2, 3, 3},   б) {1, 2, 3},   в) [1, 2, 3, 3],   г) [1, 2, 3].   Показать решение.

Ответ. б) {1, 2, 3}.

Все неповторяющиеся элементы итерируемого объекта, т.е. числа переданного списка, стали элементами множества (коллекции уникальных объектов).

9.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2.0,   б) 2,   в) 0.0,   г) 0.   Показать решение.

Условие pythonCodes
res = int(True) + float(True)
print(res)

Ответ. а) 2.0.

После преобразования получим 1 + 1.0, поэтому результатом будет вещественное число (более общий тип).

9.8.* Каким будет результат преобразования типа для инструкции int(-0.319e2)?

Варианты ответов: а) 0,   б) -3,   в) -31,   г) ошибка.   Показать решение.

Ответ. в) -31.

-0.319e2 – это вещественное число -31.9. А в ходе преобразования вещественных чисел в целые их дробная часть просто отбрасывается.

9.9.* Каким будет результат преобразования типа для инструкции list({'a': 1, 'b': 2, 'c': 3})?

Варианты ответов: а) ['a', 'b', 'c'],   б) [1, 2, 3],   в) [('a', 1), ('b', 2), ('c', 3)],   г) ошибка.   Показать решение.

Ответ. а) ['a', 'b', 'c'].

Словари преобразуются в списки с ключами, теряя при этом свои значения.

9.10.* Каким будет результат преобразования типа для инструкции dict(['a', 'b'])?

Варианты ответов: а) {'a': None, 'b': None},   б) {'a': False, 'b': False},   в) {'a': True, 'b': True},   г) ошибка.   Показать решение.

Ответ. г) ошибка.

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

Инструкции присваивания

Теоретический материал по инструкциям присваивания можно почитать в нашем учебнике здесь.

10.1.* Какой из представленных вариантов соответствует позиционной инструкции присваивания?

Варианты ответов: а) b = [1, 2],   б) a += [1, 2],   в) a = b = [1, 2],   г) a, b = [1, 2].   Показать решение.

Ответ. г) a, b = [1, 2].

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

10.2.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 10,   б) 20,   в) 30,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 10
y = x
x = 20
print(y)

Ответ. а) 10.

Сперва переменная x хранила ссылку на объект целого числа 10 в памяти. Далее, в результате присваивания, ссылку на объект получила еще и переменная y. В результате на неизменяемый объект в памяти стало указывать уже две ссылки. Но ниже переменной x было присвоено новое значение, точнее новая ссылка на другой объект целого числа 20. Однако объект числа 10 при этом из памяти не удалился, ведь ссылка на него осталась еще в переменной y, что и подтвердил вывод инструкции print(y).

10.3.* Какой оператор используется для присваивания значения переменной внутри выражения?

Варианты ответов: а) =,   б) ==,   в) :=,   г) +=.   Показать решение.

Ответ. в) :=.

Был введен в Python 3.8.

10.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 10,   б) [1, 2, 3],   в) [10, 2, 3],   г) ошибка.   Показать решение.

Условие pythonCodes
a = [1, 2, 3]
b = a
a[0] = 10
print(b)

Ответ. в) [10, 2, 3].

В отличие от второго теста, здесь переменные ссылаются на один и тот же изменяемый объект. Поэтому все изменения в этом объекте (списке) будут отслеживаться сразу всеми переменными, хранящими на него ссылку.

10.5.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) (1, 2),   б) (2, 1),   в) (4, 3),   г) (3, 4).   Показать решение.

Условие pythonCodes
x = (1, 2)
y = (3, 4)
x, y = y, x
print(x)

Ответ. в) (3, 4).

В результате позиционного присваивания происходит обмен значениями за счет создания временного кортежа ((3, 4), (1, 2)).

10.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) [1, 2],   б) [10, 2],   в) [],   г) ошибка.   Показать решение.

Условие pythonCodes
x = [1, 2]
y = x[:]
x[0] = 10
print(y)

Ответ. а) [1, 2].

В отличие от четвертого теста, здесь переменные ссылаются на разные объекты в памяти, т.к. переменной y присваивается ссылка на совершенно другой объект в памяти, создаваемый для хранения копии исходного списка. Поэтому инструкция x[0] = 10 изменяет только тот объект в памяти, на который ведет соответствующая переменной x ссылка.

10.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3,   б) 6,   в) 7,   г) ошибка.   Показать решение.

Условие pythonCodes
a, b, *c = [1, 2, 3, 4, 5] 
a += b + c[1]
print(a)

Ответ. в) 7.

В результате использования в первой инструкции расширенного синтаксиса распаковывания последовательностей в переменных будут храниться значения 1, 2 и [3, 4, 5]. Во второй инструкции в результате комбинированного присваивания в переменной a будет храниться число 7 (1 + 2 + 4).

10.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {1, 2}, {1, 2}, {1, 2},   б) {1}, {2}, {},   в) {1}, {1, 2}, {},   г) ошибка.   Показать решение.

Условие pythonCodes
a = b = c = set()  
a |= {1}
b |= {2}
print(a, b, c, sep=', ')

Ответ. а) {1, 2}, {1, 2}, {1, 2}.

В результате группового присваивания пустого множества сразу трем переменным на созданный под это множество в памяти объект будет вести сразу три ссылки. Добавление в это множество новых элементов (т.е. изменение этого совместно используемого объекта) возможно через любую из них. Через любую иэ этих ссылок можно наблюдать затем и изменения, произошедшие в объекте.

10.9.* Какие из представленных фрагментов кода содержат ошибки?

Варианты ответов: а) x, y = [3, '3'],   б) x, *y = 1, 2, 3,   в) *x, = 1, 2, 3,   г) x, *y, *z = 1, 2, 3, 4.   Показать решение.

Ответ. г) x, *y, *z = 1, 2, 3, 4.

Расширенный синтаксис распаковывания последовательностей допускает использование в позиционном присваивании только одной переменной со звездочкой.

Условная инструкция if/elif/else

Теоретический материал по условной инструкции можно почитать в нашем учебнике здесь.

11.1.* Какие из частей условной инструкции не являются обязательными?

Варианты ответов: а) if,   б) elif,   в) else,   г) все части необязательны.   Показать решение.

Ответ. б) elif,  в) else.

Блоков elif может быть как несколько, так и вообще ниодного. Блок else может отсутствовать, но если он используется, то только один.

11.2.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) a>b,   б) a>=b,   в) a<b,   г) a<=b.   Показать решение.

Условие pythonCodes
a, b = 5, 10

if a>b:
    print("a>b")
else:
    print("a<=b")

Ответ. г) a<=b.

Поскольку условие блока if оказалось ложным, сработал блок else.

11.3.* Какой из представленных вариантов можно отнести к верному формату представления условной инструкции?

Варианты ответов: а) if/elseif/else,   б) if/elif/else,   в) if/else/elif,   г) A = Y if X else Z.   Показать решение.

Ответ. б) if/elif/else.

Вариант г) соответствует верному формату трехместного выражения if/else. Но в тесте требуется найти верный формат именно инструкции.

11.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1-й разряд,   б) 2-й разряд,   в) 3-й разряд,   г) не присваивается.   Показать решение.

Условие pythonCodes
очки = 73

if очки >= 90:
    разряд = "1-й разряд"
elif очки >= 80:
    разряд = "2-й разряд"
elif очки >= 70:
    разряд = "3-й разряд"
else:
    разряд = "не присваивается"

print(разряд)

Ответ. в) 3-й разряд.

11.5.* Какой из предлагаемых операторов можно использовать для инвертирования условия в инструкции if?

Варианты ответов: а) and,   б) or,   в) not,   г) is.   Показать решение.

Ответ. в) not.

Например, if not y==0: print(x/y).

11.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1,   б) 2,   в) 3,   г) ошибка.   Показать решение.

Условие pythonCodes
res = 0
if []: res += 1
if False: res += 1
if not None: res += 1
if -1: res += 1
print(res)

Ответ. б) 2.

Нужно вспомнить особенности приведения к логическому типу: пустой список приводится к False, а вот число -1 к значению True. Кроме того, not None конвертируется в True. В результате из четырех блоков if выполнится только два.

11.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) None,   б) True,   в) False,   г) ошибка.   Показать решение.

Условие pythonCodes
s = ''

if s:
    if 'a' in s:
        res = True
    else:
        res = False    
else:
    res = None 

print(res)

Ответ. а) None.

Опять же, нужно вспомнить особенности приведения к логическому типу: пустая строка приводится к False. Следовательно будет выполнен блок else.

11.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) -8,   б) -2,   в) 2,   г) ошибка.   Показать решение.

Условие pythonCodes
x, y = -5, -3
res = (-1*x if x<0 else x) + y
print(res)

Ответ. в) 2.

Здесь используется трехместное условное выражение, поэтому ошибки не будет.

Циклы for и while

Теоретический материал по циклам можно почитать в нашем учебнике здесь.

12.1.* Какие из представленных операторов представляют циклы в Питоне?

Варианты ответов: а) if,   б) while,   в) switch,   г) for.   Показать решение.

Ответ. б) while,  г) for.

switch в Питоне вообще отсутствует.

12.2.* Какой из следующих вариантов можно использовать для организации бесконечного цикла?

Варианты ответов: а) while True:,   б) while 1:,   в) for i in range(inf):,   г) все вышеуказанные.   Показать решение.

Ответ. а) while True:,  б) while 1:.

1 и True взаимозаменяемы.

12.3.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3,   б) (3),   в) 1 2 3 ,   г) ошибка.   Показать решение.

Условие pythonCodes
for i in (3):
    print(i, end=' ')

Ответ. г) ошибка.

(3) – это не кортеж с одним элементом, а просто число в скобках, т.е. неитерируемый объект.

12.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) -1 -2 -3,   б) 0 -1 -2 -3,   в) -1 -2 -3,   г) 0 -1 -2.   Показать решение.

Условие pythonCodes
for i in range(3):
    print(-i, end=' ')

Ответ. г) 0 -1 -2.

Функция range() в нашем случае вернет объект с последовательностью из трех чисел от нуля до двух. А цикл for выведет их на экран с противоположным знаком.

12.5.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 0 1 2 3 4 5,   б) 1 2 3 4 5,   в) a b c d e f,   г) ошибка.   Показать решение.

Условие pythonCodes
li = ['12345', 'abcdef']
for elem in li[0]:
    print(elem, end=' ')

Ответ. б) 1 2 3 4 5.

Осуществили итерацию по символам строки, которая является первым элементом списка.

12.6.* Какой из следующих операторов предназначен для прерывания цикла?

Варианты ответов: а) pass,   б) continue,   в) break,   г) else.   Показать решение.

Ответ. в) break.

Для прерывания только одного витка итерации и перехода на следующий используется continue.

12.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) a (b, c) d (e, f),   б) a ('b', 'c') d ('e', 'f'),   в) a [b, c] d [e, f],   г) a ['b', 'c'] d ['e', 'f'].   Показать решение.

Условие pythonCodes
d = [('a', 'b', 'c'), ('d', 'e', 'f')]
for x, *y in d: 
    print(x, y, end=' ')

Ответ. г) a ['b', 'c'] d ['e', 'f'].

Здесь осуществляется итерация по двум элементам (кортежам) списка. При этом используется расширенный синтаксис распаковывания последовательностей. В результате на каждом витке первый элемент целевого кортежа присваивается переменной x, а оставшиеся собираются в список, который присваивается переменной y. Далее значения переменных просто выводятся на экран.

12.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1 2 3,   б) 1 2 3 4,   в) 1 2 3 4 5,   г) ошибка.   Показать решение.

Условие pythonCodes
k = 1
while k <= 5:
    if k > 3: break            
    print(k, end=' ')               
    k += 1   

Ответ. а) 1 2 3.

Счетчик стартует с единицы. Цикл прерывается оператором break и не достигает очередной инструкции вывода, как только значение счетчика достигнет четырех.

12.9.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1 2 3 4 5,   б) 0 1 2,   в) 0 1 2 3,   г) 0 1 2 4 5.   Показать решение.

Условие pythonCodes
k = 0
while True:
    if k > 5: break            
    if k == 3: 
        k += 1
        continue 
    print(k, end=' ')               
    k += 1 

Ответ. г) 0 1 2 4 5.

Счетчик стартует с нуля. Цикл прерывается оператором break и не достигает очередной инструкции вывода, как только значение счетчика достигнет шести. При этом по ходу цикла значение 3 пропускается из-за условной инструкции if и оператора continue внутри.

12.10.* Какой из следующих операторов можно использовать для выполнения блока кода после завершения цикла?

Варианты ответов: а) pass,   б) continue,   в) break,   г) else.   Показать решение.

Ответ. г) else.

Операторы continue и break используются внутри циклов. А pass – это вообще пустая инструкция-заполнитель, которая может использоваться внутри циклов вместо тела.

12.11.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2 1 0,   б) 3 2 1 0,   в) 3 2 1 0 0,   г) ошибка.   Показать решение.

Условие pythonCodes
k = 4
while k:
    k -= 1           
    print(k, end=' ')               
    if k>2: continue
else:
    print(0)

Ответ. в) 3 2 1 0 0.

Счетчик стартует с четырех. Внутри цикла он сразу же уменьшается на единицу, а новое значение выводится на экран. Поскольку условная инструкция if с оператором continue внутри используется позже, она никак и не повлияла на вывод значений. После обнуления счетчика, цикл завершается без ошибок, а значит срабатывает блок инструкций else, т.е. выводится еще один ноль.

12.12.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2 1 2 1,   б) 2 1 2 1 2 1,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
k = 1
while True:
    for n in range(2, 0, -1):
        print(n, end=' ')
    k += 1                        
    if k == 3: break 

Ответ. а) 2 1 2 1.

Счетчик основного цикла while стартует с одного. Внутри цикла сразу же начинает работать внутренний цикл for, который выводит на экран все значения n убывающей последовательности чисел от двух до нуля с шагом -1. А это всего два числа: два и один. Когда внутренний цикл завершается, счетчик основного цикла увеличивается на единицу. Далее проверяется условие равенства счетчика трем: по достижении этого значения внешний цикл завершает свою работу. А это значит, что внешний цикл повторяется всего два раза.

12.13.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2 1 2 1,   б) 2 1 2 1 2 1,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
k = 1
while True:
    for n in range(2, 0, -1):
        print(n, end=' ')
    if k == 3: break 
    k += 1 

Ответ. б) 2 1 2 1 2 1.

Различие с предыдущим тестов в том, что счетчик увеличивается после проверки условия на равенство его значения трем! Это и дает прирост количества итераций на единицу. Ответили неверно? Пройдитесь по итерациям еще раз.

Итерации и генераторы

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

13.1.* Какие из предложенных вариантов объектов относятся к итерируемым?

Варианты ответов: а) 'abc',   б) (25,),   в) 321,   г) {'a': 1}.   Показать решение.

Ответ. а) 'abc',  б) (25,),  г) {'a': 1}.

Строки хотя и относятся к неизменяемому типу данных, но дают доступ к своим символам. А вот пройтись по цифрам числа напрямую не получится.

13.2.* С помощью какой функции можно преобразовать итерируемый объект в итератор?

Варианты ответов: а) iter,   б) next,   в) list,   г) никак.   Показать решение.

Ответ. а) iter.

Например, li_iter = iter([1, 2, 3]). Что касается встроенной функции next, то она используется для получения следующего элемента полученного итератора.

13.3.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) b,   б) cd,   в) True,   г) ошибка.   Показать решение.

Условие pythonCodes
li = ['ab', 'cd', 'ef']
li_iter = iter(li)
next(li_iter)
print(next(li_iter)) 

Ответ. б) cd.

Встроенная функция next используется для получения следующего элемента полученного итератора. Следовательно в ходе первого ее применения будет возвращен первый элемент итератора (на экран мы его не выводим), а в ходе второго вызова – второй элемент, который и будет выведен на экран функцией print.

13.4.* Что произойдет, если попытаться получить элемент из итератора, который исчерпал все свои элементы?

Варианты ответов: а) будет возвращено None,   б) будет возвращен пустой кортеж,   в) будет брошено исключение StopIteration,   г) будет возвращено False.   Показать решение.

Ответ. в) будет брошено исключение StopIteration.

13.5.* Какая из конструкций вернет готовый итератор?

Варианты ответов: а) {x for x in 'abc'},   б) (x for x in 'abc'),   в) [x for x in 'abc'],   г) {x: None for x in 'abc'}. Показать решение.

Ответ. б) (x for x in 'abc').

Остальные генераторы вернут множество, список и словарь, итераторы которых сперва придется получить при помощи функции iter.

13.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2,   б) 3,   в) 4,   г) ошибка.   Показать решение.

Условие pythonCodes
g_1 = (x for x in range(2, 5))
g_2 = [x+1 for x in range(2, 5)]

res = next(g_1) + next(g_2)
print(res) 

Ответ. г) ошибка.

К спискам не применима функция next! Сперва нужно получить итератор с помощью функции iter(g_2), а затем уже получать элемент и находить сумму.

13.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 4,   б) 3,   в) 2,   г) 1.   Показать решение.

Условие pythonCodes
def f_2(n):
    for i in range(1, n+1):
        yield i

gen = f_2(30)
res = next(gen) + next(gen) + next(f_2(30))
print(res)

Ответ. а) 4.

В первый раз next(gen) вернет один, затем два. next(f_2(30)) вернет один, т.к. каждый новый вызов функции f_2 создает новый объект итератора, а значит выдача элементов начинается заново.

Функции

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

14.1.* Какая инструкция используется в Python для определения функций?

Варианты ответов: а) df,   б) def,   в) dfn,   г) define.   Показать решение.

Ответ. б) def.

Остальные имена в Пайтоне отсутствуют вообще.

14.2.* Что возвращает функция, в которой отсутствует инструкция return?

Варианты ответов: а) объект функции,   б) None,   в) False,   г) ничего.   Показать решение.

Ответ. в) None.

Технически все равно будет возвращено None. Проверить легко, использовав, например, вызов пустой функции def func(): pass в инструкции print(func()).

14.3.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) True,   б) None,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
def my_func():
    print(True)
my_func

Ответ. в) ничего.

Ничего на экран выведено не будет, т.к. вызов функции осуществлен не был. Для этого нужно было к имени функции добавить скобки. А так в код программы было просто вписано имя, ссылающееся на объект ранее определенной функции, что вполне себе разрешено и ошибки не вызовет.

14.4.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1 2,   б) 2 1,   в) 1,   г) ошибка.   Показать решение.

Условие pythonCodes
def my_func_1(): print(1, end=' ')
my_func_2()

def my_func_2(): print(2, end=' ')
my_func_1()

Ответ. г) ошибка.

Не забываем, что функции можно вызывать только после их объявления. Если ход выполнения скрипта не дошел до места определения функции, будет брошено исключение. Это касается и объявлений функций внутри условных инструкций.

14.5.* Какой из предлагаемых вариантов является допустимым способом передачи аргументов функции?

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

Ответ. г) все вышеуказанные.

Еще раз загляните в пункт нашего учебника «Аргументы функций».

14.6.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 17,   б) 16,   в) 15,   г) ошибка.   Показать решение.

Условие pythonCodes
def f_1(a, b): 
    return a + b

def f_2(a, b=3, c=4): 
    return a + b + c

res = f_1(1, 2) + f_2(5, 5)
print(res)

Ответ. а) 17.

Ошибки здесь не будет, т.к. во второй функции используются значения по умолчанию, которые можно не указывать. Поэтому функцией будет возвращен результат вычисления выражения 5 + 5 + 4.

14.7.* Выберите верные варианты вызова функции, определяемой инструкцией def func(x, y, z): pass?

Варианты ответов: а) func(x, y=2, z=5),   б) func(x=8, y, z),   в) func(x=8, y=2, z),   г) func(x, y, z=5).   Показать решение.

Ответ. а) func(x, y=2, z=5),  г) func(x, y, z=5).

Здесь нужно помнить, что первыми должны передаваться позиционные аргументы и только потом именованные. Это условие было нарушено вариантами б) и в).

14.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 14,   б) 15,   в) 16,   г) ошибка.   Показать решение.

Условие pythonCodes
def f_1(a, b=2): 
    return a + b

def f_2(a, b, c=3): 
    return a + b + c

res = f_1(b=1, 2) + f_2(3, 4, c=5)
print(res)

Ответ. г) ошибка.

Опять же, первыми должны передаваться позиционные аргументы и только потом именованные. Правильно было бы написать f_1(2, b=1), f_1(b=1, a=2), f_1(a=2, b=1) или просто f_1(2, 1).

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

Варианты ответов: а) def func_name(*args):,   б) def func_name(**kwargs):,   в) def func_name(*args, **kwargs):,   г) все вышеуказанные.   Показать решение.

Ответ. г) все вышеуказанные.

Первый вариант предполагает передачу произвольного числа позиционных аргументов (будут собраны в кортеж), второй – именованных (будут собраны в словарь), третий – и тех, и других.

14.10.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 6,   б) [1, 2, 3],   в) (1, 2, 3),   г) ошибка.   Показать решение.

Условие pythonCodes
def f_1(a, *b): 
    return a + b

print(f_1(1, 2, 3))

Ответ. г) ошибка.

Сама функция определена на первый взгляд верно. Однако передача ей даже двух аргументов при вызове будет возбуждать ошибку, т.к. операция сложения чисел с кортежами в Питоне не предусмотрена.

14.11.* Выберите верные варианты вызова функции, определяемой инструкцией def func(x, *y, z): pass?

Варианты ответов: а) func(1, 2, 3),   б) func(1, 2, z=3),   в) func(1, z=3),   г) func(z=3, 1, 2).   Показать решение.

Ответ. б) func(1, 2, z=3),  в) func(1, z=3).

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

14.12.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) (1,) {'x': 3, 'y': 4},   б) 1, 3, 4,   в) (1, 3, 4),   г) ошибка.   Показать решение.

Условие pythonCodes
def func(*a, **b): 
    print(a, b)

func(1, x=3, y=4)

Ответ. а) (1,) {'x': 3, 'y': 4}.

Определением функции подразумевается сбор всех позиционных аргументов в кортеж, а именованных в словарь.

14.13.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 10,   б) 20,   в) 30,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 10
def func():
    global x
    x = 20

func()
print(x)

Ответ. б) 20.

В теле функции интерпретатору сообщается о том, что необходимо использовать глобальную переменную (инструкция global x).

14.14.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 20,   б) 30,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
def func_1(): 
    x = 20
    def func_2():
        nonlocal x
        x = 30
    print(x)

func_1()

Ответ. а) 20.

Функция func_2 была определена, но не была вызвана.

14.15.* Какой из предлагаемых операторов можно использовать для создания анонимной функции?

Варианты ответов: а) def,   б) lambda,   в) yield,   г) все вышеуказанные.   Показать решение.

Ответ. б) lambda.

Инструкция yield используется для создания функций-генераторов.

14.16.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 10,   б) 20,   в) 30,   г) ошибка.   Показать решение.

Условие pythonCodes
x = 10
def func_1(): 
    x = 20
    def func_2():
        global x
        x = 30
    func_2()

func_1()
print(x)

Ответ. в) 30.

Внутри функции func_1 использутеся локальная переменная x, а вот внутри вложенной функции func_2 – уже глобальная переменная. При этом функция func_2 не только определяется, но и вызывается при вызове родительской функции func_1, что и приводит к изменению значения глобальной переменной.

14.17.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 4,   б) 4.0,   в) None,   г) ошибка.   Показать решение.

Условие pythonCodes
ld = lambda x, y=5: x/y if y != 0 else None
print(ld(20))

Ответ. б) 4.0.

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

14.18.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 9,   б) 6.0,   в) 9.0,   г) ошибка.   Показать решение.

Условие pythonCodes
ld = lambda x: if x>0: x**2
print(ld(3.0))

Ответ. г) ошибка.

Внутри тела анонимной функции инструкции запрещены.

14.19.* Какие функции в Питоне называют рекурсивными?

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

Ответ. а) функция, которая вызывает саму себя внутри своего тела.

14.20.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 0,   б) 25,   в) 120,   г) ошибка.   Показать решение.

Условие pythonCodes
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n*factorial(n - 1)

print(factorial(5)) 

Ответ. в) 120.

Если результат вызывает затруднения, еще раз внимательно почитайте пункт нашего учебника «Рекурсивные функции». После чего еще раз пройдитесь по всем этапам выполнения кода теста.

14.21.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3 + 5,   б) 35,   в) 3 + '''5''',   г) ошибка.   Показать решение.

Условие pythonCodes
def f(x):
    '''5'''        
    return x

res = f('3') + f.__doc__
print(res)

Ответ. б) 35.

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

ООП: классы и объекты

Теоретический материал по объектно-ориентированному программированию можно почитать в нашем учебнике здесь.

15.1.* Что такое ООП?

Варианты ответов: а) операторно-ориентированное программирование,   б) основы объектного программирования,   в) оптимизационно-ориентированное программирование,   г) объектно-ориентированное программирование.   Показать решение.

Ответ. г) объектно-ориентированное программирование.

15.2.* Как называется механизм ООП, который позволяет объединять данные и методы, работающие с этими данными, в единый объект, скрывая при этом детали реализации от пользователя?

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

Ответ. б) инкапсуляция.

15.3.* Какое ключевое слово используется в Python для определения классов?

Варианты ответов: а) class,   б) cls,   в) object,   г) obj.   Показать решение.

Ответ. a) class.

15.4.* Какой стиль именования классов рекомендуется в руководстве PEP 8 по оформлению кода на Python?

Варианты ответов: а) camelCase,   б) CapWords,   в) snake_case,   г) ALL_CAPS.   Показать решение.

Ответ. б) CapWords.

15.5.* Какой оператор используется для доступа к атрибуту объекта или класса в Python?

Варианты ответов: а) ->,   б) ::,   в) .,   г) [].   Показать решение.

Ответ. в) ..

15.6.* Укажите специальный метод, который используется для инициализации исходными данными вновь создаваемых экземпляров класса.

Варианты ответов: а) __construct__,   б) __new__,   в) __init__,   г) __start__.   Показать решение.

Ответ. в) __init__.

Данный метод называется конструктором класса.

15.7.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1,   б) 2,   в) 3,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test:
    def __init__(self, x=1):
        self.x = x

t_1 = Test()
t_2 = Test(2)
print(t_1.x + t_2.x)

Ответ. в) 3.

В конструкторе используется передача аргумента со значением по умолчанию. Поэтому t_1.x == 1, а t_2.x == 2.

15.8.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 25,   б) 30,   в) 55,   г) ошибка.   Показать решение.

Условие pythonCodes
class Person:
    def set_age(self, age):
        self.age = age

ivan = Person(25)
ivan.set_age(30)
print(ivan.age)

Ответ. г) ошибка.

В данном случае мы не определяли собственный конструктор класса, который принимал бы начальное значение возраста. Поэтому будет выведена ошибка «Person() takes no arguments», уведомляющая нас о том, что передача аргументов конструктором не предусмотрена.

15.9.* Перечислите допустимые способы изменения значения атрибута объекта в Python.

Варианты ответов: а) obj.attr = value,   б) setattr(obj, attr_name, value),   в) obj.setattr(attr_name, value),   г) все вышеперечисленные.   Показать решение.

Ответ. а) obj.attr = value,  б) setattr(obj, attr_name, value).

Для изменения значения атрибута необходимо просто присвоить ему новое значение или использовать встроенную функцию setattr(obj, attr_name, value), передав ей объект, строку с именем атрибута и само значение.

15.10.* Укажите допустимые способы удаления атрибута объекта в Python.

Варианты ответов: а) del obj.attr,   б) obj.del(attr_name),   в) obj.delattr(attr_name),   г) delattr(obj, attr_name).   Показать решение.

Ответ. а) del obj.attr,  г) delattr(obj, attr_name).

Для удаления атрибутов можно использовать оператор del или встроенную функцию delattr(obj, attr_name), в которой вторым аргументом нужно передать строку с именем удаляемого атрибута.

15.11.* Какой атрибут используется для получения словаря, содержащего атрибуты объекта или класса?

Варианты ответов: а) __attrs_,   б) __items__,   в) __dict__,   г) __vars__.   Показать решение.

Ответ. в) __dict__.

Получить доступ или посмотреть текущий набор атрибутов класса или экземпляра можно при помощи словаря атрибутов object.__dict__. При этом важно помнить, что словарь динамически изменяется в процессе изменения как количества доступных атрибутов, так и их значений.

15.12.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) {'name': 'ivan', 'age': 25},   б) {'age': 25},   в) {'name': 'ivan'},   г) ошибка.   Показать решение.

Условие pythonCodes
class Person:
    def set_age(self, age):
        self.age = age

ivan = Person()
setattr(ivan, 'name', 'ivan')    
ivan.set_age(25)

print(ivan.__dict__)    
del ivan.age

Ответ. а) {'name': 'ivan', 'age': 25}.

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

15.13.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1 + 1,   б) 2,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test:
	x = 1

t = Test()
print(Test.x + t.x)

Ответ. б) 2.

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

15.14.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2,   б) 4,   в) 6,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test:
	x = 1
	def __init__(self, x):
		self.x = x

t = Test(3)
print(Test.x + t.x)

Ответ. б) 4.

Атрибут данных класса Test.x остался прежним, т.к. в конструкторе он переопределяется только для каждого конкретного вновь создаваемого экземпляра класса. Поэтому t.x == 3, а Test.x == 1.

15.15.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2,   б) 3,   в) 4,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test:
    x = 1

t = Test()
t.x = 2   
del t.x
print(Test.x + t.x)

Ответ. а) 2.

Даже после удаления атрибута x в экземпляре t при повторной попытке обращения к нему через t.x интерпретатор не выдал ошибку, а сперва попытался отыскать одноименный атрибут в самом классе Test, вернув, как следствие, значение общедоступного атрибута Test.x.

15.16.* Какой декоратор используется для определения метода класса и позволяет работать с атрибутами класса, а не с атрибутами объекта?

Варианты ответов: а) @staticmethod,   б) @classmethod,   в) @property,   г) @operator.   Показать решение.

Ответ. б) @classmethod.

Для объявления метода класса нужно записать декоратор @classmethod на отдельной строке, предшествующей строке с определением целевого метода.

15.17.* Перечислите верные варианты вызова метода класса в Пайтоне.

Варианты ответов: а) obj.method(cls),   б) Class.method(cls),   в) obj.method(),   г) Class.method().   Показать решение.

Ответ. в) obj.method(),  г) Class.method().

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

15.18.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 0,   б) 1,   в) 2,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    @classmethod
    def m_1(cls): 
        return (1 if 1>0 else 0)          

obj = Test()        
print(obj.m_1() + Test.m_1())

Ответ. в) 2.

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

15.19.* Перечислите верные варианты вызова статического метода в Python.

Варианты ответов: а) obj.method(),   б) Class.method(),   в) Class.method(obj),   г) method().   Показать решение.

Ответ. а) obj.method(),  б) Class.method().

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

15.20.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 1,   б) 2,   в) 3,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    def m_1(): 
        return (1 if 1>0 else 0)          
    @staticmethod
    def m_2(): 
        return (2 if 2>0 else 0)                   

obj = Test()        
print(obj.m_1() + Test.m_2())

Ответ. г) ошибка.

Методы, просто объявленные внутри пространства имен класса, доступны посредством объекта класса, но недоступны для вызовов из экземпляров класса. Для этого нужно использовать декоратор @staticmethod.

15.21.* Как в Питоне принято обозначать атрибуты класса, предназначенные для внутреннего (служебного) использования?

Варианты ответов: а) _,   б) __,   в) @,   г) никак.   Показать решение.

Ответ. а) _.

Атрибуты, предназначенные для внутреннего использования, принято начинать с одного символа подчеркивания (например, _var).

15.22.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 5,   б) False,   в) None,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    def __init__(self, x): 
        self._x = x         

obj = Test(5)        
print(obj._x)

Ответ. а) 5.

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

15.23.* Как в Питоне принято обозначать приватные атрибуты класса?

Варианты ответов: а) _,   б) __,   в) @,   г) никак.   Показать решение.

Ответ. б) __.

Атрибут, начинающийся с двух символов нижнего подчеркивания, останется доступен внутри класса, но станет недоступен по такому имени за его пределами, т.к. вне класса имена атрибутов, начинающихся с двух символов подчеркивания, автоматически преобразуются интерпретатором из формата __attr_name в формат _Class__attr_name.

15.24.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 5,   б) False,   в) None,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    def __init__(self, x): 
        self.__x = x         

obj = Test(5)        
print(obj.__x)

Ответ. г) ошибка.

Опять же, атрибут, начинающийся с двух символов нижнего подчеркивания, останется доступен внутри класса, но станет недоступен по такому имени за его пределами, т.к. вне класса имена атрибутов, начинающихся с двух символов подчеркивания, автоматически преобразуются интерпретатором из формата __attr_name в формат _Class__attr_name.

15.25.* Какая из встроенных функций предназначена для создания управляемых атрибутов класса?

Варианты ответов: а) staticmethod,   б) classmethod,   в) property,   г) setattr.   Показать решение.

Ответ. в) property.

Результатом вызова встроенной функции property(fget=None, fset=None, fdel=None, doc=None) является объект свойства, присваиваемый имени атрибута, которым требуется управлять, находящийся в области видимости класса, внутри которого она вызывалась, и наследующийся всеми экземплярами этого класса.

15.26.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3,   б) 4,   в) 5,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    @property
    def attr_x(self):
        return self.__x
    
    @attr_x.setter
    def attr_x(self, x):
        self.__x = 3
    
obj = Test()        
obj.attr_x = 4
obj.attr_x += 1
print(obj.attr_x)

Ответ. а) 3.

При попытке изменения значения управляемого атрибута attr_x будет вызываться его метод-сеттер, постоянно присваивая атрибуту в качестве значения число 3.

15.27.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 7,   б) Атрибут удален!,   в) ничего,   г) ошибка.   Показать решение.

Условие pythonCodes
class Test: 
    @property
    def attr_x(self):
        return self.__x
    
    @attr_x.setter
    def attr_x(self, x):
        self.__x = x        
    
    @attr_x.deleter
    def del_attr_x(self):
        del self.__x
        print('Атрибут удален!')

obj = Test()        
obj.attr_x = 7
del obj.attr_x

Ответ. г) ошибка.

Не забываем, что при использовании декораторов все методы должны иметь одно и то же имя, иначе интерпретатор возбудит исключение. В нашем случае мы получим ошибку удаления управляемого атрибута «property 'attr_x' of 'Test' object has no deleter».

15.28.* Укажите верные варианты вызова метода method суперкласса A из его подкласса B.

Варианты ответов: а) super().method(),   б) super(B, self).method(),   в) super(A, self).method(),   г) super(B, method).   Показать решение.

Ответ. а) super().method(),  б) super(B, self).method().

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

15.29.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 3,   б) 4,   в) 5,   г) ошибка.   Показать решение.

Условие pythonCodes
class A: 
    def m_s(self):
        return 1

class B: 
    def m_s(self):
        return 2        

class C(B, A): 
    def m_sub(self):
        return 3                      

obj = C()
print(obj.m_s() + obj.m_sub())

Ответ. в) 5.

Если подкласс наследует сразу несколько суперклассов с одинаковыми именами атрибутов, то им будет унаследовано значение атрибута того суперкласса, который перечисляется в заголовке инструкции class первым.

15.30.* Что будет выведено на экран в результате выполнения кода условия?

Варианты ответов: а) 2,   б) 3,   в) 4,   г) ошибка.   Показать решение.

Условие pythonCodes
class A: 
    def set_1(self): 
        self.__x = 1
        return self.__x

class B: 
    def set_2(self): 
        self.__x = 2
        return self.__x

class C(A, B): pass 

obj = C()
print(obj.set_1() + obj.set_2())

Ответ. б) 3.

Благодаря наличию приставки из двух символов подчеркивания атрибуты остались доступны по короткому имени внутри классов, но стали недоступны извне, поскольку имена этих атрибутов были дополнены интерпретатором именами их классов до _A__x и _B__x.