🔍 🌱 Что выведет код?
Anonymous Quiz
23%
{[1, 2, 3]: 'hello'}
6%
{1: 'h', 2: 'e', 3: 'l'}
11%
{1: 'hello', 2: 'hello', 3: 'hello'}
60%
Error
🌱 Что выаедет код?
Anonymous Quiz
26%
rhymehatmatrat
6%
hatmatrhymerat
62%
hatrhymematrhymerat
6%
Error
2. Когда вы вызываете 'rhyme'.join(a), Python:
- Берет первый элемент 'hat'
- Добавляет РАЗДЕЛИТЕЛЬ 'rhyme'
- Берет второй элемент 'mat'
- Добавляет разделитель 'rhyme'
- Берет третий элемент 'rat'
Таким образом, получается:
- 'hat' + 'rhyme' + 'mat' + 'rhyme' + 'rat' = 'hatrhymematrhymerat'
Разделитель добавляется ТОЛЬКО между элементами списка, но не в начале и не в конце. Поэтому в результате мы видим 'rhyme' только между словами, но не в начале или конце строки.
Когда Python пытается отсортировать этот список, он должен сравнить элементы между собой, чтобы определить их порядок. Однако у нас нет встроенного способа сравнить целое число с комплексным числом, так как это математически не имеет смысла.
Или если бы вы хотели сортировать по модулю комплексных чисел:
y = [4, 5, 1j]
y.sort(key=abs) # Сортировка по модулю числа
Что верно про кортежи и списки
Anonymous Quiz
7%
Список и кортеж изменяемы
86%
Список изменяем, тогда как кортеж нет
3%
Список и кортежи неизменяемы
3%
Список неизменяем, кортеж изменяем
1. "abb" - подстрока, которую мы ищем
2. -10 - начальный индекс (отсчёт с конца строки)
3. -1 - конечный индекс (отсчёт с конца строки)
Срез от -10 до -1 даёт нам "zxyzxzxab", и в нем нет вхождения "abb".
Если бы мы хотели посчитать вхождения в последних 10 символах:
print("abbzxyzxzxabb".count("abb", -10)) # 1
Метод cumsum() вычисляет накопительную сумму:
1: 1.0 (просто первое число)
2: 3.0 (1 + 2)
3: 6.0 (1 + 2 + 3)
4: NaN
5: 10.0 (1 + 2 + 3 + 4)
6: 15.0 (1 + 2 + 3 + 4 + 5)
Когда встречается np.nan (Not a Number), pandas пропускает его при подсчёте. Все числа преобразуются в тип float64, потому что np.nan является числом с плавающей точкой
Если бы мы хотели, чтобы np.nan не прерывал подсчёт, мы могли бы использовать параметр skipna=False:
print(numbers.cumsum(skipna=False))
Тогда результат был бы другим, и все значения после np.nan тоже стали бы NaN.
def f(a, b = 1, c = 2):
...
И она вызывается дважды:
1. f(2, c = 2):
- a = 2 (первый позиционный аргумент)
- b = 1 (значение по умолчанию, так как не указано)
- c = 2 (именованный аргумент)
Поэтому выводится: a is: 2 b is: 1 c is: 2
2. f(c = 100, a = 110):
- a = 110 (именованный аргумент)
- b = 1 (значение по умолчанию, так как не указано)
- c = 100 (именованный аргумент)
Поэтому выводится: a is: 110 b is: 1 c is: 100
Python сначала обрабатывает позиционные аргументы, а затем именованные. Если какой-то параметр не указан, используется его значение по умолчанию. В нашем случае параметр b ни разу не был указан явно, поэтому всегда использовалось его значение по умолчанию - 1.
- self.__x = 100 - создается приватный атрибут __x со значением 100
- self.y = 200 - создается публичный атрибут y со значением 200
2. В классе C (дочерний класс):
- super().__init__() - вызывается конструктор родительского класса
- self.__x = 300 - создается НОВЫЙ приватный атрибут __x со значением 300
- self.y = 400 - переопределяется значение публичного атрибута y
Ключевой момент здесь в том, что в Python приватные атрибуты (с двойным подчеркиванием __) автоматически «манглируются» (переименовываются) интерпретатором. Когда мы создаем приватный атрибут __x в классе P, он фактически становится _P__x, а когда создаем __x в классе C, он становится _C__x.
Поэтому:
1. Когда вызывается d.print(), метод print из класса P обращается к self.__x, что на самом деле означает self._P__x, поэтому выводится 100
2. Атрибут y является публичным, поэтому его значение успешно переопределяется в классе C на 400
Таким образом, в выводе мы видим:
- 100 (значение _P__x из родительского класса)
- 400 (значение y из дочернего класса)
Это демонстрирует важное различие между приватными и публичными атрибутами в Python при наследовании.