Ответы на модуль 7.6 из курса «Поколение python: курс для начинающих»
Полное решение на питоне урока 7.6 из » Поколение python: курс для начинающих».
Что покажет приведенный ниже фрагмент кода?
for i in range(10):
print(i, end=’*’)
if i > 6:
break
0*1*2*3*4*5*6*7*
Что покажет приведенный ниже фрагмент кода?
i = 100
while i > 0:
if i == 40:
break
print(i, end=’*’)
i -= 20
100*80*60*
Что покажет приведенный ниже фрагмент кода?
n = 10
while n > 0:
n -= 1
if n == 2:
continue
print(n, end=’*’)
9*8*7*6*5*4*3*1*0*
Что покажет приведенный ниже фрагмент кода?
result = 0
for i in range(10):
if i % 2 == 0:
continue
result += i
print(result)
Что покажет приведенный ниже фрагмент кода?
mult = 1
for i in range(1, 11):
if i % 2 == 0:
continue
if i % 9 == 0:
break
mult *= i
print(mult)
Наименьший делитель
На вход программе подается число n > 1. Напишите программу, которая выводит его наименьший отличный от 1 делитель.
# Получаем ввод числа n = int(input()) # Начинаем деление с 2 и идем до n for i in range(2, n + 1): if n % i == 0: # Проверяем, делится ли n на i без остатка break # Если нашли делитель, прерываем цикл # После окончания цикла i будет содержать минимальный делитель числа n print(i)

Следуй правилам
На вход программе подается натуральное число nn. Напишите программу, которая выводит числа от 1 до n включительно за исключением:
# Получаем ввод числа n = int(input()) # Проходим по числам от 1 до n включительно for i in range(1, n + 1): # Проверяем, принадлежит ли i одному из диапазонов (5-9, 17-37, 78-87) if i in range(5, 10) or i in range(17, 38) or i in range(78, 88): continue # Если i находится в одном из диапазонов, переходим к следующей итерации цикла print(i) # Если i не принадлежит ни одному из диапазонов, выводим его
Будет ли выполнен блок кода else, в приведенном ниже фрагменте кода?
n = 0
while n < 10:
n += 2
print(n)
else:
print(‘Цикл завершен.’)
Будет ли выполнен блок кода else, в приведенном ниже фрагменте кода?
n = 0
while n < 10:
n += 2
if n == 8:
break
print(n)
else:
print(‘Цикл завершен.’)
Будет ли выполнен блок кода else, в приведенном ниже фрагменте кода?
n = 0
while n < 10:
n += 2
if n == 7:
break
print(n)
else:
print(‘Цикл завершен.’)
Решение модуля 9.2 из курса «Поколение Python»
Дополните приведенный код, используя срезы, так чтобы он вывел первые 12 символов строки s .
s = "In 2010, someone paid 10k Bitcoin for two pizzas." print(s[:12])
Дополните приведенный код, используя срезы, так чтобы он вывел последние 9 символов строки s .
s = "In 2010, someone paid 10k Bitcoin for two pizzas." print(s[-9:])
Дополните приведенный код, используя срезы, так чтобы он вывел каждый 7 символ строки s начиная от начала строки.
s = "In 2010, someone paid 10k Bitcoin for two pizzas." print(s[::7])
Дополните приведенный код, используя срезы, так чтобы он вывел строку s в обратном порядке.
s = "In 2010, someone paid 10k Bitcoin for two pizzas." print(s[::-1])

Палиндром
На вход программе подается одно слово, записанное в нижнем регистре. Напишите программу, которая определяет является ли оно палиндромом.
# Получаем ввод строки s = input() p = s[::-1] # Переворачиваем строку s, создавая новую строку p с символами в обратном порядке if s == p: # Сравниваем строку s с перевернутой строкой p print('YES') # Если они равны, выводим 'YES' (строка является палиндромом) else: print('NO') # В противном случае выводим 'NO' (строка не является палиндромом)

Делаем срезы 1
На вход программе подается одна строка. Напишите программу, которая выводит:
общее количество символов в строке;
исходную строку повторенную 3 раза;
первый символ строки;
первые три символа строки;
последние три символа строки;
строку в обратном порядке;
строку с удаленным первым и последним символом.
s = input() print(len(s)) # общее количество символов в строке; print(s * 3) # исходную строку повторенную 3 раза; print(s[0]) # первый символ строки; print(s[:3]) # первые три символа строки; print(s[-3:]) # последние три символа строки; print(s[::-1]) # строку в обратном порядке; print(s[1:-1]) # строку с удаленным первым и последний символом.

Делаем срезы 2
На вход программе подается одна строка. Напишите программу, которая выводит:
третий символ этой строки;
предпоследний символ этой строки;
первые пять символов этой строки;
всю строку, кроме последних двух символов;
все символы с четными индексами;
все символы с нечетными индексами;
все символы в обратном порядке;
все символы строки через один в обратном порядке, начиная с последнего.
s = input() print(s[2]) # третий символ этой строки print(s[-2]) # предпоследний символ этой строки print(s[:5]) # первые пять символов этой строки print(s[:-2]) # всю строку, кроме последних двух символов print(s[::2]) # все символы с четными индексами print(s[1::2]) # все символы с нечетными индексами print(s[::-1]) # все символы в обратном порядке print(s[::-2]) # все символы строки через один в обратном порядке, начиная с последнего

Две половинки
На вход программе подается строка текста. Напишите программу, которая разрежет ее на две равные части, переставит их местами и выведет на экран.
s = input() x = len(s) # определяем длину строки a = x // 2 + x % 2 # определяем индекс элемента, с которого начинается часть строки после разреза print(s[a:] + s[:a]) # склеиваем части строки с этого элемента до конца и с начала до этого элемента (не включительно)
Что покажет приведенный ниже фрагмент кода? s = ‘abcdefg’
print(s[0]*3 + s[-1]*3 + s[3]*2 + s[3]*2)

9. Установите соответствие между определением и названием в табл. 3.5 по электронной таблице Excel. Определение Название А. Электронные таблицы форма … цию, которую можно представить или табличные процессоры 1. Это приложение, обрабатывающее ин- в виде таблиц и автоматизировать обра- ботку таких данных Это специальные пакеты программ, об- B. Excel рабатывающие информацию, которую можно представить в виде таблиц 3. Это файл, в котором на отдельных ли- C. .xlsx стах хранится информация (данные) Таблица 3.5 RAM 4. Это составная часть книги Excel, состоя-D. Рабочая книга Ехсеl щая из строк и столбцов, на пересечении которых находятся ячейки 5. Это расширение файлов, созданных Е. Ячейка в электронной таблице Ехсеl 6. Это основная единица хранения данных, F. Рабочий лист образующаяся на пересечении столбца и строки рабочего листа
Для одночасного змінення значень властивостей групи об’єктів у век- торній графіці потрібно. Виокремити групу об’єктів і згрупувати їх Провести форм … атування кожного з об’єктів |] Зберегти зображення у файлі, а потім відкрити цей файл Розгрупувати групу об’єктів Виконати над об’єктами команди меню Формат
конспект на тему «абсолютні, відносні й мішані посилання на комірки та діапазони комірок» даю 70 балов
помогите пожалуйста сделайте я не знаю как это делать
Які з наведених операцій належать до операцій редагування таблиць? (декілька відповідей) Виділити об’єкти таблиці, Установити рядки,Установити колір м … еж таблиці, Установити спосіб розміщення таблиці на аркуші, Об’ єднати клітинки
Начинаем_программировать_на_Python
чении состоит в применении цикла for. Вот общий формат:
for переменная in строковое_значение:
В данном формате переменная- это имя переменной, строковое_значение- строковый
литерал либо переменная, которая ссылается на строковое значение. Во время каждой ите
рации цикла переменная будет ссылаться на копию символа в строковом значении, начиная
с первого символа. Мы говорим, что цикл выполняет последовательный перебор символов
в строковом значении. Вот пример:
name = ‘Джулия’
for ch in name:
Переменная name ссылается на строковый литерал с шестью символами, поэтому цикл сде
лает шесть итераций. Во время первой итерации цикла переменная ch будет ссылаться на
‘д’, во время второй итерации — на ‘ж’ и т. д. (рис. 8.1 ). Когда программный код исполнит
ся, он покажет следующее:
На рис. 8.1 показано, как переменная ch ссылается на копию символа из строкового значения по
мере выполнения итераций цикла. Если в цикле поменять значение, на которое ссылается ch, то
это не повлияет на строковый литерал, на который ссылается переменная name. Для того чтобы
это продемонстрировать, взгляните на приведенный ниже фрагмент кода:
1 name = ‘Джулия’
2 for ch in name:
3 ch = ‘Х’
4 print(name)
Инструкция в строке 3 во время каждой итерации цикла повторно присваивает переменной ch
другое значение. Эта операция не влияет на строковый литерал ‘Джулия’, на который ссылается
переменная name, и не влияет на количество итераций цикла. Во время исполнения этого фраг
мента кода инструкция в строке 4 напечатает:
В программе 8.1 показан еще один пример. Эта программа просит пользователя ввести стро
ковое значение. Затем она применяет цикл for для обхода строкового значения, подсчиты
вая количество появлений буквы Т (в верхнем или нижнем регистре).
Глава 8. Подробнее о строковых данных 429
1-я итерация for ch in name: 2-я итерация for ch in name:
print(ch) print(ch)
3-я итерация for ch in name: 4-я итерация for ch in name:
print(ch) print(ch)
5-я итерация for ch in name: 6-я итерация for ch in name:
print(ch) print(ch)
РИС. 8.1. Обход строкового литерала ‘Джулия ‘
Программа 8.1 (count_Ts.py)
1 # Эта программа подсчитывает количество появлений
2 # буквы Т (в верхнем или нижнем регистре)
3 # в строковом значении.
5 def main():
6 # Создать переменную, в которой будет храниться количество.
7 # Переменная должна начинаться с О.
В count = О
10 # Получить от пользователя строковое значение.
11 my_string = inрut(‘Введите предложение: ‘)
13 # Подсчитать буквы Т.
14 for ch in my_string:
15 if ch == ‘Т’ or ch ‘т’:
430 Глава В. Подробнее о строковых данных
17 ‘раз.’)
18 # Напечатать результат.
19 print(‘Бyквa Т появляется’, count,
20
21 # Вызвать главную функцию.
22 main ()
Введите предложение : Кiro не ходи’!’, ‘1’0’1′ и не падает. 1Enter: 1
5Буква Т появляется раз(а) .
Еще один способ получить доступ к отдельным символам в строковом значении реализуется
при помощи индекса. Каждый символ в строковом значении имеет индекс, который задает
его позицию. Индексация начинается с О, поэтому индекс первого символа равняется О, ин
декс второго символа равняется 1 и т. д. Индекс последнего символа в строковом значении
равняется количеству символов в строковом значении минус 1. На рис. 8.2 показаны индек
сы для каждого символа в строковом литерале ‘ Ромашки белые’. Строковый литерал имеет
13 символов, поэтому индексы символов варьируются от О до 12.
Индекс можно использовать для получения копии отдельного символа в строковом зна
my_string = ‘Ромашки белые’
ch = my_string[б]
Выражение my_ str ing [6 J во второй инструкции возвращает копию символа из переменной
my_ string в индексной позиции 6. После исполнения этой инструкции переменная ch будет
ссылаться, как показано на рис. 8.3.
‘Ромашки белые my_string ~ ‘Ромашки белые’
о 1 2 3 4 5 6 7 8 9 10 11 12
РИС. 8.2. Индексы строкового значения РИС. 8.3. Получение копии символа из строкового значения
Вот еще один пример:
my_string = ‘Ромашки белые’
print(my_string[O], my_string[б], my_string[lO])
Этот фрагмент кода напечатает следующее:
В качестве индексов можно также использовать отрицательные числа. Это делается для
идентификации позиций символа относительно конца строкового значения. Для определе
ния позиции символа интерпретатор Python прибавляет отрицательные индексы к длине
строкового значения. Индекс -1 идентифицирует последний символ в строковом значении,
Глава 8. Подробнее о строковых данных 431
-2 идентифицирует предпоследний символ и т. д. Приведенный ниже фрагмент кода пока
my_string = ‘Ромашки белые’
print(my_string[-1], my_string[-2], my_string[-13])
Этот фрагмент кода напечатает следующее:
Исключение IndexError происходит при попытке применить индекс, который находится вне
диапазона конкретного строкового значения. Например, строковый литерал ‘Бостон’ имеет
6 символов, поэтому его допустимые индексы находятся в пределах от О до 5. (Допустимые
отрицательные индексы находятся между -1 и -6.) Вот пример кода, который демонстриру
ет исключение IndexError:
city = ‘Бостон’
print (city [6])
Данный тип ошибки, скорее всего, произойдет, когда цикл неправильно зайдет за пределы
конца строкового литерала:
city = ‘Бостон’
index = О
while index < 7:
print(city[index])
index += 1
Во время последней итерации этого цикла переменной index будет присвоено значение 6,
которое является недопустимым индексом для строкового литерала ‘Бостон’. В результате
функция print вызовет исключение IndexError.
В главе 7 вы познакомились с функцией len, которая возвращает длину последовательности.
Функция len также используется для получения длины строкового значения. Приведенный
ниже фрагмент кода это демонстрирует:
Вторая инструкция вызывает функцию len, передавая переменную city в качестве аргумен
та. Функция возвращает 6, т. е. длину строкового литерала ‘Бостон’. Это значение присваи
вается переменной size.
Функция len в особенности полезна для предотвращения ситуаций, когда циклы заходят за
пределы конца строкового значения:
city = ‘Бостон’
index = О
while index < len(city):
print(city[index])
index += 1
432 Глава В. Подробнее о строковых данных
Обратите внимание, что цикл повторяется до тех пор, пока индекс меньше длины строково
го значения. Это вызвано тем, что индекс последнего символа в строковом значении всегда
на 1 меньше его длины.
Конкатенация строковых данных
Распространенной операцией, выполняемой над строковыми данными, является их конка
тенация, или присоединение одного строкового значения в конец другого. В предыдущих
+главах вы видели примеры, в которых используется оператор для конкатенации строковых
значений. Оператор + порождает строковое значение, которое является объединением двух
других строковых значений, используемых в качестве его операндов. Приведенный ниже
интерактивный сеанс это демонстрирует:
1 >>> message = ‘Привет, ‘ + ‘мир!’ IEnterl
2 >>> print(message) [Enter]
3 Привет, мир!
4 >>>
Строка 1 конкатенирует строковые значения ‘Привет, ‘ и ‘мир! ‘, чтобы создать строковое
значение ‘Привет, мир!’. Полученный результат присваивается переменной message. Стро
ка 2 печатает строковое значение, на которое ссылается переменная message. Вывод показан
в строке 3.
Вот еще один интерактивный сеанс, который демонстрирует конкатенацию:
1 >>> first_name = ‘Эмили’ IEnterl
2 >>> last_name = ‘Егер’ IEnterl
3 >>> full name = first name + ‘ ‘ + last_name IEnterl
4 >>> print(full_name) IEnterl
5 Эмили Егер
6 >>>
Строка 1 присваивает переменной first_ name строковый литерал ‘Эмили’. Строка 2 при
сваивает переменной last_ name строковый литерал ‘Егер’. Строка 3 порождает строковое
значение, которое является конкатенацией переменной first_name, потом пробела и затем
переменной last_ name. Получившееся строковое значение присваивается переменной
full _ name. Строка 4 печатает строковое значение, на которое ссылается переменная
full_name. Вывод показан в строке 5.
Для выполнения конкатенации можно также использовать оператор +=. Приведенный ниже
интерактивный сеанс это демонстрирует:
1 >>> letters = ‘абв’ IEnterl
2 >>> letters += ‘где’ IEnterl
3 >>> print(letters) IEnterl
4 абвгде
5 >>>
Инструкция в строке 2 выполняет конкатенацию строковых литералов. Она работает так же,
letters = letters + ‘где’
Глава В. Подробнее о строковых данных 433
После исполнения инструкции в строке 2 переменная letters будет ссылаться на строковое
значение ‘абвгде’. Вот еще один пример:
>>> narne = ‘Келли’ [Enter[ # имя ‘Келли’
>>> narne += 1 1 [Enter [ # имя
>>> narne += ‘Ивонна’ [l11_tii) # имя ‘Келли 1
>>> narne += 1 ‘ [ЕПЩ] # имя ‘Келли Ивонна’
>>> narne += ‘Смит’ [lnter] # ИМЯ
>>> print(narne) е »Келли Ивонна
Келли Ивонна Смит ‘Келли Ивонна Смит’
Следует иметь в виду, что операнд с левой стороны от оператора +=должен быть сущест
вующей переменной. Если указать несуществующую переменную, то будет вызвано исклю
это немутирующие последовательности
В Python данные строкового типа являются немутирующими последовательностями, т. е.
после создания их нельзя изменить. Некоторые операции, такие как конкатенация, произво
дят впечатление, что они видоизменяют строковые данные, но в действительности этого не
происходит. Например, взгляните на программу 8.2.
Программа 8.2 ] (concatenate.py)
1 # Эта программа конкатенирует строковые значения.
3 def rnain () :
4 narne = ‘Кармен’
5 print(‘Имя’, narne)
6 narne = narne + ‘ Браун’
7 print (‘Теперь имя’, narne)
8
9 # Вызвать главную функцию.
1О rnain ()
Имя Кармен
Теперь имя Кармен Браун
Как показано на рис. 8.4, инструкция в строке 4 присваивает переменной narne строковый
литерал ‘Кармен’. Инструкция в строке 6 присоединяет к строковому литералу ‘Кармен’
строковый литерал ‘Браун’ и присваивает результат переменной narne (рис. 8.5). Как видно
из рисунка, исходное строковое значение ‘Кармен’ не изменилось. Вместо этого создается и
присваивается переменной narne новое строковое значение, содержащее ‘Кармен Браун’.
(Исходный строковый литерал ‘Кармен’ больше не используется, потому что ни одна пере
менная на него не ссылается. Интерпретатор Python в конечном счете удалит это неисполь
зуемое строковое значение из оперативной памяти.)
434 Глава В. Подробнее о строковых данных
name = name + ‘Браун’
=name ‘Кармен’ name
— E Jname Кармен Браун
РИС. 8.4. Строковый литерал ‘Кармен’ РИС. 8.5. Строковый литерал ‘Кармен Браун’
присвоен переменной name присвоен переменной name
fl’J Поскольку строковые данные являются немутирующими последовательностями, применять
выражение в форме строка [Иiщекс] с левой стороны оператора присваивания нельзя. На
пример, приведенный ниже фрагмент кода вызовет ошибку:
# Присвоить строковый литерал ‘Билл’ переменной friend.
friend = ‘Билл’
#Можно ли поменять первый символ на ‘У’?
friend[O] = ‘У’ # Нет, это вызовет ошибку!
Последняя инструкция в этом фрагменте кода вызовет исключение, потому что она пытается
изменить первый символ в строковом литерале ‘ Билл ‘ .
8.1. Допустим, что переменная name ссылается на строковое значение. Напишите цикл for,
который напечатает каждый символ в строковом значении.
8.2. Каков индекс первого символа в строковом значении?
8.3. Каков индекс последнего символа в строковом значении, которое имеет 1О символов?
8.4. Что произойдет, если попытаться применить для доступа к символу в строковом зна-
чении недопустимый индекс?
8.5. Как найти длину строкового значения?
8.6. Что не так с приведенным ниже фрагментом кода?
animal = ‘Тигр’
animal[O] = ‘Л’
8.2 Нарезка ст оковых значений
Выражения среза используются для извлечения диапазона символов из строкового зна
В главе 7 вы узнали, что срез является диапазоном элементов, извлекаемых из последова
тельности. При взятии среза из строкового значения в результате получается диапазон сим
волов строкового значения. Срезы строковых значений также называются подстроками.
Для того чтобы получить срез строкового значения, пишут выражение в приведенном ниже
общем формате:
Глава 8. Подробнее о строковых данных 435
В данном формате начало- это индекс первого символа в срезе, конец- индекс, отме
чающий конец среза. Это выражение возвращает строковое значение, содержащее копию
символов с начала до конца (но не включая последний). Например, предположим, что име
ется фрагмент кода:
full name = ‘Петти Линн Смит’
middle name = full_name[б:lO]
Вторая инструкция присваивает переменной middle_ name строковое значение ‘линн’.
Если в выражении среза опустить индекс начала, то Python будет использовать О в качестве
начального значения индекса. Вот пример:
full name = ‘Петти Линн Смит’
first_name = full_name[:S]
Вторая инструкция присваивает переменной first _ name строковое значение ‘Петти’.
Если в выражении среза опустить индекс конца, то Python будет использовать длину строко
вого значения в качестве индекса конца. Вот пример:
full name ‘Петти Линн Смит’
last name
full name [11 : ]
Вторая инструкция присваивает переменной last_ name строковое значение ‘Смит’.
Что присвоит переменной my string приведенный ниже фрагмент кода? Как вы думаете?
full name ‘Петти Линн Смит’
my_string
full _ name [: ]
Вторая инструкция присваивает переменной my_string весь строковый литерал ‘Петти Линн
Смит ‘ . Эта инструкция эквивалентна:
my_string = full_name[O : len(full_name)]
Примеры взятия срезов, которые мы видели до сих пор, демонстрируют получение срезов
символов, расположенных подряд друг за другом. Выражения среза также могут иметь
величину шага, который позволяет пропускать символы в строковом значении. Вот пример
программного кода, в котором используется выражение среза с величиной шага:
Третье число в скобках является величиной шага. Примененная в этом примере величина
шага 2 приводит к тому, что срез содержит каждый второй символ из заданного диапазона
в строковом значении. Этот фрагмент кода напечатает следующее:
АВДЁЗЙПНПСУХЧЩЫЭЯ
В качестве индексов в выражениях среза также можно использовать отрицательные числа,
чтобы ссылаться на позиции относительно конца строкового значения. Вот пример:
full name ‘Петти Линн Смит’
last name
full name [-4: ]
Вспомните, что Python прибавляет отрицательный индекс к длине строкового значения, что
бы ссылаться на позицию по этому индексу. Вторая инструкция в этом фрагменте кода при
сваивает переменной las t _ name строковое значение ‘Смит’.
436 Глава В. Подробнее о строковых данных
ПРИМЕЧАНИЕ
Недопустимые индексы в выражениях среза не вызывают исключение. Например:
• если индекс конца задает позицию за пределами конца строкового значения, то Python вместо
него будет использовать длину строкового значения;
• если индекс начала задает позицию до начала строкового значения, то Python вместо него
будет использовать О;
• если индекс начала больше индекса конца, то выражение среза вернет пустое строковое зна
Извлечение символов из строкового значения
В университете каждому студенту присваивается регистрационное имя для входа в систему .
Это имя используется студентом для регистрации в компьютерной системе кампуса. В рам
ках вашего сотрудничества с университетским подразделением по информационным техно
логиям вас попросили написать программный код, который генерирует для студентов сис
темные имена для входа в систему. Вы будете использовать приведенный ниже алгоритм
генерации имени для входа в систему:
1. Получить первые три буквы имени студента. (Если длина имени меньше трех букв, то
использовать все имя.)
2. Получить первые три буквы фамилии студента. (Если длина фамилии меньше трех букв,
то использовать всю фамилию.)
3. Получить последние три символа идентификационного номера студента. (Если длина
идентификационного номера меньше трех символов, то использовать весь идентифика
ционный номер.)
4. Конкатенировать три набора символов для генерации имени для входа в систему.
Например, если имя студента — Аманда Спенсер, ее идентификационный номер —
ENG672 l, то ее имя для входа в систему будет АмаСпе721. Вы решаете написать функцию
ge t _ l ogin_ name, которая в качестве аргументов принимает имя, фамилию и идентификаци
онный номер студента и возвращает имя для входа в систему в виде строкового значения .
Вы собираетесь сохранить эту функцию в модуле login.py. Этот модуль затем можно импор
тировать в любую программу Python, которая должна генерировать имя для входа в систему .
В программе 8.3 показан соответствующий код модуля login.py.
Программа 8.3 (login.py)
1 # Функция get_login_name принимает имя, фамилию и
2 # идентификационный номер в качестве аргуме н т о в.
3 # Он а в озвращает имя для вх ода в сист ему .
5 de f get l og in_ name (firs t, l ast , idnшnЬer ):
6 # Получит ь первые три буквы име ни.
7 3# Если длина имени меньше букв, т о
8 # сре з вернет в се имя целиком .
9 setl = fir st [O : 3]
Глава 8. Подробнее о строковых данных 437
10
11 # Получить первые три буквы фамилии.
12 # Если длина фамилии меньше 3 букв, то
13 # срез вернет всю фамилию целиком.
14 set2 = last[O : 3)
15
16 # Получить последние три буквы фамилии идентификатора.
17 #Если длина идентификатора меньше 3 символов, то
18 # срез вернет весь идентификатор целиком.
19 set3 = idnumЬer(-3 :]
20
21 # Собрать воедино наборы символов.
22 login_name = setl + set2 + set3
23
24 # Вернуть имя для входа в систему.
25 return login_name
Функция get_ login_ name принимает три строковых аргумента: имя, фамилию и идентифи
кационный номер. Инструкция в строке 9 применяет выражение среза для получения первых
трех символов строкового значения, на которое ссылается параметр f i r s t , и присваивает
эти символы как строковое значение переменной setl. Если длина строкового значения, на
которое ссылается параметр first, меньше трех символов, то значение 3 будет недопусти
мым конечным индексом. Если это так, то Python будет использовать в качестве конечного
индекса длину строкового значения, и выражение среза вернет все значение целиком.
Инструкция в строке 14 использует выражение среза для получения первых трех символов
строкового значения, на которое ссылается параметр l a s t , и присваивает эти символы как
строковое значение переменной set2. Если длина строкового значения, на которое ссылает
ся параметр last, меньше трех символов, то будет возвращено все значение целиком.
Инструкция в строке 19 использует выражение среза для получения последних трех симво
лов строкового значения, на которое ссылается параметр idnumЬer, и присваивает эти сим
волы как строковое значение переменной set3. Если длина строкового значения, на которое
ссылается параметр idпumЬer, меньше трех символов, то значение -3 будет недопустимым
начальным значением индекса. Если это так, то Python будет использовать О в качестве на
чального значения индекса.
Инструкция в строке 22 присваивает конкатенацию переменных setl, set2 и set3 перемен
ной login_ name. Эта переменная возвращается в строке 25. Программа 8.4 демонстрирует
Программа 8.4 (generate_login.py)
1 # Эта программа получает имя и фамилию пользователя
2 # и идентификационный номер студента. На основе этих данных
3 # она генерирует имя для входа в систему.
4
5 import login
6
438 Глава 8. Подробнее о строковых данных
7 def main () :
#8 Получить имя, фамилию и ИД-номер пользователя.
9 first = input (‘Введите свое имя: ‘)
10 last = input (‘Введите свою фамилию: ‘)
11 ‘)idnumЬer = inрut(‘Введите свой номер студента:
12
13 # Получить имя для входа в систему.
14 print (‘Ваше имя для входа в систему:’)
15 print(login.get_login_name(first, last, idnumЬer))
16
17 #Вызвать главную функцию.
18 main ()
Вывод 1 программы (вводимые данные выделены жирным шрифтом)
Введите свое имя : XoJ1nи 1 Enter 1
Введите свою фамилию : Гэ.цдис 1Enter 1
Введите свой номер студе нта : CSC34899 I Enter l
Ваше имя для входа в систему :
ХолГэд899
Вывод 2 программы (вводимые данные выделены жирным шрифтом)
Введите свое имя : Эл 1 Enterl
Ввеш~те свою фамилию : ~сииано 1Enter 1
Введите свой номер студента: 8104497 1Enter l
Ваше имя для входа в систему:
ЭлКус497
8.7. Что покажет приведенный ниже фрагмент кода?
mystring = ‘aЬcdefg’
print(mystring[2:5])
8.8. Что покажет приведенный ниже фрагмент кода?
8.9. Что покажет приведенный ниже фрагмент кода?
mystring = ‘abcdefg’
print (mystring [: 3] )
8.10. Что покажет приведенный ниже фрагмент кода?
mystring = ‘abcdefg’
print(mystring[:])
Глава 8. Подробнее о строковых данных 439
8.3 е ка пои к и манипуляция строковь ми данными
Python предоставляет операторы и методы проверки и поиска внутри строковых данных,
а также получения модифицированных копий строковых данных.
Проверка строковых значений при помощи in и not in
В Python оператор in используется с целью определения, содержится ли одно строковое
значение в другом. Вот общий формат выражения с использованием оператора in с двумя
строковое_значениеl in строковое_значение2
строковое_значениеl и строковое_значение2 могут быть либо строковыми литералами, либо
переменными, которые ссылаются на строковые значения. Это выражение возвращает исти
ну, если строковое_значениеl найдено в строковом_значении2. Например, взгляните на
фрагмент кода:
t ext = ‘Во семьде с ят с емь лет назад’
if ‘семь’ in text:
print (‘Строковое значение «семь» найдено. ‘)
else:
print (‘Строковое значение «семь» не найдено.’)
Этот фрагмент кода определяет, содержит ли строковое значение ‘Восемьде сят семь лет
назад’ подстроку ‘ семь ‘ . Если исполнить этот фрагмент кода, то он покажет:
Строковое значение «семь» найдено.
Для проверки, что строковое значение не содержится в другом строковом значении, можно
применить оператор not in. Вот пример:
name s = ‘Билл Джо анна Сьюзен Крис Хуан Кэти’
if ‘Пьер’ no t in na mes :
print (‘Пьер не найден. ‘)
else:
print (‘Пьер найден. ‘)
Если исполнить этот фрагмент кода, то он покажет:
Пь ер не найде н.
Из главы 6 известно, что метод — это функция, которая принадлежит объекту и выполняет
некоторую операцию с использованием этого объекта. Объекты строкового типа в Python
имеют многочисленные методы 1 • В этом разделе мы рассмотрим несколько строковых мето
дов для выполнения следующих типов операций:
1 В этой книге мы не охватим все строковые методы. Описание всех строковых методов см. в документации
Python на сайте www.python.org.
440 Глава В. Подробнее о строковых данных
+ проверка строковых значений;
+ выполнение различных модификаций;
+ поиск подстрок и замена последовательностей символов.
Вот общий формат вызова строкового метода:
строковая_переменная. метод (аргументы)
В данном формате строковая переменная- это переменная, которая ссылается на строко
вое значение, метод- имя метода, который вызывается, аргументы- один или несколько
передаваемых в метод аргументов. Давайте рассмотрим несколько примеров.
Методы проверки строковых значений
Строковые методы, перечисленные в табл. 8.1, проверяют строковое значение в отношении
определенных свойств. Например, метод isdigit () возвращает истину, если строковое зна
чение содержит только цифры. В противном случае он возвращает ложь. Вот пример:
stringl = ‘1200’
if stringl.isdigit():
print(stringl, ‘содержит только цифры.’)
else:
print(stringl, ‘содержит символы, отличные от цифр.’)
Этот фрагмент кода выведет на экран:
1200 содержит только цифры.
Вот еще один пример:
string2 = ’12ЗаЬс’
if string2.isdigit():
print (string2, ‘содержит только цифры.’)
else:
print(string2, ‘содержит символы, отличные от цифр.’)
Этот фрагмент кода выведет:
123аЬс содержит символы, отличные от цифр.
Таблица 8.1. Несколько методов проверки строкового значения
isalnum () Возвращает истину, если строковое значение содержит только буквы алфавита или цифры
isalpha () и имеет по крайней мере один символ. В противном случае возвращает ложь
isdigit ()
islower () Возвращает истину, если строковое значение содержит только буквы алфавита и имеет
по крайней мере один символ. В противном случае возвращает ложь
Возвращает истину, если строковое значение содержит только цифры и имеет по крайней
мере один символ. В противном случае возвращает ложь
Возвращает истину, если все буквы алфавита в строковом значении находятся в нижнем
регистре, и строковая последовательность содержит по крайней мере одну букву алфавита.
В противном случае возвращает ложь
Глава 8. Подробнее о строковых данных 441
Таблица 8.1 (окончание) •
isspace () Возвращает истину, если строковое значение содержит только пробельные символы
и имеет по крайней мере один символ. В противном случае возвращает ложь. (Пробельны-
———
ми символами являются пробелы, символы новой строки (\n) и символы табуляции(\ t).)
isupper ()
~-
Возвращает истину, если все буквы алфавита в строковом значении находятся в верхнем
регистре, и строковая последовательность содержит по крайней мере одну букву алфавита.
В противном случае возвращает ложь
Программа 8.5 демонстрирует несколько строковых методов проверки. Она просит пользо
вателя ввести строковое значение и затем выводит различные сообщения в зависимости от
возвращаемого методами значения.
JПрограмма 8.5 (stгiпg_test.py)
1 # Эта программа демонстрирует несколько строковых методов проверки.
4 # Получить от пользователя строковое значение.
5 user string inрut(‘Введите строковое значение: ‘)
6
7 print(‘Boт, что обнаружено в отношении введенного значения:’)
8
9 # Проанализировать строковое значение.
10 if user string.isalnurn():
11 print (‘Эта строка содержит буквы или цифры.’)
12 if user_string.isdigit():
13 print (‘Эта строка содержит только цифры.’)
14 if user_string.isalpha():
15 print (‘Эта строка содержит только буквы алфавита.’)
16 if user string.isspace():
17 print (‘Эта строка содержит только пробельные символы.’)
18 if user_string.islower():
19 print(‘Bce буквы в строке находятся в нижнем регистре.’)
20 if user string.isupper():
21 print(‘Bce буквы в строке находятся в верхнем регистре.’)
22
23 # Вызвать главную функцию.
24 rnain ()
Вывод 1 программы (вводимые данные выделены жирным шрифтом)
Введите строковое значение : абв j Enter l
Вот , что обнаружено в отношении введенного значения :
Эта строка содержит буквы или цифры .
Эта строка содержит только буквы алфавита .
Все буквы в строке находятся в ниж.нем регистре .
442 Глава 8. Подробнее о строковых данных
Вывод 2 программы (вводимые данные выделены жирным шрифтом)
Введите строковое значение : 123 1Enter 1
Вот , что обнаружено в отношении введенного значения :
Эта строка содержит буквы или цифры .
Эта строка содержит только цифры .
Вывод 3 программы (вводимые данные выделены жирным шрифтом)
Введите строковое значение : 123АБВ 1Enter 1
Вот , что обнаружено в отношении введенного значения :
Эта строка содержит буквы J.UIИ цифры .
Все буквы в строке находятся в верхнем регистре .
Несмотря на то что строковые данные являются немутирующими последовательностями,
т. е. их нельзя изменить, они имеют много методов, которые возвращают их видоизменен
ные версии. В табл. 8.2 приводится несколько таких методов.
Таблица 8.2. Методы модификации строкового значения
lower () Возвращает копию строкового значения, в котором все буквы преобразованы в ниж-
ний регистр. Любой символ, который уже находится в нижнем регистре или не явля-
lstrip () ется буквой алфавита, остается без изменения
lstrip (символ) Возвращает копию строкового значения, в котором все ведущие пробельные симво-
лы удалены. Ведущими пробельными символами являются пробелы, символы новой
rstrip ()
строки (\n) и символы табуляции(\ t), которые появляются в начале строкового
—
значения
rstrip (символ)
Аргументом символ является строковое значение, содержащее символ. Возвращает
strip ()
strip (символ) копию строкового значения, в котором удалены все экземпляры символа, появляю-
upper () щиеся в начале строкового значения
Возвращает копию строкового значения, в котором все замыкающие пробельные
символы удалены. Замыкающими пробельными символами являются пробелы,
символы новой строки (\n) и символы табуляции (\t), которые появляются в конце
Аргументом символ является строковое значение, содержащее символ. Возвращает
копию строковой последовательности, в которой удалены все экземпляры символа,
появляющиеся в конце строкового значения
Возвращает копию строкового значения, в котором удалены все ведущие —
и замыкающие пробельные символы
Возвращает копию строкового значения, в котором удалены все экземпляры симво-
ла, появляющиеся в начале и конце строкового значения
—
Возвращает копию строкового значения, в котором все буквы преобразованы в верх-
ний регистр. Любой символ, который уже находится в верхнем регистре или не явля-
ется буквой алфавита, остается без изменения
Глава 8. Подробнее о строковых данных 443
Например, метод lower () возвращает копию строкового значения, в котором все буквы пре
образованы в нижний регистр. Вот пример:
letters = ‘ЬЭЮЯ’
print(letters, letters.lower())
Этот фрагмент кода напечатает
Метод upper () возвращает копию строкового значения, в котором все буквы преобразованы
в верхний регистр. Вот пример:
letters = ‘абвг’
print(letters, letters.upper())
Этот фрагмент кода напечатает
Методы lower () и upper () полезны для выполнения нечувствительных к регистру сравне
ний строк. Операции сравнения строковых значений регистрочувствительны, т. е. символы
верхнего регистра и символы нижнего регистра различны. Например, в регистрочувстви
тельном сравнении строковое значение ‘абв’ не считается равным значению ‘АБВ’ или
значению ‘Абв ‘, потому что регистр символов отличается. Иногда удобнее выполнять
нечувствuтелыюе к регистру сравнение, в котором регистр символов игнорируется. В та
‘.ком случае строковое значение ‘абв’ считается таким же, что ‘АБВ’ и ‘Абв
Например, взгляните на приведенный ниже фрагмент кода:
again = ‘д’ ‘)
while again.lower() == ‘д’:
print (‘Привет’)
print (‘Желаете это увидеть еще раз?’)
again = input(‘д =да, все остальное= нет:
Обратите внимание, что последняя инструкция в цикле просит пользователя ввести д, чтобы
увидеть сообщение еще раз. Цикл повторяется до тех пор, пока выражение again. lower ()
‘д’ является истинным. Выражение будет истинным, если переменная again будет
‘ .ссылаться на д’ или ‘д’
Как показано ниже, аналогичные результаты можно достигнуть, используя метод upper () :
while again.upper() ‘д’:
print (‘Желаете это увидеть еще раз?’)
again = input(‘д =да, все остальное= нет: ‘)
Программам очень часто требуется выполнять поиск подстрок, или строковых данных,
которые появляются внутри других строковых данных. Например, предположим, что вы от
крыли документ в своем текстовом редакторе, и вам нужно отыскать слово, которое где-то
в нем находится. Искомое вами слово является подстрокой, которая появляется внутри бо
лее крупной последовательности символов, т. е. документе.
444 Глава 8. Подробнее о строковых данных
В табл. 8.3 перечислены некоторые строковые методы Python, которые выполняют поиск
подстрок, а также метод, который заменяет найденные подстроки другой подстрокой.
Таблица 8.3. Методы поиска и замены
Метод Описание
endswith(пoдcтpoкa)
Аргумент подстрока — это строковое значение. Метод возвращает истину,
find (подстрока)
если строковое значение заканчивается подстрокой —
replace (старое, новое)
Аргумент подстрока — это строковое значение. Метод возвращает
startswith(пoдcтpoкa)
наименьший индекс в строковом значении, где найдена подстрока.
1 Если подстрока не найдена, то метод возвращает -1
Аргументы старое и новое — это строковые значения. Метод возвращает
копию строкового значения, в котором все экземпляры старых подстрок
заменены новыми подстроками
Аргумент подстрока — это строковое значение. Метод возвращает истину,
если строковое значение начинается с подстроки
Метод endswi th () определяет, заканчивается ли строковое значение заданной подстрокой.
filename = input (‘Введите имя файла: ‘)
if filename.endswith(‘ .txt’):
print(‘Этo имя текстового файла.’)
elif filename.endswith(‘ .ру’):
print(‘Этo имя исходного файла Python. ‘)
elif filename.endswith(‘ .doc’):
print(‘Этo имя документа текстового редактора.’)
else:
print (‘Неизвестный тип файла. ‘)
Метод startswi th () работает как метод endswi th (), но определяет, начинается ли строковое
значение с заданной подстроки.
Метод find () отыскивает заданную подстроку в строковом значении и возвращает наи
меньшую индексную позицию подстроки, если она найдена. Если подстрока не найдена, то
метод возвращает -1. Вот пример:
string = ‘Восемьдесят семь лет назад’
position = string.find(‘ceмь’)
if position != -1:
print(‘Cлoвo «семь» найдено в индексной позиции’, position)
else:
print (‘Слово «семь» не найдено.’)
Этот фрагмент кода покажет
15Слово «семь» найдено в индексной позиции
Метод replace () возвращает копию строкового значения, где каждое вхождение заданной
подстроки было заменено другой подстрокой. Например, взгляните на приведенный ниже
фрагмент кода:
Глава 8. Подробнее о строковых данных 445
string = ‘Восемьдесят семь лет назад’
new_string = string.replace(‘лeт’, ‘дней’)
print(new_string)
Этот фрагмент кода покажет
Восемьдесят семь дней назад
Анализ символов в пароле
В университете пароли для компьютерной системы кампуса должны удовлетворять приве
денным ниже требованиям:
+ пароль должен иметь как минимум семь символов;
+ должен содержать как минимум одну букву в верхнем регистре;
+ должен содержать как минимум одну букву в нижнем регистре;
+ должен содержать как минимум одну цифру.
Во время создания студентом своего пароля допустимость пароля должна быть проверена,
чтобы он гарантированно удовлетворял этим требованиям. Вас попросили написать
программный код, который выполняет эту проверку. Вы решаете написать функцию
valid_password, которая принимает пароль в качестве аргумента и возвращает истину либо
ложь, чтобы указать, является ли он допустимым. Вот алгоритм функции в псевдокоде:
функция valid_password:
Назначить переменной correct_length значение false.
Назначить переменной has_uppercase значение false.
Назначить переменной has lowercase значение false.
Назначить переменной has_digit значение false.
Если пароль имеет длину семь символов или больше:
Назначить переменной correct_length значение true
для кЮIЩого символа в пароле:
если этот символ является буквой в верхнем регистре:
Назначить переменной has_uppercase значение true.
если этот символ является буквой в нижнем регистре:
Назначить переменной has_lowercase значение true.
если этот символ является цифрой:
Назначить переменной has_digit значение true.
Если correct_length и has_uppercase и has_lowercase и has digit:
Назначить переменной is valid значение true.
Назначить переменной is valid значение false.
Ранее (в предыдущей рубрике «В центре внимания’1 вы создали функцию get_ login_name
и сохранили ее в модуле login. Поскольку задача функции valid_password связана с задачей
создания учетной записи студента, вы решаете разместить функцию valid_password в том
же модуле login. В программе 8.6 приведен модуль входа в систему login, в который до
бавлена функция valid_password. Функция начинается в строке 34.
446 Глава 8. Подробнее о строковых данных
Программа 8.6 (login2.py)
1 # Функция get_login_name принимает имя, фамилию
2 # и идентификационный номер в качестве аргументов.
3 # Она возвращает имя для входа в систему.
4
5 def get login_name(first, last, idnumЬer):
6 # Получить первые три буквы имени.
7 # Если длина имени меньше 3 букв, то
8 # срез вернет все имя целиком.
9 setl = first[O : 3]
10
11 # Получить первые три буквы фамилии.
12 # Если длина фамилии меньше 3 букв, то
13 # срез вернет всю фамилию целиком.
14 set2 = last[O : 3]
15
16 # Получить последние три буквы фамилии идентификатора.
17 #Если длина идентификатора меньше 3 символов, то
18 # срез вернет весь идентификатор целиком.
19 set3 = idnumЬer[-3 :]
20
21 # Собрать воедино наборы символов.
22 login name = setl + set2 + set3
23
24 # Вернуть имя для входа в систему.
25 return login_name
26
27 # Функция valid_password принимает пароль в
28 # качестве аргумента и возвращает истину либо ложь,
29 # сообщая о его допустимости или недопустимости. Допустимый
30 # пароль должен состоять как минимум из 7 символов,
31 # иметь как минимум один символ в верхнем регистре,
32 # один символ в нижнем регистре и одну цифру.
33
34 def valid_password(password):
35 # Назначить булевым переменным значение False.
36 correct_length = False
37 has_uppercase = False
38 has lowercase = False
39 has digit = False
40
41 # Приступить к валидации.
42 # Начать с проверки длины пароля.
43 if len(password) >= 7:
44 correct length = True
45
Глава В. Подробнее о строковых данных 447
46 # Проанализировать каждый символ и установить
47 # соответствующий флаг, когда
48 # требуемый символ найден.
49 for ch in password:
50 if ch.isupper():
51 has_uppercase True
52 if ch. islower () :
53 has lowercase True
54 if ch.isdigit():
55 has_digit = True
56
57 # Определить, удовлетворены ли все требования.
58 # Если это так, то назначить is_valid значение True.
59 # В противном случае назначить is_valid значение False.
60 if correct_length and has_uppercase and \
61 has lowercase and has_digit:
62 is valid = True
63 else:
64 is valid False
65
66 # Вернуть переменную is valid.
67 return is valid
Программа 8.7 импортирует модуль входа в систему login и демонстрирует функцию
valid_password.
Программа 8.7 (validate_password.py)
1 # Эта программа получает от пользователя пароль
2 # и проверяет его допустимость.
3
4 import login
5 ‘)
6 def main () :
7 # Получить от пользователя пароль.
8 password = inрut(‘Введите свой пароль:
10 # Проверить допустимость пароля.
11 while not login.valid_password(password):
12 print (‘Этот пароль недопустим.’)
13 password input (‘Введите свой пароль: ‘)
14
15 print (‘Это допустимый пароль.’)
17 # Вызвать главную функцию.
18 main ()
448 Глава 8. Подробнее о строковых данных
Вывод программы (вводимые данные выделены жирным шрифтом )
Введите свой пароль : Ьоzо IEnter l
Этот пароль недопустим .
Введите свой пароль : kangaroo 1Enter 1
Этот пароль недопустим .
Введите свой пароль : Tiger9 IEnter l
Этот пароль недопустим .
Введите свой пароль : Leopard9 1Enter 1
Это допустимый пароль .
В главе 7 вы узнали, как дублировать список при помощи оператора повторения ( * ). Опера
тор повторения работает и со строковыми значениями. Вот общий формат:
Оператор повторения создает строковое значение, которое содержит п повторных копий
копируемого_ строкового_значения. Вот пример:
my_string = ‘w’ * 5
После исполнения этой инструкции my_ string будет ссылаться на строковое значение
•wwwww’. Вот еще один пример:
print (‘Привет’ * 5)
Эта инструкция напечатает:
Программа 8.8 демонстрирует оператор повторения.
Программа 8.8 (гepetitioп_operator.py)
1 # Эта программа демонстрирует оператор повторения.
4 # Напечатать девять строк, увеличивающихся по длине.
5 for count in range(l, 10):
6 print (‘Z’ * count)
8 # Напечатать девять строк, уменьшающихся по длине.
9 for count in range(8, О, -1):
10 print(‘Z’ * count)
12 # Вызвать главную функцию.
Глава 8. Подробнее о строковых данных 449
Разбиение строкового значения
Строковые значения в Python имеют метод spli t (), который возвращает список, содержа
щий слова в строковом значении. В программе 8.9 приведен пример.
Программа 8.9 (stгing_split.py)
1 # Эта программа демонстрирует метод split.
2
3 def main () :
4 # Создать строковое значение с несколькими словами.
5 my_string = ‘Один два три четыре’
6
7 # Разбить строковое значение.
8 word_list = my_string.split()
10 # Напечатать список слов.
11 print(word_list)
12
13 # Вызвать главную функцию.
14 main ()
Вывод программы
[ ‘ Один ‘, ‘ два ‘, ‘ три ‘, ‘ч етыре ‘ ]
По умолчанию метод spli t () в качестве символов-разделителей использует пробелы (т. е.
он возвращает список слов в строковом значении, которые отделены пробелами). Можно
450 Глава 8. Подробнее о строковых данных
задать другой разделитель, передав его в качестве аргумента в метод spl i t (). Например,
предположим, что строковый литерал содержит дату, как показано ниже:
Если требуется извлечь день, месяц и год в качестве элементов списка, то можно вызвать
‘ / ‘метод split (),используя символ в качестве символа-разделителя:
date list = date string.split(‘/’)
После исполнения этой инструкции переменная date_ list будет ссылаться на такой список:
В программе 8.1 О это продемонстрировано.
1 # Эта программа вызывает метод split, используя
2 #символ ‘ / ‘ в качестве разделителя.
4 def main () :
5 # Создать строковое значение с датой.
6 date_string = ’01/12/2018′
7
8 # Разбить дату.
9 date list date string.split(‘/’)
10
11 # Показать все части даты.
12 print(‘Дeнь:’, date_list[O])
13 print(‘Mecяц:’, date_list[l])
14 print(‘Гoд:’, date_list[2])
15
16 # Вызвать главную функцию.
17 main()
День : 01
Месяц : 12
Год : 2018
8.11. Напишите фрагмент кода с использованием оператора in, который определяет, являет
ся ли ‘d’ подстрокой переменной mystring.
8.12. Допустим, что переменная Ьig ссылается на строковое значение. Напишите инструк
цию, которая преобразует строковое значение, на которое она ссылается, в нижний
регистр и присваивает преобразованный результат переменной little.
8.13. Напишите инструкцию, которая выводит сообщение «Цифра», если строковое значе
ние, на которое ссылается переменная ch, содержит цифру. В противном случае эта
инструкция должна показать сообщение «Цифр нет».
Глава 8. Подробнее о строковых данных 451
8.14. Что покажет приведенный ниже фрагмент кода?
ch = ‘а’
ch2 = ch.upper()
print(ch, ch2)
8.15. Напишите цикл, который запрашивает у пользователя «Желаете повторить программу
или выйти? (П/В)». Цикл должен повторяться до тех пор, пока пользователь не введет
Пили В (в верхнем или нижнем регистре).
8.16. Что покажет приведенный ниже фрагмент кода?
8.17. Напишите цикл, который подсчитывает количество символов в верхнем регистре,
появляющихся в строковом значении, на которое ссылается переменная mystring.
8.18. Допустим, что в программе имеется приведенная ниже инструкция:
days = ‘Понедельник Вторник Среда’
Напишите инструкцию, которая разбивает строковое значение, создавая приведенный
[‘Понедельник’, ‘Вторник’, ‘Среда’]
8.19. Допустим, что в программе имеется приведенная ниже инструкция:
Напишите инструкцию, которая разбивает строковое значение, создавая приведенный
[ ‘ один ‘ , ‘два ‘ , ‘ три’ , ‘четыре ‘ ]
Вопросы для овто ения
1. Первым индексом в строковом значении является _ _ _ __
г) размер строкового значения минус один.
2. Последним индексом в строковом значении является _ _ _ __
г) размер строкового значения минус один.
452 Глава В. Подробнее о строковых данных
3. Если попытаться использовать индекс, который находится за пределами диапазона стро-
_ _ _ __кового значения, то
а) произойдет исключение ValueError;
б) произойдет исключение IndexError;
в) строковое значение будет стерто, и программа продолжит работу;
г) ничего не произойдет — недопустимый индекс будет проигнорирован.
4. Функция возвращает длину строкового значения.
5. Строковый метод возвращает копию строкового значения, в котором удале-
ны все ведущими пробельные символы.
г) strip_ leading ().
6. Строковый метод _ _ _ _ _ возвращает наименьшую индексную позицию в строковом
значении, где найдена заданная подстрока.
а) first index_ of ();
7. Инструкция _ _ _ _ _ определяет, содержится ли одно строковое значение в другом.
8. Строковый метод возвращает истину, если строковое значение содержит
только буквы и имеет по крайней мере один символ.
9. Строковый метод возвращает истину, если строковое значение содержит
только цифры и имеет по крайней мере один символ.
Глава 8. Подробнее о строковых данных 453
1О. Строковый метод возвращает копию строкового значения, в котором удале-
ны все ведущие и замыкающие пробельные символы.
в) remove_white space ( ) ;
г) rstrip ().
Истина или ложь
1. После создания строкового значения его нельзя изменить.
2. Цикл for можно применять для перебора отдельных символов в строковом значении.
3. Метод isupper () преобразует символы строкового значения в верхний регистр.
4. Оператор повторения(*) работает со строковыми значениями и со списками.
5. Когда вызывается метод spli t () , он разбивает строковое значение на две подстроки.
1. Что покажет приведенный ниже фрагмент кода?
mystr = ‘да’
mystr += ‘нет’
mystr += ‘да’
print(mystr)
2. Что покажет приведенный ниже фрагмент кода?
mystr = ‘абв’ * 3
3. Что покажет приведенный ниже фрагмент кода?
mystring = ‘абвгдеё’
print(mystring[2:5])
4. Что покажет приведенный ниже фрагмент кода?
numЬers = [1, 2, 3, 4, 5, 6, 7]
5. Что покажет приведенный ниже фрагмент кода?
name = ‘джо’
print(name.lower())
print(name.upper())
print(name)
454 Глава 8. Подробнее о строковых данных
1. Допустим, что переменная choice ссылается на строковое значение. Приведенная ниже
инструкция i f определяет, равна ли переменная choice значениям ‘д’ или ‘д’:
if choice == ‘д’ or choice == ‘д’:
Перепишите эту инструкцию так, чтобы она делала всего одно сравнение и использовала
оператор or. (Подсказка: примените метод upper () либо метод lower () .)
2. Напишите цикл, который подсчитывает количество пробельных символов в строковом
значении, на которое ссылается mystring.
3. Напишите цикл, который подсчитывает количество цифр в строковом значении, на ко
торое ссылается mystring.
4. Напишите цикл, который подсчитывает количество символов в нижнем регистре в стро
ковом значении, на которое ссылается mystring.
5. Напишите функцию, которая принимает строковое значение в качестве аргумента и воз
вращает истину, если аргумент заканчивается подстрокой ‘ . сот’. В противном случае
функция должна вернуть ложь.
6. Напишите фрагмент кода, делающий копию строкового значения, в котором все вхож
дения буквы ‘т’ в нижнем регистре преобразованы в верхний регистр.
7. Напишите функцию, которая принимает строковое значение в качестве аргумента и по
казывает строковое значение в обратном порядке.
8. Допустим, что переменная mystring ссылается на строковое значение. Напишите инст
рукцию, которая применяет выражение среза и показывает первые 3 символа в строко
9. Допустим, что переменная mystring ссылается на строковое значение. Напишите инст
рукцию, которая применяет выражение среза и показывает последние 3 символа в стро
1О. Взгляните на приведенную ниже инструкцию:
mystring = ‘пирожки>молоко>стряпня>яблочный пирог>мороженое’
Напишите инструкцию, которая разбивает это строковое значение, создавая приведен
ный ниже список:
[‘пирожки’, ‘молоко’, ‘стряпня’, ‘яблочный: пирог’, ‘мороженое’]
1. Инициалы. Напишите программу, которая получает строковое значение, содержащее
имя, отчество и фамилию человека и показывает инициалы. Например, если пользователь
вводит Михаил Иванович Кузнецов, то программа должна вывести М.И.К.
2. Сумма цифр в строке. Напишите программу, которая просит пользователя ввести ряд
однозначных чисел без разделителей. Программа должна вывести на экран сумму всех
однозначных чисел в строковом значении. Например, если пользователь вводит 2514, то
этот метод должен вернуть значение 12, которое является суммой 2, 5, 1 и 4.
3. Принтер дат. Напишите программу, которая считывает от пользователя строковое зна
чение, содержащее дату в формате дд/мм/гггг. Она должна напечатать дату в формате
12 марта 2018 г.
Глава В. Подробнее о строковых данных 455
4. Конвертер азбуки Морзе. Азбука Морзе представляет собой кодировку, где каждая
буква алфавита, каждая цифра и различные знаки препинания представлены серией точек
и тире. В табл. 8.4 и 8.5 показана часть этой азбуки.
Напишите программу, которая просит пользователя ввести строковое значение и затем
преобразует это строковое значение в кодировку азбукой Морзе.
Таблица 8.4. Азбука Морзе (интернациональная)
Символ Код Символ Код Символ Код Символ Код
пробел пробел —
6 — . G Q —
запятая — ..- 7 — . . R
точка 8 — — -.. н .»
— 9 » s
знак вопроса —- 1 —
..- -.. А — J — т «-
о в
—— с — «. к — u . —
1
2 —- D — L » у —
3 —
4 ..- — — Е м — w — «-
5 . — — » —
. — F N — х — -..
. «-
о — у
Таблица 8.5. Азбука Морзе (русские буквы)
Символ Код Символ Код Символ Код Символ Код
А — и ш
Б » р — щ —-
в — «. й ъ
г — — с . ы — «-
д — к т ь
-» л — .. — э —
Е,Ё м у ю
«.- н — ф ..- я «»
ж о —
— -.. п — х — » —
3 — ц
ч «
5. Алфавитный переводчик номера телефона. Многие компании используют телефонные
номера наподобие 555-GET-FOOD, чтобы клиентам было легче запоминать эти номера.
На стандартном телефоне буквам алфавита поставлены в соответствие числа следующим
образом:
456 Глава 8. Подробнее о строковых данных
Напишите программу, которая просит пользователя ввести 10-символьный номер теле
фона в формате ХХХ-ХХХ-ХХХХ. Приложение должно показать номер телефона, в ко
тором все буквенные символы в оригинале переведены в их числовой эквивалент.
Например, если пользователь вводит 555-GET-FOOD, то приложение должно вывести
555-438-3663.
6. Среднее количество слов. Среди исходного кода главы 8, а также в подпапке data
«Решений задач по программированию» соответствующей главы вы найдете файл
text.txt. В нем в каждой строке хранится одно предложение. Напишите программу, кото
рая читает содержимое файла и вычисляет среднее количество слов в расчете на пред
7. Анализ символов. Среди исходного кода главы 8, а также в подпапке data «Решений за
дач по программированию» соответствующей главы вы найдете файл text.txt. Напишите
программу, которая читает содержимое файла и определяет:
• количество букв в файле в верхнем регистре;
• количество букв в файле в нижнем регистре;
• количество цифр в файле;
• количество пробельных символов в файле.
8. Корректор предложений. Напишите программу с функцией, принимающей в качестве
аргумента строковое значение и возвращающей его копию, в котором первый символ
каждого предложения написан в верхнем регистре. Например, если аргументом является
«привет! меня зовут джо. а как твое имя?», то эта функция должна вернуть строковое
значение ‘Привет! Меня зовут Джо. А как твое имя?’. Программа должна предоста
вить пользователю возможность ввести строковое значение и затем передать его в функ
цию. Модифицированное строковое значение должно быть выведено на экран.
9. Гласные и согласные. Напишите программу с функцией, которая в качестве аргумента
принимает строковое значение и возвращает количество содержащихся в нем гласных.
Приложение должно иметь еще одну функцию, которая в качестве аргумента принимает
строковое значение и возвращает количество содержащихся в нем согласных. Приложе
ние должно предоставить пользователю возможность ввести строковое значение и пока
зать содержащееся в нем количество гласных и согласных.
Видеозапись «Задача о гласных и согласных» (Т/1е Vowels and Consonaпts ргоЫот)
10. Самый частотный символ. Напишите программу, которая предоставляет пользователю
возможность ввести строковое значение и выводит на экран символ, который появляется
в нем наиболее часто.
11. Разделитель слов. Напишите программу, которая на входе принимает предложение,
в котором все слова написаны без пробелов, но первая буква каждого слова находится
в верхнем регистре. Преобразуйте предложение в строковое значение, в котором слова
Глава В. Подробнее о строковых данных 457
отделены пробелами, и только первое слово начинается с буквы в верхнем регистре. На
пример, строковое значение «ОстановисьИПочувствуйЗапахРоз» будет преобразовано
в «Остановись и почувствуй запах ро з».
12. Молодежный жаргон. Напишите программу, которая на входе принимает предложение
и преобразует каждое его слово в «молодежный жаргон» . В одной из его версий во время
преобразования слова в молодежный жаргон первая буква удаляется и ставится в конец
слова. Затем в конец слова добавляется слог «ки». Вот пример.
Русский язык: ПРОСПАЛ ПОЧТИ ВСЮ НОЧЬ
Молодежный жаргон: РОСПАЛПКИ ОЧТИПКИ СЮВКИ ОЧЬНКИ
13. Лотерея PowerBall. Для того чтобы сыграть в лотерею PowerBall, покупают билет, в ко
тором имеется пять чисел от 1 до 69 и число «PowerBall» в диапазоне от 1 до 26. (Эти
числа можно выбрать самому либо дать билетному автомату их выбрать за вас случай
ным образом.) Затем в заданный день автомат случайным образом отбирает выигрыш
ный ряд чисел. Если первые пять чисел совпадают с первыми пятью выигрышными чис
лами в любом порядке, и ваше число PowerBall соответствует выигрышному числу
PowerBall, то вы выигрываете джекпот, который составляет очень крупную сумму денег.
Если ваши числа совпадают лишь с некоторыми выигрышными числами, то вы выигры
ваете меньшую сумму в зависимости от того, сколько выигрышных номеров совпало .
Среди исходного кода главы 8, а также в подпапке data «Решений задач по программиро
ванию» соответствующей главы вы найдете файл с именем pbnumbers.txt, содержащий
выигрышные номера PowerBall, которые были отобраны между 3 февраля 201 О и 11 мая
2016 (файл содержит 654 наборов выигрышных чисел). Рис. 8.6 показывает пример пер
вых нескольких строк содержимого этого файла. Каждая строка в файле содержит набор
из шести чисел, которые были выбраны в заданную дату. Числа отделены пробелом,
и последнее число в каждой строке является числом PowerBall для этого дня. Например,
первая строка в файле показывает числа за 3 февраля 201 О, которые равнялись 17, 22, 36,
37, 52, и число PowerBall, равное 24.
pbnumbers.txt — №tep~d о х
File Edit Form~t ie-w -H-elp — — — — «
17 22 36 37 52 24
14 22 52 54 59 04
05 08 29 37 38 34
10 14 30 40 51 01
07 08 19 26 36 15
13 27 37 41 54 32
04 17 35 50 57 12
РИС. 8.6. Файл pbnumbers.txt
Напишите одну или несколько программ, которые работают с этим файлом и показы
• 1О наиболее распространенных чисел, упорядоченных по частоте;
• 1О наименее распространенных чисел, упорядоченных по частоте;
458 Глава В. Подробнее о строковых данных
• 10 наиболее «созревших» чисел (чисел, которые не использовались долгое время),
упорядоченных от наиболее созревших до наименее созревших;
• частоту каждого числа от 1 до 69 и частоту каждого PowerBall числа от 1 до 26.
14. Цены на бензин. Среди исходного кода главы 8, а также в подпапке data «Решений за
дач по программированию» соответствующей главы, вы найдете файл GasPrices.txt. Этот
файл содержит еженедельные средние цены за галлон бензина в США, начиная 5 апреля
1993 года и заканчивая 26 августа 2013 года. На рис. 8.7 показан пример первых не
скольких строк данного файла.
G~sPrkes .ьt — Notep~d ох
File Edit Forma ‘,»! е. Help «
~4 — 05-1993:1 . 068 Ln 1, Col
04-12-1993: 1. 079
04 -19 -1993:1 . 079
04-26- 1993:1 . 086
05 -03 -1993:1 . 086
05-10-1993:1 . 097
05 -17 -1993:1 . 106
РИС. 8.7. Файл GasPrices.txt
Каждая строка в файле содержит среднюю цену за галлон бензина в указанный день
и отформатирована следующим образом:
где мм — двухзначный месяц; дц — двухзначный день; гггг — четырехзначный год;
Цена — это средняя цена галлона бензина в указанный день.
В рамках этого задания необходимо написать одну или несколько программ, которые
считывают содержимое данного файла и выполняют приведенные ниже вычисления.
• Средняя цена за год: вычисляет среднюю цену бензина за год для каждого года
в файле. (Данные файла начинаются апрелем 1993 и заканчиваются августом 2013.
Используйте данные, предоставленные за период с 1993 по 2013 годы.)
• Средняя цена за месяц: вычисляет среднюю цену в каждом месяце в файле.
• Наибольшая и наименьшая цены в году: в течение каждого года в файле опреде
ляет дату и величину самой низкой и самой высокой цены.
• Список цен, упорядоченный по возрастанию: генерирует текстовый файл, в кото
ром даты и цены отсортирован~~ в возрастающем порядке.
• Список цен, упорядоченный по увеличению: генерирует текстовый файл, в кото
ром даты и цены отсортированы в убывающем порядке.
Для выполнения всех этих вычислений можно написать одну программу или несколько
разных программ, одну для каждого вычисления.
1111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Словарь — это объект-контейнер, который хранит коллекцию данных. Каждый элемент
в словаре имеет две части: ключ и значение. Ключ используется, чтобы установить
местонахождение конкретного значения.
Buдf п Rn сь ‘Введещ ев cлnR.:J о’ (Jпtmr111r:tron to D1ctronaпes
Когда вы слышите слово «словарь», то, вероятно, представляете толстую книгу, такую как
«Большой толковый словарь», содержащую слова и их определения. Если вы хотите узнать
значение конкретного слова, вы отыскиваете его в словаре и получаете его определение.
В Python словарь — это объект, который хранит коллекцию данных. Каждый хранящийся
в словаре элемент имеет две части: ключ и значение. На практике элементы словаря обычно
называются парами ключ/значение. Когда требуется получить из словаря конкретное значе
ние, используется ключ, который связан с этим значением. Это подобно процессу поиска
слова в «Большом толковом словаре», где слова являются ключами, а определения — значе
Например, предположим, что каждый сотрудник компании имеет идентификационный но
мер, и нам нужно написать программу, которая позволяет отыскивать имя сотрудника путем
ввода идентификационного номера сотрудника. В этом случае можно создать словарь,
в котором каждый элемент содержит идентификационный номер сотрудника в качестве
ключа, и имя этого сотрудника в качестве значения. Если известен идентификационный
номер сотрудника, то можно получить имя этого сотрудника.
Еще одним примером будет программа, которая позволяет вводить имя человека и предос
тавляет его телефонный номер. Программа могла бы использовать словарь, в котором каж
дый элемент содержит имя человека в качестве ключа и телефонный номер человека в каче
стве значения. Если известно имя человека, то можно получить его телефонный номер.
Пары ключ/значение часто называются отображениями, потому что каждому ключу поставлено
в соответствие значение, т. е. каждый ключ как бы отображается на соответствующее ему зна
460 Глава 9. Словари и множества
Словарь создается путем заключения его элементов в фигурные скобки ( ит из ключа, затем двоеточия, после которого идет значение. Элементы словаря отделяются Эта инструкция создает словарь и присваивает его переменной phonebook (телефонная кни га). Словарь содержит приведенные ниже три элемента. • Первый элемент- ‘Крис’: ‘555-1111’. В этом элементе ключом является ‘Крис’, а зна • Второй элемент- ‘Кэти’: ‘555-2222’. В этом элементе ключом является ‘Кэти’, а зна • Третий элемент — ‘Джоанна’ : ‘555-3333 ‘. В этом элементе ключом является ‘Джоанна’, В этом примере ключами и значениями являются строковые объекты. Значения в словаре Получение значения из словаря Элементы в словаре не хранятся в каком-то конкретном порядке. Например, взгляните на выводятся на экран: Обратите внимание, что порядок следования, в котором выводятся элементы, отличается от Для того чтобы получить значение из словаря, просто пишут выражение в приведенном ни имя_ словаря [ключ] В данном формате имя_ словаря- это переменная, которая ссылается на словарь, ключ ное с этим ключом значение. Если ключ не существует, то вызывается исключение KeyError (ошибка ключа). Приведенный ниже интерактивный сеанс это демонстрирует: Глава 9. Словари и множества 461 2 >>> phonebook [ ‘Крис’] [Enter J 5 ‘555-3333’ Traceback (most recent call last) : Рассмотрим этот сеанс подробнее. + Строка 1 создает словарь, содержащий имена (в качестве ключей) и телефонные номера (в качестве значений). + В строке 2 выражение phonebook [ ‘Крис’] возвращает из словаря phonebook значение, которое связано с ключом ‘Крис’. Это значение показано в строке 3. + В строке 4 выражение phonebook [ ‘Джоанна’ J возвращает из словаря phonebook значение, которое связано с ключом ‘Джоанна’. Это значение показано в строке 5. + В строке 6 выражение phonebook [ ‘Кэти’ J возвращает из словаря phonebook значение, которое связано с ключом ‘ Кэти’ . Это значение показано в строке 7. + В строке 8 вводится выражение phonebook [ ‘Кэтрин’ ] . Ключ ‘Кэтрин’ в словаре phonebook отсутствует, и поэтому вызывается исключение KeyError. Напомним, что операции сравнения строковых значений регистрочувствительны. Выражение phonebook [ ‘кэти’ J не обнаружит в словаре ключа ‘Кэти’. Применение операторов in и not in для проверки на наличие значения в словаре Как продемонстрировано ранее, исключение KeyError вызывается при попытке получить из словаря значение с использованием несуществующего ключа. Для того чтобы предотвратить это исключение, можно применить оператор in, который определит наличие ключа перед попыткой его использовать для получения значения. Приведенный ниже интерактивный сеанс это демонстрирует: 2 >>> if ‘Крис’ in phonebook: [Enter[ 462 Глава 9. Словари и множества Инструкция i f в строке 2 определяет, имеется ли ключ ‘Крис’ в словаре phonebook. Если он Как продемонстрировано в приведенном ниже сеансе, чтобы определить, не существует ли ключ, можно также применить оператор not in: 5 Джоанна не найдена. Следует иметь в виду, что сравнения строковых значений при помощи операторов in и not in Добавление элементов в существующий словарь Словари являются мутирующими объектами. В словарь можно добавлять новые пары имя_ словаря [ключ] = значение Здесь имя_ словаря- это переменная, которая ссылается на словарь, ключ- это применяе Рассмотрим этот сеанс. + Строка 1 создает словарь, содержащий имена (в качестве ключей) и телефонные номера (в качестве значений). + Инструкция в строке 2 добавляет в словарь phonebook новую пару ключ/значение. По скольку ключа ‘Джо’ в словаре нет, эта инструкция добавляет ключ ‘Джо’ вместе со свя занным с ним значением ‘555-0123 ‘. + Инструкция в строке 3 изменяет значение, которое было связано с существующим клю чом. Поскольку ключ ‘Крис’ в словаре phonebook уже существует, эта инструкция меняет + Строка 4 выводит содержимое словаря phonebook. Результат показан в строке 5. Глава 9. Словари и множества 463 ПРИМЕЧАНИЕ то новое значение заменит существующее. Существующую пару ключ/значение можно из словаря удалить при помощи инструкции del. Вот общий формат: В данном формате имя_ словаря- это переменная, которая ссылается на словарь, ключ 2 >>> phonebook [Enter] Рассмотрим этот сеанс. + Строка 1 создает словарь, а строка 2 показывает его содержимое. В строке 6 можно увидеть результат — этот элемент в словаре больше не существует. + Строка 7 пытается снова удалить элемент с ключом ‘Крис ‘. Поскольку этот элемент больше не существует, вызывается исключение KeyError. Для того чтобы предотвратить вызов исключения KeyError, следует применить оператор in, который определит, имеется ли ключ в словаре, перед попыткой его удалить вместе со свя 2 >>> if ‘Крис’ in phonebook: [Enter[ 464 Глава 9. Словари и множества Получение количества элементов в словаре Для того чтобы получить количество элементов в словаре, можно применить встроенную функцию len. Приведенный ниже интерактивный сеанс это демонстрирует: Вот краткое описание инструкций в этом сеансе. + Строка 1 создает словарь с двумя элементами и присваивает его переменной phonebook. Эта функция возвращает значение 2, которое присваивается переменной num_ i tems. + Строка 3 передает переменню num items в функцию print. Результат функции выводится Смешивание типов данных в словаре Как уже упоминалось ранее, ключи в словаре должны быть немутирующими объектами, однако связанные с ними значения могут быть объектами любого типа. Например, как про демонстрировано в приведенном ниже интерактивном сеансе, значения могут быть списка ми. В этом сеансе мы создаем словарь, в котором ключами являются имена студентов, а зна -чениями списки экзаменационных оценок. 1 >>> test scores = < 'Кейла' : [88, 92, 100], IEnterl Рассмотрим этот сеанс подробнее. Инструкция в строках 1~ создает словарь и присваивает его переменной test_scores (экзаменационные оценки). Данный словарь содержит приве денные ниже четыре элемента. + Первый элемент- ‘Кейла’: [88, 92, 100). Здесь ключом является ‘Кейла ‘, значени ем — список [88, 92, 100). + Второй элемент — ‘Луис ‘ : [ 95, 7 4 , 81 J • Здесь ключом является ‘Луис ‘ , значением — список [95, 74, 81). + Третий элемент- ‘Софи’: [72, 88, 91). Здесь ключом является ‘Софи’, значением — список (72, 88, 91). Глава 9. Словари и множества 465 + Четвертый элемент- ‘Итен’: [70, 75, 78]. Здесь ключом является ‘Итен’, значени- ем — список (70, 75, 78]. Вот краткое описание остальной части данного сеанса. + Строка 5 выводит содержимое словаря, как показано в строках 6-7. + Строка 1О получает значение, которое связано с ключом ‘Кейла’ и присваивает его пере менной kayla_ scores. После исполнения этой инструкции переменная kayla_ scores ссы лается на список (88, 92, 100]. + Строка 11 передает переменную kayla scores в функцию print. Вывод этой функции показан в строке 12. Значения, хранящиеся в одном словаре, могут иметь разные типы. Например, значение не которого элемента может быть строковым объектом, значение другого элемента — списком, они должны оставаться немутирующими. Приведенный ниже интерактивный сеанс демон 2 >>> mixed_up [Enter[ Инструкция в строке 1 создает словарь и присваивает его переменной mixed up (смесь). Этот словарь содержит приведенные ниже элементы. + Первый элемент — ‘абв’ : 1 ‘. В этом элементе ключом является строковый литерал ‘абв’, значением — целое число 1. + Второй элемент — 999: ‘тада тада’. В этом элементе ключом является целое число 999, -значением строковое значение ‘тада тада ‘. + Третий элемент — (3, 6, 9): (3, 6, 9]. В этом элементе ключом является кортеж (3, 6, -9), значением список [3, 6, 9]. Приведенный ниже интерактивный сеанс демонстрирует более практический пример. Он Инструкция в строке 1 создает словарь и присваивает его переменной employee. Данный словарь содержит приведенные ниже элементы. + Первый элемент — ‘фио’ : ‘Кевин Смит’. Здесь ключом является строковый литерал -‘фио ‘, значением строковое значение ‘Кевин Смит’. + Второй элемент- ‘ид’ :12345. В этом элементе ключом является строковый литерал -•ид •,значением целое число 12345. + Третий элемент — ‘ставка’: 25. 75. Здесь ключом является строковый литерал ‘ставка’, значением — число с плавающей точкой 25. 75. 466 Глава 9. Словари и множества Создание пустого словаря Иногда требуется создать пустой словарь и добавлять в него элементы по мере выполнения 1 >>> phonebook = <) [Enter] Инструкция в строке создает пустой словарь и присваивает его переменной phonebook. Строки 2-4 добавляют пары ключ/значение в словарь, а инструкция в строке 5 выводит Для создания пустого словаря также можно воспользоваться встроенным методом dict () : После исполнения этой инструкции переменная phonebook будет ссылаться на пустой сло Применение цикла for для последовательного обхода словаря Для перебора всех ключей словаря применяется цикл for: В данном формате переменная- это имя переменной, словарь — имя словаря. Этот цикл выполняет одну итерацию для каждого элемента в словаре. Во время каждой итерации цик 1 >>> phonebook = 2 ‘Кэти’:’555-2222′, ]Enter] 6 10 Джоанна Глава 9. Словари и множества 467 15 Крис 555-1111 16 Кэти 555-2222 17 Джоанна 555-3333 Вот краткое описание инструкций в данном сеансе. + Строки 1-3 создают словарь с тремя элементами и присваивают его переменной + Строки 4-5 содержат цикл for, который выполняет одну итерацию для каждого элемента словаря phonebook. Во время каждой итерации цикла переменной key присваивается ключ. Строка 5 печатает значение переменной key. Строки 8-10 показывают результат + Строки 11-12 содержат еще один цикл for, который делает одну итерацию для каждого элемента словаря phonebook, присваивая ключ переменной key. Строка 15 печатает пере результат работы цикла. Несколько словарных методов Объекты-словари имеют ряд методов. В этом разделе мы рассмотрим несколько наиболее полезных из них, которые приведены в табл. 9.1. Таблица 9.1. Несколько словарных методов clear () Очищает содержимое словаря keys () Возвращает все ключи в словаре и связанные с ними значения в виде последовательности Возвращает произвольно выбранную из словаря пару ключ/значение в виде кортежа Возвращает все значения из словаря в виде последовательности кортежей Метод clear () удаляет все элементы в словаре, оставляя словарь пустым. Общий формат Приведенный ниже интерактивный сеанс демонстрирует работу этого метода: 468 Глава 9. Словари и множества Обратите внимание, что после исполнения инструкции в строке 4 словарь phonebook больше элементов не содержит. Для получения значения из словаря в качестве альтернативы оператору [J можно восполь зоваться методом get (J • Он не вызывает исключение, если заданный ключ не найден. Вот общий формат этого метода: словарь.gеt (ключ, значение_по_умолчанию) В данном формате словарь — это имя словаря, ключ- это искомый в словаре ключ, значе 1 >>> phonebook = 2 >>> value = phonebook.get(‘Kэти’, ‘Запись не найдена’) IEnterl Рассмотрим этот сеанс. + Инструкция в строке 2 ищет в словаре phonebook ключ ‘Кэти’. Этот ключ найден, поэто му возвращается связанное с ним значение, которое затем присваивается переменной + Строка 3 передает переменную value в функцию print. Результат функции выводится + Инструкция в строке 5 ищет в словаре phonebook ключ ‘Энди’. Этот ключ не найден, поэтому переменной value присваивается строковый литерал ‘Запись не найдена’. + Строка 6 передает переменную value в функцию print. Результат функции выводится Метод i tems () возвращает все ключи словаря и связанные с ними значения. Они возвраща ются в виде последовательности особого типа, которая называется словарным представле Глава 9. Словари и множества 469 Если вызвать метод phonebook. i terns (), то он вернет приведенную ниже последователь [ ( ‘Крис’, ‘555-1111’), (‘Кэти’, ‘555-2222’), (‘Джоанна’, ‘555-3333’)] Обратие внимание на следующие моменты: + первым элементом в последовательности является кортеж ( ‘Крис’, ‘555-1111’); Для того чтобы выполнить перебор кортежей в последовательности, можно применить цикл 1 >>> phonebook = 2 ‘Кэти’ : ‘555-2222’, [Enter [ В Крис 555-1111 Вот краткое описание инструкций в этом сеансе. + Строки 1-3 создают словарь с тремя элементами и присваивают его переменной + Цикл for в строках 4-5 вызывает метод phonebook. i terns (), который возвращает после довательность кортежей, содержащих пары ключ/значение словаря. Данный цикл выпол ции цикла значения кортежа присваиваются переменным key и value. Строка 5 печатает результат работы цикла. Метод keys () возвращает все ключи словаря в виде словарного представления, т. е. особого типа последовательности. Каждый элемент в словарном представлении является ключом Если вызвать метод phonebook. keys (), то он вернет приведенную ниже последовательность: [ ‘ Крис ‘ , ‘ Кэти’ , ‘Джоанна ‘ ] Приведенный ниже интерактивный сеанс показывает, каким образом можно применить цикл for для обхода последовательности, которая возвращается из метода keys () : 1 >>> phonebook = 2 470 Глава 9. Словари и множества 4 >>> for key in phonebook.keys(): 1Enter1 6 Метод рор () возвращает значение, связанное с заданным ключом, и удаляет эту пару ключ/значение из словаря. Если ключ не найден, то метод возвращает значение по умолча словарь.рор (ключ, значение_по_умолчанию) В данном формате словарь — это имя словаря, ключ- это искомый в словаре ключ, значе вызывается, он возвращает значение, которое связано с заданным ключом, и удаляет эту пару ключ/значение из словаря. Если заданный ключ в словаре не найден, то метод возвращает 1 >>> phonebook = < 'Крис': '555-1111', 1Enter1 Вот краткое описание инструкций в этом сеансе. + Строки 1-3 создают словарь с тремя элементами и присваивают его переменной + Строка 4 вызывает метод phonebook. рор (), передавая ‘Крис’ в качестве ключа поиска. Связанное с ключом ‘ Крис ‘ значение возвращается и присваивается переменной phone_ num. Пара ключ/значение, содержащая ключ ‘Крис ‘, удаляется из словаря. + Строка 5 показывает значение, присвоенное переменной phone_ num. Результат выводится в строке 6. Обратите внимание, что он представляет собой значение, которое было связа но С ключом ‘Крис’. + Строка 7 показывает содержимое словаря phonebook. Результат показан в строке 8. Обра тите внимание, что пара ключ/значение, которая содержала ключ ‘ Крис ‘ , больше в сло варе не существует. Глава 9. Словари и множества 471 + Строка 9 вызывает метод phonebook. рор () , передавая ‘Энди’ в качестве ключа поиска. Данный ключ не найден, поэтому переменной phone_ nurn присваивается строковый лите рал ‘Запись не найдена’. + Строка 1О показывает значение, присвоенное переменной phone_ nurn. Вывод показан + Строка 12 показывает содержимое словаря phonebook. Результат показан в строке 13. Метод popi tem () возвращает произвольно выбранную пару ключ/значение и удаляет эту пару из словаря. Пара ключ/значение возвращается в виде кортежа. Вот общий формат этого словарь. popi tem () Для того чтобы присвоить возвращаемый ключ и значение отдельным переменным, инст k, v = словарь.рорitеm() Этот тип присваивания называется кратным присваиванием, потому что значения присваи ваются сразу нескольким переменным. В приведенном выше общем формате k и v — это переменные. После исполнения этой инструкции переменной k присваивается произвольно Приведенный ниже интерактивный сеанс это демонстрирует: 1 >>> phonebook = (‘Крис’: ‘555-1111’, IEnterl 4 >>> phonebook IEnterl 5 ( ‘Крис’: ‘555-1111’, ‘Кэти’: ‘555-2222’, ‘Джоанна’: ‘555-3333’> 6 >>> key, value = phonebook.popitem() IEnterl 7 >>> print(key, value) IEnterl 9 >>> phonebook IEnterl 10 (‘Кэти’: ‘555-2222’, ‘Джоанна’: ‘555-3333’> Вот краткое описание инструкций в этом сеансе. + Строки 1-3 создают словарь с тремя элементами и присваивают его переменной + Строка 4 выводит содержимое словаря, которое показано в строке 5. значение присваиваются переменным key и value. Пара ключ/значение удаляется из сло + Строка 7 выводит значения, присвоенные переменным key и value. Результат показан + Строка 9 выводит содержимое словаря. Результат показан в строке 10. Обратите внима ние, что в строке 6 возвращенная из метода popi tem () пара ключ/значение была удалена. 472 Глава 9. Словари и множества Следует иметь в виду, что если метод popitem () вызывается с пустым словарем, то он вызы Метод values () возвращает все значения словаря (без своих ключей) в виде словарного представления, т. е. особого типа последовательности. Каждый элемент в словарном пред Если вызвать метод phonebook. values (),то он вернет такую последовательность: [ ‘555-1111′, 1 555-2222’, 1 555-3333 1 ] Приведенный ниже интерактивный сеанс показывает, каким образом можно применить цикл for для обхода последовательности, которая возвращается из метода values (): 8 555-1111 Применение словаря для имитации карточной колоды В некоторых играх, связанных с игральными картами, картам присваиваются числовые зна + числовым картам присваивается значение, которое на них напечатано. Например, двойка пик равняется 2, а пятерка бубей равняется 5; + валетам, дамам и королям назначается значение 1О; В этой рубрике мы рассмотрим программу, которая применяет словарь для имитирования тузам значение 1.) В парах ключ/значение достоинство карты используется в качестве клю дамы червей будет такой: ‘Дама червей’ : 1 О Глава 9. Словари и множества 473 А пара ключ/значение для восьмерки бубей будет такой: Программа предлагает пользователю ввести количество карт, которые нужно раздать, и достоинства розданных карт, а также сумма их достоинств. В программе 9.1 приведен соот ветствующий код. Программа разделена на три функции: main (главная), create_deck (соз Программа 9.1 (card_dealer.py). Главная функция 1 # Эта программа применяет словарь в качестве колоды карт. Строка 5 вызывает функцию create_deck. Она создает словарь, содержащий пары ключ/значение для колоды карт, и возвращает ссылку на словарь. Ссылка присваивается переменной deck (колода). Строка 8 предлагает пользователю ввести количество карт для раздачи. Введенное значение конвертируется в целочисленный тип int и присваивается переменной num_ cards. Строка 11 вызывает функцию deal_ cards, передавая ей в качестве аргументов переменные deck и num_ cards. Функция deal_ cards раздает заданное количество карт из колоды. Далее идет функция create deck. Программа 9.1 (продолжение). Функция create_ deck 13 # Функция create_deck возвращает словарь, 474 Глава 9. Словари и множества 24 ‘ Туз червей’ : 1, ‘ 2 червей’ : 2, ‘ 3 червей’ : 3, Программный код в строках 18-40 создает словарь с парами ключ/значение, представляю было легче читать программный код.) Строка 43 возвращает ссылку на словарь. Далее идет функция deal cards. Программа 9.1 (окончание). Функция deal_cards 45 # Функция deal cards раздает заданное количество карт 54 if numЬer > len(deck): 58 for count in range(numЬer): Глава 9. Словари и множества 475 60 print(card) Функция deal_ cards принимает два аргумента: количество карт для раздачи и колоду, из деляет, не превышает ли количество карт, подлежащих раздаче, количество карт в колоде. Если это так, то строка 55 задает количество раздаваемых карт равным количеству карт Цикл for, который начинается в строке 58, выполняет одну итерацию для каждой раздавае После завершения цикла строка 64 показывает сумму достоинств комбинации карт на руках. Вывод программы (вводимые данные выделены жирным шрифтом) Сколько карт раздать? 5 I Enter l 5 бубей 10 пик В ЦЕНТРЕ ВНИМАНИЯ Хранение имен и дней рождения в словаре В этой рубрике мы рассмотрим программу, которая хранит в словаре имена ваших друзей 1 Для произвольного отбора элементов без удаления их из словаря следует использовать метод random (). — 476 Глава 9. Словари и множества Программа показывает меню, которое позволяет пользователю выбрать один из приведен 1. Отыскать день рождения. 2. Добавить новый день рождения. 3. Изменить день рождения. 4. Удалить день рождения. 5. Выйти из программы. Программа первоначально начинает работу с пустого словаря, поэтому вам нужно выбрать из меню пункт 2, чтобы добавить новую запись. Когда вы добавите несколько записей, мож В программе 9.2 приведен соответствующий код. Программа разделена на шесть функций: main (главная), get_menu_ choice (получить пункт меню), look_up (отыскать), add (добавить), Программа 9.2 (blrthdays.py). Главная функция 1 # Эта программа применяет словарь для хранения 2 # имен и дней рождения друзей. 4 # Глобальные константы для пунктов меню 11 # Главная функция. 13 # Создать пустой словарь. 16 # Инициализировать переменную для выбора пользователя. 19 while choice != QUIT: #20 Получить выбранный пользователем пункт меню. 21 choice = get_menu_choice() 23 # Обработать выбранный вариант действий. 24 if choice == LOOK UP: 26 elif choice == ADD: 27 add (Ьirthdays) Глава 9. Словари и множества 477 28 elif choice == CНANGE: Глобальные константы, объявленные в строках 5-9, используются для проверки выбранного нием О. Эта переменная содержит выбранный пользователем пункт меню. Цикл while, который начинается в строке 19, повторяется до тех пор, пока пользователь не get_ menu_ choice. Функция get_ menu_ choice выводит меню и возвращает сделанный пользо Инструкция if-elif в строках 24-31 обрабатывает выбранный пользователем пункт меню. Далее идет функция get_menu_choice. Программа 9.2 (продолжение). Функция qet_menu_choice 33 # Функция get_menu_choice выводит меню и получает
запятыми. Приведенная ниже инструкция приводит пример определения словаря:
-чением ‘555-2222 ‘.
-а значением ‘555-3333 ‘.
могут быть объектами любого типа, но ключи должны быть немутирующими объектами.
Например, ключами могут быть строковые значения, целые числа, значения с плавающей
точкой или кортежи. Ключами не могут быть списки либо мутирующие объекты других
приведенный ниже интерактивный сеанс, в котором создается словарь, и его элементы
порядка, в котором они создавались. Этот пример показывает, что словари не являются
последовательностями, как списки, кортежи и строковые значения. Как результат, невоз
можно использовать числовой индекс для получения значения по его позиции в словаре.
Вместо этого для получения значения используется ключ.
же общем формате:
это применяемый ключ. Если ключ в словаре существует, то выражение возвращает связан
3 ‘555-1111’
4 >>> phonebook [‘Джоанна’] [Enter [
6 >>> phonebook [ ‘Кэти’ ] [Enter [
7 ‘555-2222’
8 >>> phoпebook [‘Кэтрин’] [Enter [
3 print (phonebook [ ‘Крис’ ] ) [Enter [ ! Enter [
4
5 555-1111
6 >>>
имеется, то инструкция в строке 3 показывает значение, которое связано с этим ключом.
1 >>> phonebook = [Enter[
2 >>> if ‘Джоанна’ not in phonebook: [Enter[
3 print (‘Джоанна не найдена. ‘) [Enter [ [Enter [
ключ/значение, используя для этого инструкцию присваивания в приведенном ниже общем
формате:
мый ключ. Если ключ уже в словаре существует, то присвоенное ему значение будет замене
но значением. Если же ключ отсутствует, то он будет добавлен в словарь вместе со связан
ным с ним значением. Приведенный ниже интерактивный сеанс это демонстрирует:
связанное с ним значение на ‘555-4444 ‘.
В словаре нельзя иметь повторяющиеся ключи. Если присвоить значение существующему ключу,
это применяемый ключ. После исполнения этой инструкции ключ и связанное с ним значе
ние будут из словаря удалены. Если ключ не существует, то будет вызвано исключение
KeyError. Приведенный ниже интерактивный сеанс это демонстрирует:
3 4 >>> del phonebook [ ‘Крис’] [Enter [
5 >>> phonebook [Enter[
6 7 >>> del phonebook [ ‘Крис’] [Enter [
8 Traceback (most recent call last) :
9 File «», line 1, in
10 del phonebook [ ‘Крис’]
11 KeyError: ‘Крис’
12 >>>
+ Строка 4 удаляет элемент с ключом ‘Крис’, строка 5 показывает содержимое словаря.
занным с ним значением. Приведенный ниже интерактивный сеанс это демонстрирует:
3 del phonebook [ ‘Крис’] [Enter 1 [ Enter [
4
5 >>> phonebook [Ente~
6 7 >>>
+ Строка 2 вызывает функцию len, передавая переменную phonebook в качестве аргумента.
2 ‘Луис’ [95, 74, 81), IEnterl
3 ‘Софи’ [72, 88, 91], IEnterl
4 ‘Итен’ [70, 75, 78) > [[nterl
5 >>> test scores IEnterl
6 7 ‘Луис’: (95, 74, 81)>
8 >>> test_scores[‘Coфи’] IEnterl
9 [72, 88, 91)
10 >>> kayla scores = test_scores[‘Keйлa’] IEnterl
11 >>> print(kayla_scores) Lful:tii.i]
12 (88, 92, 100)
13 >>>
+ Строка 8 получает значение, которое связано с ключом ‘Софи’. Это значение выводится
а значение еще одного элемента — целым числом. Ключи тоже могут иметь разные типы, но
стрирует, каким образом разные типы могут быть перемешаны в словаре:
создает словарь, который содержит различные порции данных о сотруднике:
программы. Для создания пустого словаря используются пустые фигурные скобки:
2 >>> phonebook[‘Kpиc’] = ‘555-1111’ ]Enter]
3 >>> рhоnеЬооk[‘Кэти’] = ‘555-2222’ ]Enter]
4 >>> рhоnеЬооk[‘Джоанна’] = ‘555-3333’ ]Enter]
5 >>> phonebook ]Enter]
6 < 'Крис' : '555-1111', 'Кэти' : '555-2222', 'Джоанна' : '555-3333' >
7 >>>
phonebook = dict()
for переменная in словарь:
ла переменной присваивается ключ. Приведенный ниже интерактивный сеанс это демонст
3 ‘Джоанна’: ‘555-3333’> ]Enter]
4 >>> for key in phonebook: ]Enter]
5 print (key) ]Enter] ]Enter]
7
8 Крис
9 Кэти
11 >>> for key in phonebook: ]Enter]
12 print(key, phonebook [key]) ]Enter] ]Enter]
13
14
менную key и затем значение, которое связано с этим ключом. Строки 15-17 показывают
get ()
Получает значение, связанное с заданным ключом. Если ключ не найден, то этот метод
items () не вызывает исключение. Вместо этого он возвращает значение по умолчанию
кортежей
рор()
Возвращает все ключи в словаре в виде последовательности кортежей
popitem()
Возвращает из словаря значение, связанное с заданным ключом и удаляет эту пару
values () ключ/значение. Если ключ не найден, то этот метод возвращает значение по умолчанию
и удаляет эту пару ключ/значение из словаря
ние_по_умолчанию — значение, которое возвращается, если ключ не найден. Когда этот метод
вызывается, он возвращает значение, которое связано с заданным ключом. Если заданный
ключ в словаре не найден, то этот метод возвращает значение_по_умолчанию. Приведенный
ниже интерактивный сеанс демонстрирует работу этого метода:
3 >>> print(value) IEnterl
4 555-2222
5 >>> value = phonebook.get(‘Энди’, ‘Запись не найдена’) IEnter]
6 >>> print(value) IEnterl
7 Запись не найдена
8 >>>
нием. Каждый элемент в словарном представлении является кортежем, и каждый кортеж
содержит ключ и связанное с ним значение. Например, предположим, что мы создали при
веденный ниже словарь:
+ вторым элементом в последовательности является кортеж (‘Кэти’, ‘555-2222’);
+ третьим элементом в последовательности является кортеж (‘Джоанна’, ‘555-3333’).
3 ‘Джоанна’: ‘555-3333’> IEnter[
4 >>> for key, value in phonebook.iterns(): IEnterl
5 print(key, value) [Enter[ [Enter[
6
9 Кэти 555-2222
10 Джоанна 555-3333
11 >»
няет одну итерацию для каждого кортежа в последовательности. Во время каждой итера
значение переменной key и затем значение переменной value. Строки 8-10 показывают
словаря. Например, предположим, что мы создали такой словарь:
3 ‘Кэти’: ‘555-2222’, [Enterl
‘Джоанна’: ‘555-3333’> IEnter[
5 print (key) 1Enter 1 1Enter 1
7
8 Крис
9 Кэти
нию. Вот общий формат этого метода:
ние_по_умолчанию- значение, которое возвращается, если ключ не найден. Когда этот метод
значение_по_умолчанию. Приведенный ниже интерактивный сеанс это демонстрирует:
2 ‘Кэти’ : ‘555-2222’, 1Enter1
3 ‘Джоанна’:’ 555-3333’> 1Enter1
4 >>> phone_num = phonebook.pop(‘Kpиc’, ‘Запись не найдена’) IEnterl
5 >>> phone_num IEnterl
6 ‘555-1111’
7 >>> phonebook IEnterl
8
9 >>> phone_num = рhоnеЬооk.рор(‘Энди’, ‘Запись не найдена’) IEnterl
10 >>> phone_num IEnterl
11 Запись не найдена
12 >>> phonebook IEnterl
13
14 >>>
рукция присваивания применяется в приведенном ниже общем формате:
выбранный из словаря ключ, а переменной v — значение, связанное с этим ключом. Пара
ключ/значение удаляется из словаря.
2 ‘Кэти’ : ‘555-2222’, 1Enter1
3 ‘Джоанна’:’ 555-3333’> 1Enter1
+ Строка 6 вызывает метод phonebook. popi tem () . Возвращаемые из этого метода ключ и
вает исключение KeyError.
ставлении является значением из словаря. Например, предположим, что мы создали приве
денный ниже словарь:
1 >>> phonebook = (‘Крис’ :’555-1111′, [EnterJ
2 ‘Кэти’:’555-2222′, [Enter[
3 ‘Джоанна’:’555-3333′) [Enter[
4 >>> for val in phonebook.values(): rEnter[
5 print(val) [Ente!] [Enter[
9 555-3333
10 555-2222
11 >>>
чения. Например в игре блек-джек картам даются числовые значения:
+ тузам назначается 1 либо 11 в зависимости от выбора игрока.
стандартной колоды игральных карт, где картам присваиваются числовые значения, подоб
ные тем, которые используются в игре блек-джек. (В этой программе мы присваиваем всем
ча, а числовое значение карты — в качестве значения. Например, пара ключ/значение для
произвольным образом раздает на руки это количество карт из колоды. Затем выводятся
дать колоду) и deal_ cards (раздать карты). Вместо того чтобы представлять всю программу
целиком, давайте сначала рассмотрим главную функцию main.
2
3 def main () :
4 # Создать колоду карт.
5 deck = create_deck()
6
7 # Получить количество карт для раздачи.
8 num cards = int(input(‘Cкoлькo карт раздать? ‘))
9
10 # Раздать карты.
11 deal cards(deck, num_cards)
12
14 # представляющий колоду карт.
15 def create_deck():
16 # Создать словарь, в котором каждая карта и ее значение
17 # хранятся в виде пар ключ/значение.
18 deck = 19 ‘4 пик’ :4, ‘5 пик’ :5, ‘6 пик’ :6,
20 ‘7 пик’:7, ‘8 пик’:8, ‘9 пик’:9,
21 ‘ 1О пик ‘ : 1 О, ‘Валет пик’ : 1 О,
22 ‘Дама пик’ :10, ‘Король пик’: 10,
23
25 ‘4 червей’ :4, ‘5 червей’ :5, ‘6 червей’ :6,
26 ‘ 7 червей’ : 7, ‘ 8 червей’ : 8, ‘ 9 червей’ : 9,
27 ’10 червей’: 10, ‘Валет червей’: 10,
28 ‘Дама червей’ :10, ‘Король червей’: 10,
29
30 ‘ Туз треф’ : 1, ‘ 2 треф ‘ : 2, ‘ 3 треф’ : 3,
31 ‘ 4 треф’ : 4, ‘ 5 треф’ : 5, ‘ 6 треф’ : 6,
32 ‘ 7 треф’ : 7, ‘ 8 треф’ : 8, ‘ 9 треф’ : 9,
33 ’10 треф’ :10, ‘Валет треф’ :10,
34 ‘Дама треф ‘ : 1 О, ‘ Король треф’ : 1 О,
35
36 ‘ Туз бубей’ : 1, ‘ 2 бубей’ : 2, ‘ 3 бубей’ : 3,
37 ‘ 4 бубей’ : 4, ‘ 5 бубей’ : 5, ‘ 6 бубей’ : 6,
38 ‘ 7 бубей’ : 7, ‘ 8 бубей’ : 8, ‘ 9 бубей’ : 9,
39 ‘ 1 О бубей’ : 1 О, ‘Валет бубей’ : 1 О,
40 ‘Дама бубей’ : 1 О, ‘ Король бубей’ : 1 О )
41
42 # Вернуть колоду.
43 return deck
44
щими карты стандартной игральной колоды. (Пустые строки 22, 29 и 35 вставлены, чтобы
46 # ИЗ КОЛОДЫ.
47
48 def deal_cards(deck, numЬer):
49 # Инициализировать накопитель для количества карт на руках.
50 hand value = О
51
52 # Убедиться, что количество карт для раздачи
53 # не больше количества карт в колоде.
55 numЬer = len(deck)
56
57 # Раздать карты и накопить их значения.
59 card, value = deck.popitem()
61 hand value += value
62
63 # Показать величину карт на руках.
64 print (‘Величина карт на руках: ‘, hand_value)
65
66 # Вызвать главную функцию.
67 main ()
которой они раздаются. Строка 50 инициализирует накапливающую переменную
hand_value (сумма достоинств карт на руках) значением О. Инструкция i f в строке 54 опре
мой карты. Внутри цикла инструкция в строке 59 вызывает метод popi tem (), который воз
вращает из словаря deck произвольную пару ключ/значение и удаляет эту пару из словаря 1 •
Ключ присваивается переменной card, а значение- переменной value. Строка 60 показы
вает достоинство карты, строка 61 прибавляет значение карты в накопитель hand_ value.
8 червей
5 червей
Величина карт на руках: 38
и дни их рождения. Каждая запись в словаре использует имя друга в качестве ключа, а его
день рождения в качестве значения. Эту программу можно использовать для поиска дней
рождения друзей по вводимому имени.
ных ниже вариантов действий:
но выбрать пункт 1, чтобы отыскать день рождения определенного человека, пункт 3, чтобы
изменить существующий день рождения в словаре, пункт 4, чтобы удалить день рождения
из словаря, или пункт 5, чтобы выйти из программы.
change (изменить) и delete (удалить). Вместо того чтобы приводить всю программу цели
ком, давайте сначала исследуем глобальные константы и главную функцию main.
29 change(birthdays)
30 elif choice == DELETE:
31 delete(birthdays)
32
пользователем пункта меню. В главной функции строка 14 создает пустой словарь, на кото
рый ссылается переменная Ьirthdays. Строка 17 инициализирует переменную choice значе
примет решение выйти из программы. Внутри цикла строка 21 вызывает функцию
вателем выбор. Возвращенное значение присваивается переменной choice.
Если пользователь выбирает пункт 1, то строка 25 вызывает функцию look_ up. Если пользо
ватель выбирает пункт 2, то строка 27 вызывает функцию add. Если пользователь выбирает
пункт 3, то строка 29 вызывает функцию change. Если пользователь выбирает пункт 4, то
строка 31 вызывает функцию delete.
34 # проверенный на допустимость выбранный пользователем пункт.
35 def get_menu_choice():
36 print ()
37 print (‘Друзья и их дни рождения’)
38 print(‘———————— 1 )
39 print(‘l. Найти день рождения’)
40 print ( ‘2. Добавить новый день рождения’)
41 print(‘3. Изменить день рождения’)
42 print(‘4. Удалить день рождения’)
43 print ( ‘5. Выйти из программы’)
44 print()
45
46 # Получить выбранный пользователем пункт.
4 7 choice = int (input ( ‘Введите выбранный пункт: ‘ ) )
48
49 # Проверить выбранный пункт на допустимость.
50 while choice < LOOK UP or choice >QUIT:
51 choice = int(input(‘Bвeдитe выбранный пункт: ‘))
52
53 # Вернуть выбранный пользователем пункт.
54 return choice
55
