Главная страница

ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов


Скачать 7.92 Mb.
НазваниеНиколай Прохоренок Владимир Дронов
Дата05.05.2023
Размер7.92 Mb.
Формат файлаpdf
Имя файлаПрохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен.pdf
ТипДокументы
#1111379
страница9 из 83
1   ...   5   6   7   8   9   10   11   12   ...   83
Для примера напишем программу, которая проверяет, является введенное пользователем число четным или нет (листинг 4.1). После проверки выводится соответствующее сооб- щение.
Листинг 4.1. Проверка числа на четность
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
Если блок состоит из одной инструкции, эту инструкцию можно разместить на одной стро- ке с заголовком:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
В этом случае концом блока является конец строки. Это означает, что можно разместить сразу несколько инструкций на одной строке, разделяя их точкой с запятой:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" "); print("- четное число") else: print(x, end=" "); print("- нечетное число") input()
С
ОВЕТ
Знайте, что так сделать можно, но никогда на практике не пользуйтесь этим способом, поскольку подобная конструкция нарушает стройность кода и ухудшает его сопровождение в дальнейшем. Всегда размещайте инструкцию на отдельной строке, даже если блок содержит только одну инструкцию.
Согласитесь, что следующий код читается намного проще, чем предыдущий:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" ") print("- четное число")

64
Часть I. Основы языка Python else: print(x, end=" ") print("- нечетное число") input()
Оператор ветвления if...else позволяет проверить сразу несколько условий. Рассмотрим это на примере (листинг 4.2).
Листинг 4.2. Проверка нескольких условий
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") elif not os: print("Вы не ввели число") else: print("Мы не смогли определить вашу операционную систему") input()
С помощью инструкции elif мы можем определить выбранное значение и вывести соответ- ствующее сообщение. Обратите внимание на то, что логическое выражение не содержит операторов сравнения: elif not os:
Такая запись эквивалентна следующей: elif os == "":
Проверка на равенство выражения значению
True выполняется по умолчанию. Поскольку пустая строка интерпретируется как
False
, мы инвертируем возвращаемое значение с по- мощью оператора not
Один условный оператор можно вложить в другой. В этом случае отступ вложенной инст- рукции должен быть в два раза больше (листинг 4.3).

Глава 4. Условные операторы и циклы
65
Листинг 4.3. Вложенные инструкции
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os != "": if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") else: print("Мы не смогли определить вашу операционную систему") else: print("Вы не ввели число") input()
Оператор ветвления if...else имеет еще один формат:
<Переменная> = <Если истина> if <Условие> else <Если ложь>
Пример:
>>> print("Yes" if 10 % 2 == 0 else "No")
Yes
>>> s = "Yes" if 10 % 2 == 0 else "No"
>>> s
'Yes'
>>> s = "Yes" if 11 % 2 == 0 else "No"
>>> s
'No'
4.3. Цикл for
Предположим, нужно вывести все числа от 1 до 100 по одному на строке. Обычным спосо- бом пришлось бы писать 100 строк кода: print(1) print(2) print(100)

66
Часть I. Основы языка Python
При помощи цикла то же действие можно выполнить одной строкой: for x in range(1, 101): print(x)
Иными словами, циклы позволяют выполнить одни и те же инструкции многократно.
Цикл for применяется для перебора элементов последовательности и имеет такой формат: for <Текущий элемент> in <Последовательность>:
<Инструкции внутри цикла>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Здесь присутствуют следующие конструкции:

<Последовательность>
— объект, поддерживающий механизм итерации: строка, список, кортеж, диапазон, словарь и др.;

<Текущий элемент>
— на каждой итерации через эту переменную доступен очередной элемент последовательности или ключ словаря;

<Инструкции внутри цикла>
— блок, который будет многократно выполняться;
 если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Пример перебора букв в слове приведен в листинге 4.4.
Листинг 4.4. Перебор букв в слове for s in "str": print(s, end=" ") else: print("\nЦикл выполнен")
Результат выполнения: s t r
Цикл выполнен
Теперь выведем каждый элемент списка и кортежа на отдельной строке (листинг 4.5).
Листинг 4.5. Перебор списка и кортежа for x in [1, 2, 3]: print(x) for y in (1, 2, 3): print(y)
Цикл for позволяет также перебрать элементы словарей, хотя словари и не являются после- довательностями. В качестве примера выведем элементы словаря двумя способами. Первый способ использует метод keys()
, возвращающий объект dict_keys
, который содержит все ключи словаря:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> arr.keys()

Глава 4. Условные операторы и циклы
67 dict_keys(['y', 'x', 'z'])
>>> for key in arr.keys(): print(key, arr[key]) y 2 x 1 z 3
Во втором способе мы просто указываем словарь в качестве параметра — на каждой итера- ции цикла будет возвращаться ключ, с помощью которого внутри цикла можно получить значение, соответствующее этому ключу:
>>> for key in arr: print(key, arr[key]) y 2 x 1 z 3
Обратите внимание на то, что элементы словаря выводятся в произвольном порядке, а не в порядке, в котором они были указаны при создании объекта. Чтобы вывести элементы в алфавитном порядке, следует отсортировать ключи с помощью функции sorted()
:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> for key in sorted(arr): print(key, arr[key]) x 1 y 2 z 3
С помощью цикла for можно перебирать сложные структуры данных. В качестве примера выведем элементы списка кортежей:
>>> arr = [(1, 2), (3, 4)] # Список кортежей
>>> for a, b in arr: print(a, b)
1 2 3 4 4.4. Функции range() и enumerate()
До сих пор мы только выводили элементы последовательностей. Теперь попробуем умно- жить каждый элемент списка на 2:
>>> arr = [1, 2, 3]
>>> for i in arr: i = i * 2
>>> print(arr)
[1, 2, 3]

68
Часть I. Основы языка Python
Как видно из примера, список не изменился. Переменная i
на каждой итерации цикла со- держит лишь копию значения текущего элемента списка, поэтому изменить таким способом элементы списка нельзя. Чтобы получить доступ к каждому элементу, можно, например, воспользоваться функцией range()
для генерации индексов. Функция range()
имеет сле- дующий формат: range([<Начало>, ]<Конец>[, <Шаг>])
Первый параметр задает начальное значение. Если параметр
<Начало>
не указан, то по умолчанию используется значение
0
. Во втором параметре указывается конечное значение.
Следует заметить, что это значение не входит в возвращаемые значения. Если параметр
<Шаг>
не указан, то используется значение
1
. Функция возвращает диапазон — особый объ- ект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый эле- мент списка на 2:
>>> arr = [1, 2, 3]
>>>for i in range(len(arr)): arr[i] *= 2
>>> print(arr)
[2, 4, 6]
В этом примере мы получаем количество элементов списка с помощью функции len()
и передаем результат в функцию range()
. В итоге последняя вернет диапазон значений от
0
до len(arr) — 1
. На каждой итерации цикла через переменную i
доступен текущий элемент из диапазона индексов. Чтобы получить доступ к элементу списка, указываем индекс внут- ри квадратных скобок. Умножаем каждый элемент списка на 2, а затем выводим результат с помощью функции print()
Рассмотрим несколько примеров использования функции range()
:

Выведем числа от 1 до 100: for i in range(1, 101): print(i)

Можно не только увеличивать значение, но и уменьшать его. Выведем все числа от 100 до 1: for i in range(100, 0, -1): print(i)

Можно также изменять значение не только на единицу. Выведем все четные числа от 1 до 100: for i in range(2, 101, 2): print(i)
В Python 2 функция range()
возвращала список чисел. В Python 3 поведение функции изме- нилось — теперь она возвращает диапазон. Чтобы получить список чисел, следует передать диапазон, возвращенный функцией range()
, в функцию list()
:
>>> obj = range(len([1, 2, 3]))
>>> obj range(0, 3)
>>> obj[0], obj[1], obj[2] # Доступ по индексу
(0, 1, 2)
>>> obj[0:2] # Получение среза range(0, 2)

Глава 4. Условные операторы и циклы
69
>>> i = iter(obj)
>>> next(i), next(i), next(i) # Доступ с помощью итераторов
(0, 1, 2)
>>> list(obj) # Преобразование диапазона в список
[0, 1, 2]
>>> 1 in obj, 7 in obj # Проверка вхождения значения
(True, False)
Диапазон поддерживает два полезных метода:
 index(<Значение>)
— возвращает индекс элемента, имеющего указанное значение. Если значение не входит в диапазон, возбуждается исключение
ValueError
:
>>> obj = range(1, 5)
>>> obj.index(1), obj.index(4)
(0, 3)
>>> obj.index(5)
... Фрагмент опущен ...
ValueError: 5 is not in range
 count(<Значение>)
— возвращает количество элементов с указанным значением. Если элемент не входит в диапазон, возвращается значение
0
:
>>> obj = range(1, 5)
>>> obj.count(1), obj.count(10)
(1, 0)
Функция enumerate(<Объект>[, start=0])
на каждой итерации цикла for возвращает кор- теж из индекса и значения текущего элемента. С помощью необязательного параметра start можно задать начальное значение индекса. В качестве примера умножим на 2 каждый элемент списка, который содержит четное число (листинг 4.6).
Листинг 4.6. Пример использования функции enumerate() arr = [1, 2, 3, 4, 5, 6] for i, elem in enumerate(arr): if elem % 2 == 0: arr[i] *= 2 print(arr) # Результат выполнения: [1, 4, 3, 8, 5, 12]
Функция enumerate()
не создает список, а возвращает итератор. С помощью функции next()
можно обойти всю последовательность. Когда перебор будет закончен, возбуждается исключение
StopIteration
:
>>> arr = [1, 2]
>>> obj = enumerate(arr, start=2)
>>> next(obj)
(2, 1)
>>> next(obj)
(3, 2)
>>> next(obj)

70
Часть I. Основы языка Python
Traceback (most recent call last):
File "
", line 1, in next(obj)
StopIteration
Кстати, цикл for при работе активно использует итераторы, но делает это незаметно для нас.
4.5. Цикл while
Выполнение инструкций в цикле while продолжается до тех пор, пока логическое выраже- ние истинно. Цикл while имеет следующий формат:
<Задание начального значения для переменной-счетчика> while <Условие>:
<Инструкции>
<Приращение значения в переменной-счетчике>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Последовательность работы цикла while
:
1. Переменной-счетчику присваивается начальное значение.
2. Проверяется условие, и если оно истинно, то выполняются инструкции внутри цикла, иначе выполнение цикла завершается.
3. Переменная-счетчик изменяется на величину, указанную в параметре
<Приращение>
4. Переход к пункту 2.
5. Если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Выведем все числа от 1 до 100, используя цикл while
(листинг 4.7).
Листинг 4.7. Вывод чисел от 1 до 100 i = 1 # <Начальное значение> while i < 101: # <Условие> print(i) # <Инструкции> i += 1 # <Приращение>
В
НИМАНИЕ
!
Если <Приращение> не указано, цикл будет выполняться бесконечно. Чтобы прервать бес- конечный цикл, следует нажать комбинацию клавиш +. В результате генерируется исключение KeyboardInterrupt, и выполнение программы останавливается. Следует учи- тывать, что прервать таким образом можно только цикл, который выводит данные.
Выведем все числа от 100 до 1 (листинг 4.8).

Глава 4. Условные операторы и циклы
71
Листинг 4.8. Вывод чисел от 100 до 1 i = 100 while i: print(i) i -= 1
Обратите внимание на условие — оно не содержит операторов сравнения. На каждой ите- рации цикла мы вычитаем единицу из значения переменной-счетчика. Как только значение будет равно
0
, цикл остановится, поскольку число
0
в логическом контексте эквивалентно значению
False
С помощью цикла while можно перебирать и элементы различных структур. Но в этом слу- чае следует помнить, что цикл while работает медленнее цикла for
. В качестве примера умножим каждый элемент списка на 2 (листинг 4.9).
Листинг 4.9. Перебор элементов списка arr = [1, 2, 3] i, count = 0, len(arr) while i < count: arr[i] *= 2 i += 1 print(arr) # Результат выполнения: [2, 4, 6]
4.6. Оператор continue: переход на следующую итерацию цикла
Оператор continue позволяет перейти к следующей итерации цикла до завершения выпол- нения всех инструкций внутри цикла. В качестве примера выведем все числа от 1 до 100, кроме чисел от 5 до 10 включительно (листинг 4.10).
Листинг 4.10. Оператор continue for i in range(1, 101): if 4 < i < 11: continue # Переходим на следующую итерацию цикла print(i)
4.7. Оператор break: прерывание цикла
Оператор break позволяет прервать выполнение цикла досрочно. Для примера выведем все числа от 1 до 100 еще одним способом (листинг 4.11).
Листинг 4.11. Оператор break i = 1 while True: if i > 100: break # Прерываем цикл print(i) i += 1

72
Часть I. Основы языка Python
Здесь мы в условии указали значение
True
. В этом случае выражения внутри цикла станут выполняться бесконечно. Однако использование оператора break прерывает выполнение цикла, как только он будет выполнен 100 раз.
В
НИМАНИЕ
!
Оператор break прерывает выполнение цикла, а не программы, т. е. далее будет выполне- на инструкция, следующая сразу за циклом.
Цикл while совместно с оператором break удобно использовать для получения не опреде- ленного заранее количества данных от пользователя. В качестве примера просуммируем произвольное количество чисел (листинг 4.12).
Листинг 4.12. Суммирование не определенного заранее количества чисел
# -*- coding: utf-8 -*- print("Введите слово 'stop' для получения результата") summa = 0 while True: x = input("Введите число: ") if x == "stop": break # Выход из цикла x = int(x) # Преобразуем строку в число summa += x print("Сумма чисел равна:", summa) input()
Процесс ввода трех чисел и получения суммы выглядит так (значения, введенные пользова- телем, здесь выделены полужирным шрифтом):
Введите слово 'stop' для получения результата
Введите число:
10
Введите число:
20
Введите число:
30
Введите число: stop
Сумма чисел равна: 60

ГЛ А В А
5
Числа
Язык Python 3 поддерживает следующие числовые типы:
 int
— целые числа. Размер числа ограничен лишь объемом оперативной памяти;
 float
— вещественные числа;
 complex
— комплексные числа.
Операции над числами разных типов возвращают число, имеющее более сложный тип из типов, участвующих в операции. Целые числа имеют самый простой тип, далее идут веще- ственные числа и самый сложный тип — комплексные числа. Таким образом, если в опера- ции участвуют целое число и вещественное, то целое число будет автоматически преобра- зовано в вещественное число, а затем произведена операция над вещественными числами.
Результатом этой операции будет вещественное число.
Создать объект целочисленного типа в десятичной системе счисления можно обычным спо- собом:
>>> x = 0; y = 10; z = -80
>>> x, y, z
(0, 10, -80)
Кроме того, можно записать число в двоичной, восьмеричной или шестнадцатеричной фор- ме. Такие числа будут автоматически преобразованы в десятичные целые числа.

Двоичные числа начинаются с комбинации символов
0b
(или
0B
) и содержат цифры
0
или
1
:
>>> 0b11111111, 0b101101
(255, 45)

Восьмеричные числа начинаются с нуля и следующей за ним латинской буквы o
(ре- гистр не имеет значения) и содержат цифры от
0
до
7
:
>>> 0o7, 0o12, 0o777, 0O7, 0O12, 0O777
(7, 10, 511, 7, 10, 511)

Шестнадцатеричные числа начинаются с комбинации символов
0x
(или
0X
) и могут со- держать цифры от
0
до
9
и буквы от
A
до
F
(регистр букв не имеет значения):
>>> 0X9,0xA, 0x10, 0xFFF, 0xfff
(9, 10, 16, 4095, 4095)

Вещественное число может содержать точку и (или) быть представлено в экспоненци- альной форме с буквой
E
(регистр не имеет значения):

74
Часть I. Основы языка Python
>>> 10., .14, 3.14, 11E20, 2.5e-12
(10.0, 0.14, 3.14, 1.1e+21, 2.5e-12)
При выполнении операций над вещественными числами следует учитывать ограничения точности вычислений. Например, результат следующей операции может показаться стран- ным:
>>> 0.3 - 0.1 - 0.1 - 0.1
1   ...   5   6   7   8   9   10   11   12   ...   83


написать администратору сайта