основы_программирования_на_языке_python. Министерство образования и науки российской федерации федеральное государственное бюджетное образовательное учреждение высшего
Скачать 208.8 Kb.
|
Цикл for Оператор for..in также является оператором цикла, который осуществляет итерацию по последовательности объектов, т.е. проходит через каждый элемент в последовательности. Пример: (сохраните как for.py ) for i in range(1, 5): print(i) else: print('Цикл for закончен') Вывод: $ python for.py 1 2 3 4 Цикл for закончен Как это работает: В этой программе мы выводим на экран последовательность чисел. Мы генерируем эту последовательность, используя встроенную функцию range 5. Мы задаём два числа, и range возвращает последовательность чисел от первого числа до второго. Например, range(1,5) даёт последовательность [1, 2, 3, 4] . По умолчанию range принимает значение шага, равное 1. Если мы зададим также и третье число range , оно будет служить шагом. Например, range(1,5,2) даст [1,3] . Помните, интервал простирается только до второго числа, т.е. не включает его в себя. Обратите внимание, что range() генерирует последовательность чисел, но только по одному числу за раз – когда оператор for запрашивает следующий элемент. Чтобы увидеть всю последовательность чисел сразу, используйте list(range()). Затем цикл for осуществляет итерацию по этому диапазону - for i in range(1,5) эквивалентно for i in [1, 2, 3, 4], что напоминает присваивание переменной i по одному числу (или объекту) за раз, выполняя блок команд для каждого значения i. В данном случае в блоке команд мы просто выводим значение на экран. Помните, что блок else не обязателен. Если он присутствует, он всегда выполняется один раз после окончания цикла for, если только не указан оператор break. Помните также, что цикл for..in работает для любой последовательности. В нашем случае это список чисел, сгенерированный встроенной функцией range, но в общем случае можно использовать любую последовательность любых объектов! Оператор break Оператор break служит для прерывания цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась. Важно отметить, что если циклы for или while прервать оператором break, соответствующие им блоки else выполняться не будут. Пример: (сохраните как break.py ) while True: s = input('Введите что-нибудь : ') if s == 'выход': break print('Длина строки: ', len(s)) print('Завершение') Вывод: $ python break.py Введите что-нибудь : Программировать весело. Длина строки: 23 Введите что-нибудь : Если работа скучна, Длина строки: 19 Введите что-нибудь : Чтобы придать ей весёлый тон - Длина строки: 30 Введите что-нибудь : используй Python! Длина строки: 23 Введите что-нибудь : выход Завершение Как это работает: В этой программе мы многократно считываем пользовательский ввод и выводим на экран длину каждой введённой строки. Для остановки программы мы вводим специальное условие, проверяющее, совпадает ли пользовательский ввод со строкой 'выход' . Мы останавливаем программу прерыванием цикла оператором break и достигаем её конца. Длина введённой строки может быть найдена при помощи встроенной функции len .Помните также, что оператор break может применяться и в цикле for[ CITATION Pyt16 \l 1033 ]. Оператор continue Оператор continue используется для указания Python, что необходимо пропустить все оставшиеся команды в текущем блоке цикла и продолжить со следующей итерации цикла. Пример: (сохраните как continue.py ) while True: s = input('Введите что-нибудь : ') if s == 'выход': break if len(s) < 3: print('Слишком мало') continue print('Введённая строка достаточной длины') # Разные другие действия здесь... Вывод: $ python continue.py Введите что-нибудь : a Слишком мало Введите что-нибудь : 12 Слишком мало Введите что-нибудь : абв Введённая строка достаточной длины Введите что-нибудь : выход Как это работает: В этой программе мы запрашиваем ввод со стороны пользователя, но обрабатываем введённую строку только если она имеет длину хотя бы в 3 символа. Итак, мы используем встроенную функцию len для получения длины строки, и если длина менее 3, мы пропускаем остальные действия в блоке при помощи оператора continue . В противном случае все остальные команды в цикле выполняются, производя любые манипуляции, которые нам нужны. Заметьте, что оператор continue также работает и с циклом for . Функции Функция в python - объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def. Определим простейшую функцию: def add(x, y): return x + y Инструкция return говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y. Теперь мы ее можем вызвать: >>> add(1, 10) 11 >>> add('abc', 'def') 'abcdef' Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!): >>> def newfunc(n): ... def myfunc(x): ... return x + n ... return myfunc ... >>> new = newfunc(100) # new - это функция >>> new(200) 300 Функция может и не заканчиваться инструкцией return, при этом функция вернет значение None: >>> def func(): ... pass ... >>> print(func()) None Аргументы функции Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными. >>> def func(a, b, c=2): # c - необязательный аргумент ... return a + b + c ... >>> func(1, 2) # a = 1, b = 2, c = 2 (по умолчанию) 5 >>> func(1, 2, 3) # a = 1, b = 2, c = 3 6 >>> func(a=1, b=3) # a = 1, b = 3, c = 2 6 >>> func(a=3, c=6) # a = 3, c = 6, b не определен Traceback (most recent call last): File "", line 1, in func(a=3, c=6) TypeError: func() takes at least 2 arguments (2 given) Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *: >>> def func(*args): ... return args ... >>> func(1, 2, 3, 'abc') (1, 2, 3, 'abc') >>> func() () >>> func(1) (1,) Как видно из примера, args — это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем. Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **: >>> def func(**kwargs): ... return kwargs ... >>> func(a=1, b=2, c=3) {'a': 1, 'c': 3, 'b': 2} >>> func() {} >>> func(a='python') {'a': 'python'} В переменной kwargs у нас хранится словарь. Анонимные функции Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func(): >>> func = lambda x, y: x + y >>> func(1, 2) 3 >>> func('a', 'b') 'ab' >>> (lambda x, y: x + y)(1, 2) 3 >>> (lambda x, y: x + y)('a', 'b') 'ab' lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же: >>> func = lambda *args: args >>> func(1, 2, 3, 4) (1, 2, 3, 4) Модули Модулем в Python называется любой файл с программой.Подключить модуль можно с помощью инструкции import. После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода[ CITATION Хаб16 \l 1049 ]. Импортируем модули time и random. >>> import time, random >>> time.time() 1376047104.056417 >>> random.random() 0.9874550833306869 Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as. >>> import math as m >>> m.e 2.718281828459045 Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов: from <Название модуля> import <Атрибут 1> [ as <Псевдоним 1> ], [<Атрибут 2> [ as <Псевдоним 2> ] ...] from <Название модуля> import * Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as. >>> from math import e, ceil as c >>> e 2.718281828459045 >>> c(4.6) 5 Второй формат инструкции from позволяет подключить все (точнее, почти все) переменные из модуля. Создание своего модуля на Python Создадим файл mymodule.py, в которой определим какие-нибудь функции: def hello(): print('Hello, world!') def fib(n): a = b = 1 for i in range(n — 2): a, b = b, a + b return b Теперь в этой же папке создадим другой файл, например, main.py: import mymodule mymodule.hello() print(mymodule.fib(10)) Выведет: Hello, world! 55 Структуры данных Структуры данных позволяют хранить и обрабатывать множество однотипных данных, а так же имеющие встроенные методы для добавления, поиска, изменения и удаления данных. Так как в Python используется динамическая типизация, так что типы данных определяются автоматически во время исполнения, и заранее объявлять их не нужно. Изменяемые: списки словари множества (set) Неизменяемые: строки кортежи числа фиксированные множества (frozenset) dir(s) узнать все методы help(S.replace) узнать описание метода Списки Списки (list) - изменяемый тип данных, который содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Изменяемые, как только список создан, можно добавлять, удалять или искать элементы в нём. Элементами списков могут быть объекты разных типов данных, заключенные в квадратные скобки. Пример: #создаем список shoplist = ['яблоки', 'манго', 'морковь', 'бананы'] shoplist.append('рис') # Добавить элемент эквивалент a[len(a):] = [x] shoplist.pop(2) # удалить 2 элемент из списка shoplist.sort() # отсортируем список print(shoplist[0]) # вывести 1 элемент списка del shoplist[0] # удалить элемент help(list) # хелп по спискам #Обращение по срезу дает нам новый список newlist = lst[:5] Словари Словарь (dict) – это некий аналог адресной книги. В других языках - Хеши ( hash) или Ассоциированные массивы. Задаются пары ключ:значение (разделяемые двоеточием), заключенные в фигурные скобки. Пары ключ-значение никоим образом не упорядоченны в словаре. Доступ к элементам словаря производиться по ключу, а не по индексу. Словари это изменяемые отображения. Пример: #Пары ключ-значение указываются в словаре следующим образом d = { 'key1' : 'value1', 'key2' : 'value2' } # Добавление пары ключ-значение d['Guido'] = 'guido@python.org' del ab['Spammer'] # удаление #вывести все пары for name, address in d.items(): print('Контакт {0} с адресом {1}'.format(name, address)) d.values() d.items() d.pop(1) - удалить элемент Сортировка словаря #вынуть все ключи и отсортировать # использовать sorted for i in sorted(D): print(key, "=>", D[key]) zip объединить списки ключей и значений dict(zip(['a','b','c'],[1,2,3])) →{'a':1,'b':2,'c':3} Множества Множества или Наборы (set) – это неупорядоченные коллекции уникальных и неизменяемых объектов, которые поддерживают операции мамематических множеств.Множества изменяемы. Они необходимы тогда, когда присутствие объекта в наборе важнее порядка или того, сколько раз данный объект там встречается. Т.к. каждый элемент может входить в множество всего 1 раз. Если нужно неизменяемое множество - frozenset bri = set(['Бразилия', 'Россия', 'Индия']) 'Индия' in bri # >>>True bric = bri.copy() bric.add('Китай') bric.issuperset(bri) # >>>True bri.remove('Россия') bri & bric # OR bri.intersection(bric) >>>{'Бразилия', 'Индия'} #удаление повторов из списка L = list(set(L)) Строки Упорядоченные последовательности символов, используемые для хранения и представления информации. Неизменяемые, при переприсваивании создается новый объект. Имеют порядок, можно обращаться по индексу. S = 'new line' u'unicode_line' b'byte_line' r'non_format' \n - new line \t - tab symbol .format(1, 'deep') S= ''.join(List) объединения списков в строку line.split('') разбитие строки по пробелу line.strip line.startwith('The') строка начинается с Кортежи Кортежи (tuple) служат для хранения нескольких объектов вместе. Аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Списки являются неизменяемыми. Элементы заключаются в круглые скобки, через запятую. #создаем кортеж zoo = ('питон', 'слон', 'пингвин') zoo[2]# обращаемся к 3 элементу, отсчет начинается с нуля # пустой кортеж myempty = () # кортеж из 1 элемента singleton = (2,)# запятая обязательна zoo.index(4) zoo.count(4) Инструменты функционального программирования Есть три встроенных функции, которые очень удобно использовать в сочетании со списками: filter(), map() и reduce(). Генераторы списков, словарей filter(функция,последовательность) возвращает последовательность, состоящую из тех элементов последовательности, для которых функция(элемент) является истиной. Если последовательность — строка (string) или кортеж (tuple), результат будет иметь тот же тип; в других случаях — это всегда список. Например, чтобы найти несколько простых чисел: >>> def f(x): return x % 2 != 0 and x % 3 != 0 # вернуть истину, если x не делится ни на 2 ни на 3 ... >>> filter(f, range(2, 25)) # отфильтровать диапазон чисел от 2 до 24 через функцию f [5, 7, 11, 13, 17, 19, 23] map(функция, последовательность) совершает вызов функция(элемент) с каждым элементом последовательности и возвращает список из возвращавшихся функцией значений. Например, чтобы вычислить кубы нескольких чисел: >>> def cube(x): return x*x*x # вернуть куб аргумента ... >>> map(cube, range(1, 11)) # спроецировать функцию cube на диапазон от 1 до 10 [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] Можно передать более чем одну последовательность; тогда функция должна иметь столько аргументов, сколько передано последовательностей и вызывается для каждого соответствующего элемента каждой последовательности (или None, если одна из последовательностей короче другой). Например: >>> seq = range(8) # seq - числа от 0 до 7 >>> def add(x, y): return x+y # функция add складывает свои аргументы ... >>> map(add, seq, seq) # пропустить функцию add через две последовательности seq параллельно [0, 2, 4, 6, 8, 10, 12, 14] reduce(функция, последовательность) возвращает единственное значение, собранное из результатов вызовов двух аргументной функции с первыми двумя элементами последовательности, затем с полученным результатом и последующим элементом, и так далее. Например, чтобы сосчитать сумму чисел от 1 до 10: >>> def add(x,y): return x+y # функция add складывает оба аргумента ... >>> reduce(add, range(1, 11)) # пройти функцией add последовательно аккумулятивно по числам из диапазона от 1 до 10. 55 Если в последовательности только один элемент — возвращается его значение; если последовательность пуста — порождается исключение. Можно передать третий аргумент, чтобы обозначить исходное значение. В этом случае исходное значение возвращается для пустой последовательности, функция первоначально применяется к исходному значению и первому элементу последовательности, затем к результату и следующему элементу, и так далее. Пример: >>> def sum(seq): # определить функцию sum, принимающую последовательность ... def add(x,y): return x+y # определить внутреннюю функцию add, возвращающую сумму переданных параметров ... return reduce(add, seq, 0) # вернуть результат аккумулятивного прохождения функцией add по переданной ... # последовательности seq с исходным значением 0. ... >>> sum(range(1, 11)) # сумма диапазона чисел от 1 до 10 55 >>> sum([]) # сумма пустой последовательности 0 Не используйте определение функции sum() из этого примера: поскольку суммирование чисел — обычная необходимость, уже доступна встроенная функция sum(последовательность), которая работает точно таким же образом[ CITATION Вгл16 \l 1049 ]. Решение задач Мы рассмотрели различные части языка Python, и теперь посмотрим, как все эти части работают вместе, проектируя и составляя программу, которая делает что-то полезное. Цель состоит в том, чтобы научиться писать сценарии на языке Python самостоятельно. Задачи были созданы на базе курса по подготовке к олимпиады по программированию Кириенко Д. П. Задача 1: Вычисление степени При помощи Питона определите значение выражения 3100. Какое число получилось? Напишите программу, вычисляющую это значение, запустите, выведите ответ, скопируйте его в буфер обмена и вставьте в поле для ввода ответа. РЕШЕНИЕ Для решения задачи достаточно выполнить в языке Питон программу print(3 ** 100) Задача 2: Гипотенуза Катеты прямоугольного треугольника равны 7 и 10. При помощи интерпретатора языка Питон вычислите длину гипотенузы этого треугольника. Ответ дайте с точностью до 10 знаков после запятой. РЕШЕНИЕ Сначала вычислим сумму квадратов исходных чисел, затем возведем результат в степень 1/2. Для решения задачи достаточно выполнить в языке Питон программу: print((7 ** 2 + 10 ** 2) ** (1 / 2)) Обратите внимание, что значение 1/2 нужно записать в скобках, или использовать значение 0.5, иначе сначала будет выполнено возведение в степень 1, а потом деление результата на 2, так как приоритет выше у операции возведения в степень. Задача 3: Пересадки На Новом проспекте для разгрузки было решено пустить два новых автобусных маршрута на разных участках проспекта. Известны конечные остановки каждого из автобусов. Определите количество остановок, на которых можно пересесть с одного автобуса на другой. Ваша программа должна выводить одно число – искомое количество остановок. ВХОДНЫЕ ДАННЫЕ Программа получает на вход четыре натуральных числа - номера конечных остановок первого, затем второго автобуса. Все числа - натуральные, не превосходят 109. ВЫХОДНЫЕ ДАННЫЕ Программа должна выводить одно число – искомое количество остановок. ПРИМЕРЫ
РЕШЕНИЕ Множество остановок, на которых останавливается автобус - это целочисленные точки некоторого отрезка. Ответом является количество целочисленных точек на пересечении двух отрезков, то есть длина пересечения двух отрезков плюс один. Считаем конечные остановки двух автобусов - координаты концов двух отрезков. Далее упорядочим концы каждого отрезка, чтобы первый конец имел номер не больший, чем правый конец. Найдем левую границу пересечения и правую границу пересечения двух отрезков как максимум из левых концов отрезков и минимум из правых концов отрезков. Ответом является длина пересечения плюс один, но если отрезки не пересекаются, то ответом является число 0. x1 = int(input()) x2 = int(input()) x3 = int(input()) x4 = int(input()) x1, x2 = min(x1, x2), max(x1, x2) x3, x4 = min(x3, x4), max(x3, x4) left = max(x1, x3) right = min(x2, x4) print(max(0, right - left + 1)) |