ээдд. Прохоренок_Н_А__Дронов_В_А_Python_3_и_PyQt_5_Разработка_приложен. Николай Прохоренок Владимир Дронов
Скачать 7.92 Mb.
|
Для примера напишем программу, которая проверяет, является введенное пользователем число четным или нет (листинг 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 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 # <Приращение> В НИМАНИЕ ! Если <Приращение> не указано, цикл будет выполняться бесконечно. Чтобы прервать бес- конечный цикл, следует нажать комбинацию клавиш Выведем все числа от 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 |