#!/usr/bin/env python # coding: utf-8 # # Основы программирования в Python # # *Алла Тамбовцева, НИУ ВШЭ* # # ## Семинар 2 # ### Задача 0 (разминка) # # Даны два списка `a` и `b` (см. ниже). # # 1. Выведите на экран первый элемент списка `a`, третий элемент списка `a`, последний элемент списка `a`. # 2. Добавьте в список `b` элемент 7 (просто допишите в конец). # 3. Замените пятый элемент списка `a` на число 8. # 4. Создайте список `merged`, который включает в себя все элементы списка `a` и списка `b`. # 5. Создайте новый список `с`, который получается заменой последнего элемента списка `a` на число 100. Сам список `a` измениться не должен! # In[2]: a = [1, 0, 9, 12, 18, 34, 89, 91, 33, 127] b = [2, 8, 9, 11, 76, 25, 44] # In[3]: # 1 print(a[0], a[2], a[-1]) # In[4]: # 2 b.append(7) b # In[5]: # 3 a[4] = 8 a # In[6]: # 4 merged = a + b merged # In[7]: # 5 c = a.copy() c[-1] = 100 print(a, c) # *Примечание:* написать `c = a` вместо `a.copy()` нельзя, так как этот код создаст ссылку `c` на старый список `a`, а не новый список `c`, поэтому при изменении списка `c` список `a` также изменится. # ### Задача 1 (девочковая) # # Есть список имен: # In[9]: girls = ["Иветта", "Виолетта", "Кассандра", "Вирджиния", "Амелия", "Розамунда", "Янина", "Беатриса"] # Используя список `girls`, выведите на экран следующие списки: # # ["Виолетта", "Кассандра", "Вирджиния", "Амелия"] # ["Вирджиния", "Амелия", "Розамунда", "Янина", "Беатриса"] # ["Иветта", "Виолетта", "Вирджиния", "Амелия"] # ["Кассандра", "Амелия", "Розамунда"] # In[10]: print(girls[1:5]) # 1 print(girls[3:]) # 2 print(girls[0:2] + girls[3:5]) # 3 print(girls[2:3] + girls[4:6]) # 4 # В последнем пункте главное не вызвать имя Кассандра отдельно, без среза, так как в таком случае мы будем складывать строку и список, что даст ошибку: # In[11]: print(girls[2] + girls[4:6]) # Эту ошибку можно исправить, добавив квадратные скобки вокруг Кассандры, создав список из одного элемента (хотя, конечно, решение со срезами более элегантное): # In[12]: print([girls[2]] + girls[4:6]) # ### Задача 2 (поэлементная) # # Дан список `L`. Выведите на экран (последовательно, с новой строчки): # # * все элементы списка `L`; # * логарифмированные значения элементов списка `L`. # In[13]: L = [12, 3, 8, 125, 10, 98, 54, 199] # Замените пятый элемент списка `L` на 0. Проделайте те же операции, что и раньше. Объясните, почему получаются такие результаты. # In[14]: # до добавления 0 - все элементы for i in L: print(i) # In[15]: # до добавления 0 - натуральные логарифмы всех элементов import math for j in L: print(math.log(j)) # Примечание: импортировать модули или библиотеки нужно вне циклов, так как их достаточно импортировать один раз. Многократный импорт библиотеки в цикле не вызовет ошибку, но замедлит исполнение кода (на таком простом примере мы это не заметим, но это так). # In[16]: # после добавления 0 – натуральные логарифмы всех элементов L[4] = 0 L for j in L: print(math.log(j)) # На пятом элементе все сломалось, исполнение кода остановилось, Python вышел из цикла. Значит, проблема с нулем. Это объяснимо, логарифм не определен для неположительных чисел. Python выдает ошибку значения `ValueError` и пишет про *domain*, что по-английски область определения функции, то есть множество значений, которые может принимать аргумент функции. # ### Задача 3 (демографическая) # # В списке `age` сохранены значения возраста респондентов: # # age = [24, 35, 42, 27, 45, 48, 33] # # Создайте список `age2`, в котором будут храниться значения возраста, возведенные в квадрат. # # **Подсказка:** используйте цикл `for`. # In[17]: age = [24, 35, 42, 27, 45, 48, 33] age2 = [] for a in age: age2.append(a ** 2) age2 # In[18]: # то же, но со списковыми включениями age2 = [a**2 for a in age] age2 # ### Задача 4 (игровая) # # Питон просит пользователя загадать (ввести с клавиатуры) целое число $k$ от 1 до 10. Питон берет это число $k$ и выводит на экран $k$-тый элемент списка `numbers`, причем $k$-ый элемент в привычном понимании, в нумерации, которая начинается с единицы. # # Список `numbers`: # In[19]: numbers = [1, 5, 6, 8, 10, 21, 25, 1, 0, -9, 9] # **Пояснение:** # # *Входные данные:* # # Введите целое число от 1 до 10: 3 # # *Выходные данные:* # # 6 # In[20]: k = int(input("Enter a number: ")) print(numbers[k-1]) # ### Задача 5 (мыслительная) # # Объясните, что делает следующий код и почему он выдает такие результаты: # In[21]: l = [1,2,3,4] for i in range(len(l)): a = l[i] + l[i-1] print(a) # Разберем код на части. Что такое `range(len(l))`? # In[22]: list(range(len(l))) # индексы элементов списка l # Значит, цикл `for` бегает по индексам списка `l`. Тогда `l[i]` ‒ это i-тый элемент списка `l`, а `l[i-1]` ‒ элемент, предшествующий i-тому элементу. Эти два элемента складываются, и результат сохраняется в `a`. # # Посмотрим. Если `i = 0`, то получаем `l[0]` и `l[-1]`. Значит, на первом шаге (на первой итерации) цикла мы складываем первый и последний элементы списка. # # 1 + 4 = 5 # # Двигаемся дальше. Если `i = 1`, то получаем `l[1]` и `l[0]`. Значит, на втором шаге цикла мы складываем второй и первый элементы списка. # # 2 + 1 = 3 # # И так далее. # # Почему этот код интересен? Потому, что он не ломается: Python не возражает против отрицательных индексов элементов, он просто начинает считать элементы с конца списка.