ЛР 2. Python лр часть А. Процедуры и Функции
Скачать 391.83 Kb.
|
Python ЛР 2. Часть А. Процедуры и Функции. Подпрограммы прежде всего необходимы в ситуации, когда в разных частях программы необходимо выполнять одни и те же действия несколько раз. В таком случае повторяемые операторы оформляются в виде функции или процедуры, к которой можно обращаться и вызывать ее выполнение из разных частей программы. В python существует два вида реализации подпрограмм: процедуры и функции. Рассмотрим синтаксис процедуры на примере: Пример: создать процедуру для вывода сообщения об ошибке. Запрашивать у пользователя ввести положительное число, в случае ввода отрицательного числа, вызывать процедуру для вывода сообщения об ошибке. ✍ Решение: def Err () : # определение процедуры ( "Ошибка: неверные данные" ) n = int ( input ( 'введите положительное число' ) ) if n < 0 : Err () # вызов процедуры • Процедура — вспомогательный алгоритм, выполняющий некоторые действия. • Это поименованный фрагмент программы, который можно вызвать. • Процедура должна быть определена к моменту её вызова. Определение процедуры начинается со служебного слова def. • Вызов процедуры осуществляется по ее имени, за которым следуют круглые скобки, например, Err(). • В одной программе может быть сколько угодно много вызовов одной и той же процедуры. • Использование процедур сокращает код и повышает удобочитаемость. ПРОЦЕДУРА С ПАРАМЕТРАМИ Как используются в Python параметры процедуры, рассмотрим на примере. Пример: Написать процедуру, которая печатает 60 раз указанный символ (введенный с клавиатуры), каждый с новой строки. ✍ Решение: 1 2 3 4 5 def printChar ( s ) : for i in range ( 60 ) : ( s ) sim = input ( ' введите символ' ) printChar ( sim ) • Глобальная переменная — если ей присвоено значение в основной программе (вне процедуры). • Локальная переменная (внутренняя) известна только на уровне процедуры, обратиться к ней из основной программы и из других процедур нельзя. • Параметры процедуры — локальные переменные. В программе s — локальная переменная. Задание Python 3_0: Создать процедуру, которая вычисляет разность двух вводимых пользователем числа. Выполнить задание двумя способами: 1) процедура без параметров: числа — глобальные переменные, определенные в основной программе; 2) процедура с параметрами: числа — параметры процедуры. ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ Примеры использования локальных и глобальных переменных: 1 2 3 4 x = 3 # глобальная переменная def pr () : # процедура без параметров ( x ) # вывод значения глобальной переменной pr () 1 2 3 4 5 x = 3 # глобальная переменная def pr ( a ) : # процедура с параметром a = 4 # локальная переменная ( a ) # 4 pr ( x ) # передача параметра глобальной переменной (3) Существует возможность изменить значение глобальной переменной (не создавая локальную). В процедуре с помощью слова global: 1 2 3 4 5 6 x = 3 # глобальная переменная def pr () : # процедура без параметров global x x = 1 ( x ) # вывод измененного значения глобальной переменной (1) pr ( x ) Задание Python 3_1: Напишите процедуру, которая выводит на экран в столбик все цифры переданного ей числа, начиная с последней: число: 4673 результат: 3 7 6 4 Задание Python 3_2: Напишите процедуру, которая выводит на экран все делители переданного ей числа (в одну строчку). Задание Python 3_3: Составить программу с процедурой для вычисления степени числа (входные параметры: число и степень). Задание Python 3_4: Напишите процедуру, которая принимает параметр – натуральное число N – и выводит первые N чисел Фибоначчи. Функции Часть функций языка Python являются встроенными функциями, которые обеспечены синтаксисом самого языка. Например, int, input, randint. Рассмотрим пример создания пользовательских функций. Пример: Вычислить сумму цифр числа. 1 2 3 4 5 6 7 8 def sumD ( n ) : # определение функции с параметром sum = 0 while n != 0 : sum + = n % 10 n = n // 10 return sum # возврат значения функции # основная программа ( sumD ( 1075 )) # вызов функции с параметром • Функция — это поименованный фрагмент программы, который можно вызвать. • Как и процедура, функция должна быть определена к моменту её вызова (служебное слово def). • Функция в отличии от процедуры возвращает значение. • Для возврата значения функции используется оператор return. • Вызов функции осуществляется по ее имени и обычно сопровождается выводом значения. Задание Python 3_5: Напишите функцию, которая вычисляет количество цифр числа. Задание Python 3_6: Напишите функцию, которая вычисляет факториал натурального числа N. Python ЛР 2. Часть Б. Массивы (списки) Массивы (списки) в Питоне, как и в других языках программирования, — это определенное количество элементов одного типа, которые имеют общее имя, и каждый элемент имеет свой индекс — порядковый номер. L - список целых чисел: L = [25, 755, -40, 57, -41] Однако, в языке Python отсутствует такая структура, как «массив». Для работы с массивами используются списки. Списки являются упорядоченными последовательностями, которые состоят из различных объектов (значений, данных), заключающихся в квадратные скобки [ ] и отделяющиеся друг от друга с помощью запятой. list ( 'текст' ) # ['т', 'е', 'к', 'с', 'т'] Создание списков на Python Создать список можно несколькими способами. Рассмотрим их. 1. Получение списка через присваивание конкретных значений • Так выглядит в коде Python пустой список: s = [] # Пустой список • Примеры создания списков со значениями: l = [ 25 , 755 , - 40 , 57 , - 41 ] # список целых чисел l = [ 1.13 , 5.34 , 12.63 , 4.6 , 34.0 , 12.8 ] # список из дробных чисел l = [ "Sveta" , "Sergei" , "Ivan" , "Dasha" ] # список из строк l = [ "Москва" , "Иванов" , 12 , 124 ] # смешанный список l = [[ 0 , 0 , 0 ] , [ 1 , 0 , 1 ] , [ 1 , 1 , 0 ]] # список, состоящий из списков l = [ 's' , 'p' , [ 'isok' ] , 2 ] # список из значений и списка • Списки можно складывать (конкатенировать) с помощью знака «+»: l = [ 1 , 3 ] + [ 4 , 23 ] + [ 5 ] # Результат: # l = [1, 3, 4, 23, 5] 2. Списки при помощи функции List() Получаем список при помощи функции List() l = list ( 'spisok' ) # 'spisok' - строка ( l ) #['s', 'p', 'i', 's', 'o', 'k'] - результат - список 3. Создание списка при помощи функции Split() • Используя функцию split в Питон можно получить из строки список. Рассмотрим пример: stroka = "Hello, world" # stroka - строка lst = stroka. split( "," ) # lst - список lst # ['Hello', ' world'] 4. Генераторы списков • В python создать список можно также при помощи генераторов, — это довольно-таки новый метод: o Первый простой способ. Сложение одинаковых списков заменяется умножением: # список из 10 элементов, заполненный единицами l = [ 1 ] * 10 # список l = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] o Второй способ сложнее. l = [ i for i in range ( 10 )] # список l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] или такой пример: c = [ c * 3 for c in 'list' ] ( c ) # ['lll', 'iii', 'sss', 'ttt'] Пример: Заполнить список квадратами чисел от 0 до 9, используя генератор списка. ✍ Решение: l = [ i*i for i in range ( 10 )] еще пример: l = [( i+ 1 ) +i for i in range ( 10 )] ( l ) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] o Случайные числа в списке: from random import randint l = [ randint ( 10 , 80 ) for x in range ( 10 )] # 10 чисел, сгенерированных случайным образом в диапазоне (10,80) Задание Python 4_1: Создайте список целых чисел от -20 до 30 (генерация). Задание Python 4_2: Создайте список целых чисел от -10 до 10 с шагом 2 (генерация list). Задание Python 4_3: Создайте список из 20 пятерок (генерация). Задание Python 4_4: Создайте список из сумм троек чисел от 0 до 10, используя генератор списка (0 + 1 + 2, 1 + 2 + 3, …). Ввод списка (массива) в языке Питон • Для ввода элементов списка используется цикл range: 1 2 3 for i in range ( N ) : ( "L[" , i , "]=" , sep = "" , end = "" ) L [ i ] = int ( input () ) • Более простой вариант ввода списка и его вывода: L = [ int ( input ()) for i in range ( N ) ] Функция int здесь используется для того, чтобы строка, введенная пользователем, преобразовывалась в целые числа. • Как уже рассмотрено выше, список можно выводить целым и поэлементно: # вывод целого списка (массива) ( L ) # поэлементный вывод списка (массива) for i in range ( N ) : ( L [ i ] , end = " " ) Задание Python 4_5: Заполните массив элементами арифметической прогрессии. Её первый элемент, разность и количество элементов нужно ввести с клавиатуры. * Формула для получения n-го члена прогрессии: a n = a 1 + (n-1) * d Задание Python 4_6: Заполните массив случайными числами в диапазоне 20..100 и подсчитайте отдельно число чётных и нечётных элементов. Python ЛР 2. Часть В. Строки. Немного о строках • Строки в Питоне — это упорядоченная последовательность символов. Строка может заключаться как в кавычки, так и в апострофы: S = 'Dr"s' S = "Dr's" • Строка считывается со стандартного ввода функцией input(): a = input () ( a ) ОПЕРАЦИИ СО СТРОКАМИ • Для двух строк определена операция сложения (конкатенации), также определена операция умножения строки на число: a = " па" b = " рад" ( a+b ) # парад a = " кар" ( a* 4 ) # каркаркаркар Работа, как с массивами (индексация начинается с 0): a = " парад" ( a [ 2 ]) # р • Длина строки – функция len(): a = "парад" ( len ( a )) # 5 Срезы Оператор извлечения среза из строки: [X:Y] X – это индекс начала среза, а Y – его окончания tday = 'morning, afternoon, night' tday [ 0 : 7 ] # 'morning' Рассмотрим примеры того, как используются в Python срезы: s = 'spameggs' s [ 3 : 5 ] # 'me' s [ 2 :- 2 ] # 'ameg' s [ - 4 :- 2 ] # 'eg' s [ : 6 ] # 'spameg' s [ 1 : ] # 'pameggs' s [ : ] # 'spameggs' Можно задать шаг: s = 'spameggs' s [ ::- 1 ] # 'sggemaps' s [ 3 : 5 :- 1 ] # '' s [ 2 :: 2 ] # 'aeg' Пример: Извлеките из строки символы с индексами кратными трем. ✍ Решение: Задание можно выполнить, используя цикл (сложный вариант решения): 1 2 3 4 5 6 s = 'spameggs' x = 3 l = len ( s ) // 3 for i in range ( l ) : ( s [ x:x+ 1 : 3 ]) # m g x+ = 3 Для решения можно использовать просто срез: 1 2 s = 'spameggs' ( s [ 1 :: 3 ]) Задание Python 5_1: Извлеките из строки следующие срезы: — первые восемь символов; — четыре символа из центра строки; — пять символов с конца строки. Задание Python 5_2: Дана строка длиной N. Вывести символы строки в обратном порядке. (Не использовать цикл). Задание Python 5_3: Дана строка длиной N (N — четное число). Вывести символы с четными номерами в порядке возрастания их номеров: а2, а4, а6, ... аn Условный оператор не использовать. Задание Python 5_4: Дана строка длиной N. Вывести сначала символы с четными номерами (в порядке возрастания номеров), а затем — символы с нечетными номерами (также в порядке возрастания номеров): а2, а4, а6,...а1, а3, а5... Условный оператор не использовать. Методы строк Строки, как объекты Python, обладают методами (т.е. функциями, которые выполняют сами объекты). join(str) — Соединение строк из последовательности str через разделитель, заданный строкой s = "hello" s1 = "-" join( s ) s1 # 'h-e-l-l-o' s1.count(s[, i, j]) — количество вхождений подстроки s в строку s1 Результатом является число. Можно указать позицию начала поиска i и окончания поиска j: s1 = "abrakadabra" ; s1. count( 'ab' ) # 2 s1. count( 'ab' , 1 ) # 1 s1. count( 'ab' , 1 , - 3 ) # 0 , т.к. s1[1:-3]='brakada' s1.find(s[, i, j]) — определяется позиция первого (считая слева) вхождения подстроки s в строку s1 . Результатом является число. i и j определяют начало и конец области поиска: s1 = "abrakadabra" ; s1. find( 'br' ) # 1 s1.replace(s2,s3[, n]) — создаётся новая строка, в которой фрагмент (подстрока) s2 исходной строки заменяется на фрагмент s3 . Необязательный аргумент n указывает количество замен: s1 = "breKeKeKeKs" ; ss = s1. replace( 'Ke' , 'XoXo' , 2 ) ss # breXoXoXoXoKeKs Задание Python 5_5: Преобразовать дату в «компьютерном» представлении (системную дату: 2016- 03-26 ) в «российский» формат, т. е. день/месяц/год (например, 26/03/2016). Известно, что на год выделено всегда 4 цифры, а на день и месяц – всегда 2 цифры. Примечание: • Использовать строковые функции языка. • Функциями работы с датами и временем «заведует» в Python datetime модуль, а непосредственно для работы с датами используется объект date и его методы. Подсказка: from datetime import date # Получаем текущую дату d1 = date. today() # Преобразуем результат в строку ds = str ( d1 ) Задание Python 5_6: Ввести адрес файла и «разобрать» его на части, разделенные знаком ‘/’. Каждую часть вывести в отдельной строке. Например: c:/изображения/2018/1.jpg Результат: c: изображения 2018 1.jpg Задание Python 5_7: Ввести строку, в которой записана сумма натуральных чисел, например, ‘1+25+3’. Вычислите это выражение. Использовать строковые функции языка. Задание Python 5_8: Определить, является ли введённая строка палиндромом («перевёртышем») типа ABBA, kazak и пр. Примечание: если s='1234' , то S[-1]='4', s[-2]='3'…. Для решения используйте алгоритм, изображенный на блок-схеме: Самостоятельная работа: 1 вариант: Функции: 1. Описать функцию CircleS(R) вещественного типа, находящую площадь круга радиуса R. С помощью этой функции найти площади трех кругов с заданными радиусами. Площадь круга радиуса R вычисляется по формуле S=π ∗ R 2 . В качестве значения Пи использовать 3.14. Процедуры: 2. Напишите процедуру, которая выводит цифры переданного ей четырехзначного числа, кратные трем. Списки: 3. Создайте список, соответствующий числовому ряду, построенному по следующему принципу: 1+2+3 2+3+4 3+4+5 ... 8+9+10 т.е. результат: [6, 9, 12, 15, 18, 21, 24, 27] 2 вариант: Функции: 1. Описать функцию TriangleP(a, h), находящую периметр равнобедренного треугольника по его основанию a и высоте h, проведенной к основанию. С помощью этой функции найти периметры трех треугольников, для которых даны основания и высоты (периметр = сумме длин всех сторон). Для нахождения боковой стороны b треугольника использовать теорему Пифагора: b 2 =(a/2) 2 +h 2 Процедуры: 2. Напишите процедуру, которая выводит произведение цифр переданного ей четырехзначного числа. Списки: 3. Создайте список, соответствующий числовому ряду, построенному по следующему принципу: 1*3 2*4 3*5 ... 8*10 т.е. результат: [3, 8, 15, 24, 35, 48, 63, 80] Срезы: Общее: 4. Дана строка. Вывести символы с нечетными номерами в порядке убывания их номеров (0-й символ тоже рассмотерть). Например, для строки: "Друзья!", результат: "язр" "Друзья", результат: "язр" Форматирование строк Python включает форматирование строк. Данное понятие подразумевает подстановку какого-либо шаблона в определенное место (или в определенные позиции) текста. Подстановка происходит, что называется, «на лету». Рассмотрим пример использования в коде на Python метода format: o Одна подстановка: 'Hello, {}!' format( 'Vasya' ) # 'Hello, Vasya!' Аргументом метода является текст-подстановка, который при исполнении программы подставляется на место фигурных скобок. o Несколько подстановок: '{0}{1}{0}' format( 'abra' , 'cad' ) # 'abracadabra' Подстановки нумеруются, аргументы метода format заполняют позиции для подстановок согласно их порядковым номерам, указанным в фигурных скобках. o другой вариант форматирования с множественными подстановками: 'Coordinates: {latitude}, {longitude}' format( latitude = '37.24N' , longitude = '-115.81W' ) 'Coordinates: 37.24N, -115.81W' Аргументы метода format заполняются согласно указанным именам заполнителей. У метода format есть больше возможностей, которые выходят за рамки рассмотрения темы на данном уроке. Задание Python 5_9: Допустим, есть какое-то объявление и несколько разных людей, которым нужно это объявление отправить. Для этого создается заготовка с содержанием объявления, внутри которого есть ряд изменяющихся параметров: имена людей и названия событий. Вывести один вариант итогового объявления на экран. Для задания имен и названий использовать форматирование при помощи метода format. Используйте шаблон объявления и ориентируйтесь по цветам: Красным – массивы. Коричневым – числовая переменная. Уважаемый (ая), Иван Иванович ! Приглашаем Вас на день открытых дверей . Дата события: 1 мая. С уважением, Василий. * Примечание: • Вывести пять объявлений. • Для имен создать массив ( список ), подстановку элементов в объявление осуществлять в цикле. • Даты меняются от 1 до 5. Python ЛР 2. Часть Г. Операции соединения и повторения. • Cписки — это изменяемые последовательности в отличие от строк. • Представим строку как объект в памяти, в этом случае, когда над строкой выполняются операции конкатенации и повторения, то сама строка не меняется, но в результате выполнения операции в другом месте памяти создается другая строка. В строку нельзя добавить новый символ или удалить существующий, не создав при этом новой строки. Пример: Так, например, в Питоне нельзя переприсваивать значение для отдельных символов строки. Программа выдаст ошибку! s = "aaa" ; s [ 1 ] = "b" ; ( s1 ) Изменять строку можно только, работая с ней, как с объектом (метод replace, например): s1 = "breKeKeKeKs" ; s1 = s1. replace( 'Ke' , 'XoXo' , 2 ) s1 # breXoXoXoXoKeKs Что касается списков, то при выполнении операций другие списки могут не создаваться, при этом изменяется непосредственно оригинал. Из списков можно удалять и добавлять новые элементы. • Операция конкатенации: [ 33 , - 12 , 'may' ] + [ 21 , 48.5 , 33 ] # [33, -12, 'may', 21, 48.5, 33] или так: a = [ 33 , - 12 , 'may' ] b = [ 21 , 48.5 , 33 ] ( a+b ) # [33, -12, 'may', 21, 48.5, 33] • Операция повторения: [[ 0 , 0 ] , [ 0 , 1 ] , [ 1 , 1 ]] * 2 # [[0, 0], [0, 1], [1, 1], [0, 0], [0, 1], [1, 1]] Пример: Для списков операция переприсваивания значения отдельного элемента списка разрешена!: a = [ 3 , 2 , 1 ] a [ 1 ] = 0 ; ( a ) # [3, 0, 1] Можно! Задание 6_1: Ввести строку, в которой записана сумма натуральных чисел, например, ‘1+25+3’. Вычислите это выражение. Работать со строкой, как со списком. Начало программы: s = input ( ' введите строку' ) l = list ( str ( s )) ; Другие операции над списками при помощи функций a = [ 1 , 7 , 3 , 88 , 33 ] a. sort() #[1,3,7,33,88] - сортировка a. reverse() #[88,33,7,3,1] - обратная сортировка a. index( 7 ) #2 - индекс элемента a. clear() # - очистка списка len ( a ) # - длина списка sum ( a ) # - суммирование элементов Функция join() — соединение элементов через определенный символ: lst = [ '11' , '22' , '33' ] lst = "-" join( lst ) # '11-22-33' Функция split([sep]) — возвращает список подстрок, получающихся разбиением строки a разделителем sep: str = "1-2-3-4" s1 = str split( "-" ) # ['1','2','3','4'] Задание 6_2: Дан список из 5 различных элементов. Используя функции (не использовать цикл), необходимо найти и вывести: • минимальный и максимальный элементы списка; • сумму и среднее арифметическое; • второй минимальный элемент (второй по минимальности). Начало программы: lst = [ 4 , 5 , 2 , 3 , 4 ] Добавление и удаление элементов списка • Добавление элемента: >>> a = [] >>> a. append( '444' ) >>> a [ '444' ] Пример: Поиск нечетных элементов в массиве mas и копирование их в массив B. ✍ Решение: B = [] for x in mas: if x % 2 != 0 : B. append( x ) • Удаление элемента: > a. remove( '444' ) >>> a [] • Удаление элемента по индексу: >>> del a [ 0 ] >>> a [] При копировании списков, т.е. присваивании одного списка другому, изменение первого списка влечет за собой изменение второго списка. Так как эти объекты связаны одной областью памяти (ссылка на список). mas1 = [ 1 , 2 , 3 ] mas2 = mas1 # создается ссылка на список mas1 [ 0 ] = 4 ( mas2 ) #[4, 2, 3] Чтобы создать не ссылку на список, а копию списка можно использовать либо срез либо функцию copy. 1. mas2 = mas1 [ : ] # используем срез 2. import copy mas1 = [ 1 , 2 , 3 ] mas2 = copy copy ( mas1 ) Задание 6_3: Проверить, является ли заданное слово палиндромом. Примечание: • Пример палиндрома: казак, ABBA • Использовать функции. • Поскольку при присваивании одного списка другому, изменение первого ведет к аналогичному изменению второго списка, то необходимо использовать копию ( copy ). Начало программы: import copy stroka = input ( 'введите слово' ) lst = list ( stroka ) # конвертируем строку в список Генерация случайных чисел Встроенный модуль Питона random позволяет генерировать псевдослучайные числа. Модуль random включает в себя функцию random, которая возвращает действительное число в диапазоне от 0.0 до 1.0. Каждый раз при вызове функции возвращается число из длинного ряда. Пример: import random for i in range ( 10 ) : x = random random () ( x ) # 0.5185207383774904 0.78283351055836 0.23601341583293534 ... Чтобы получить случайное число между 0.0 и верхней границей high, просто умножьте x на high. Например, от 0.0 до 15.0: import random for i in range ( 10 ) : x = random random () ( x * 15 ) # 11.075319687990554 7.152253113207329 ... Для того, чтобы получить псевдослучайное целое число: import random random randint( < начало >,< конец > ) Для того, чтобы получить псевдослучайное вещественное число: import random random uniform( < начало >,< конец > ) Еще пример: from random import randint l = [ randint ( 10 , 80 ) for x in range ( 10 )] Задание Python 6_4: Найдите в массиве все простые числа и скопируйте их в новый массив. Задание Python 6_5: Решить задачу поиска среднего значения в списке из N элементов (вводимых в виде строк). Использовать метод добавления элементов списка и суммирования элементов Цикл for при работе со списками mylist = [ 1 , 2 , 3 , 4 , 5 ] for item in mylist: item = 0 # mylist не меняется! ( mylist ) # [1, 2, 3, 4, 5] n = 5 for i in range ( n ) : mylist [ i ] = 0 # mylist меняется ( mylist ) # [0, 0, 0, 0, 0] В списке чисел проверить, все ли элементы являются уникальными, т.е. каждое число встречается только один раз ✍ Решение: Комментарии к программе: Решать данную задачу на языке Python мы будем «классическим» вариантом — брать по очереди элементы списка и сравнивать каждый элемент со стоящими за ним. При первом же совпадении элементов делается вывод, что в списке есть одинаковые элементы, и работа программы завершается. Для выхода из цикла будем использовать метод quit() import random m = 6 mass = [] k = 0 j = 0 for i in range ( m ) : mass. append( random randint( - 10 , 10 )) ( mass [ i ]) # -10 0 -8 0 -10 1 for i in mass: k = k+ 1 for j in range ( k , m ) : # j = 0 -8 0 -10 -> quit if ( i == mass [ j ]) : # -10==0 -10==-8 -10==0 -10==-10 -> quit ( 'yes' ) quit () Задание Python 6_6: Определить индексы элементов массива (списка), значения которых принадлежат заданному диапазону (т.е. не меньше заданного минимума и не больше заданного максимума) * в результате получили индексы элементов, значения которых находятся в диапазоне [5,15] Алгоритм: 1. Заполнить список (массив) случайными числами 2. Запросить для ввода минимум и максимум диапазона 3. Найти индексы элементов, значения которых входят в диапазон. Добавлять найденные индексы к новому списку 4. Вывести общее число найденных индексов (функция len()) и отдельно все индексы Задание Python 6_7: Дополнить предыдущую программу следующим: После того, как элемент с подходящим значением добавлен в новый список – удалять его из исходного списка * Использовать цикл while , функцию len() |