Основы программирования в Python

Алла Тамбовцева, НИУ ВШЭ

Семинар 2

Задача 0 (разминка)

Даны два списка a и b (см. ниже).

  1. Выведите на экран первый элемент списка a, третий элемент списка a, последний элемент списка a.
  2. Добавьте в список b элемент 7 (просто допишите в конец).
  3. Замените пятый элемент списка a на число 8.
  4. Создайте список merged, который включает в себя все элементы списка a и списка b.
  5. Создайте новый список с, который получается заменой последнего элемента списка a на число 100. Сам список a измениться не должен!
In [1]:
a = [1, 0, 9, 12, 18, 34, 89, 91, 33, 127]
b = [2, 8, 9, 11, 76, 25, 44]
In [2]:
# 1

print(a[0])
print(a[2])
print(a[-1])
1
9
127
In [3]:
# 2

b.append(7)
b
Out[3]:
[2, 8, 9, 11, 76, 25, 44, 7]
In [4]:
# 3

a[4] = 8
a
Out[4]:
[1, 0, 9, 12, 8, 34, 89, 91, 33, 127]
In [5]:
# 4

merged = a + b
merged
Out[5]:
[1, 0, 9, 12, 8, 34, 89, 91, 33, 127, 2, 8, 9, 11, 76, 25, 44, 7]
In [6]:
# 5

c = a.copy()
c[-1] = 100

print(a)
print(c)
[1, 0, 9, 12, 8, 34, 89, 91, 33, 127]
[1, 0, 9, 12, 8, 34, 89, 91, 33, 100]

Задача 1 (девочковая)

Есть список имен:

In [7]:
girls = ["Иветта", "Виолетта", "Кассандра", "Вирджиния", "Амелия", "Розамунда", "Янина", "Беатриса"]

Используя список girls, выведите на экран следующие списки:

["Виолетта", "Кассандра", "Вирджиния", "Амелия"]
["Вирджиния", "Амелия", "Розамунда", "Янина", "Беатриса"]
["Иветта", "Виолетта", "Вирджиния", "Амелия"]
["Кассандра", "Амелия", "Розамунда"]
In [8]:
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
['Виолетта', 'Кассандра', 'Вирджиния', 'Амелия']
['Вирджиния', 'Амелия', 'Розамунда', 'Янина', 'Беатриса']
['Иветта', 'Виолетта', 'Вирджиния', 'Амелия']
['Кассандра', 'Амелия', 'Розамунда']

Задача 2 (поэлементная)

Дан список L. Выведите на экран (последовательно, с новой строчки):

  • все элементы списка L
  • логарифмированные значения элементов списка L
In [9]:
L = [12, 3, 8, 125, 10, 98, 54, 199]
In [10]:
# 1
for i in L:
    print(i)
12
3
8
125
10
98
54
199
In [11]:
# 2
from math import log

for j in L:
    print(log(j))
2.4849066497880004
1.0986122886681098
2.0794415416798357
4.8283137373023015
2.302585092994046
4.584967478670572
3.9889840465642745
5.293304824724492

Замените пятый элемент списка L на 0. Проделайте те же операции, что и раньше. Объясните, почему получаются такие результаты.

In [12]:
L[4] = 0

for i in L:
    print(i)
12
3
8
125
0
98
54
199
In [13]:
for j in L:
    print(log(j))
2.4849066497880004
1.0986122886681098
2.0794415416798357
4.8283137373023015
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-577e24c31024> in <module>()
      1 for j in L:
----> 2     print(log(j))

ValueError: math domain error

ValueError: нельзя брать натуральный логарифм от неположительного числа.

Задача 3 (демографическая)

В списке age сохранены значения возраста респондентов:

age = [24, 35, 42, 27, 45, 48, 33]

Создайте список age2, в котором будут храниться значения возраста, возведенные в квадрат.

Подсказка: используйте цикл for.

In [14]:
age = [24, 35, 42, 27, 45, 48, 33]

age2 = []
for a in age:
    res = a ** 2
    age2.append(res)
age2
Out[14]:
[576, 1225, 1764, 729, 2025, 2304, 1089]

Преобразования можно было делать сразу внутри append(), не создавая промежуточную переменную res.

In [15]:
age2 = []
for a in age:
    age2.append(a ** 2)
age2
Out[15]:
[576, 1225, 1764, 729, 2025, 2304, 1089]

Задача 4 (игровая)

Питон просит пользователя загадать (ввести с клавиатуры) целое число $k$ от 1 до 10. Питон берет это число $k$ и выводит на экран $k$-тый элемент списка numbers, причем $k$-ый элемент в привычном понимании, в нумерации, которая начинается с единицы.

Список numbers:

In [16]:
numbers = [1, 5, 6, 8, 10, 21, 25, 1, 0, -9, 9]

Пояснение:

Входные данные:

Введите целое число от 1 до 10: 3

Выходные данные:

6
In [17]:
numbers = [1, 5, 6, 8, 10, 21, 25, 1, 0, -9, 9]
In [19]:
k = int(input("Введите целое число от 1 до 10: "))
print(numbers[k - 1])
Введите целое число от 1 до 10: 3
6

Задача 5 (мыслительная)

Объясните, что делает следующий код и почему он выдает такие результаты:

In [20]:
l = [1,2,3,4]

for i in range(len(l)):
    a = l[i] + l[i-1]
    print(a)
5
3
5
7

Разберем код на части. Что такое range(len(l))?

In [21]:
list(range(len(l))) # индексы элементов списка l
Out[21]:
[0, 1, 2, 3]

Значит цикл 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 не возражает против отрицательных индексов элементов, он просто начинает считать элементы с конца списка.