Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Арифметические операции.
После загрузки и установки python открываем IDLE (среда разработки
на языке Python, поставляемая вместе с дистрибутивом).
Запускаем IDLE (изначально запускается в интерактивном режиме),
после чего уже можно начинать писать первую программу. Традиционно,
первой программой у нас будет "hello world".
Чтобы написать "hello world" на python, достаточно всего одной
строки:
print("Hello world!")
Первая строка печатает вопрос ("Как Вас зовут? "), ожидает, пока вы не
напечатаете что-нибудь и не нажмёте Enter и сохраняет введённое значение в
переменной name.
Во второй строке мы используем функцию print для вывода текста на
экран, в данном случае для вывода "Привет, " и того, что хранится в
переменной "name".
Теперь нажмём F5 (или выберем в меню IDLE Run → Run Module) и
убедимся, что то, что мы написали, работает. Перед запуском IDLE
предложит нам сохранить файл. Сохраним туда, куда вам будет удобно,
после чего программа запустится.
Вы должны увидеть что-то наподобие этого (на скриншоте слева - файл
с написанной вами программой, справа - результат её работы):
a = 1; b = 2; print(a, b)
if (a == 1 and b == 2 and
c == 3 and d == 4): # Не забываем про двоеточие
print('spam' * 3)
if x > y: print(x)
Приоритеты операций
Приоритеты операций в Python совпадают с приоритетом операций в
математике, а именно:
Выполняются возведения в степень справа налево, то есть 3 * * 3 * *
3 это 3 * * (3 * * 3).
Выполняются унарные минусы (отрицания).
Выполняются умножения и деления слева направо. Операции
умножения и деления имеют одинаковый приоритет.
Выполняются сложения и вычитания слева направо. Операции
сложения и вычитания имеют одинаковый приоритет.
Для изменения порядка действий нужно использовать скобки.
Вещественное число в Python имеет тип float. Оно записывается как
последовательность цифр, перед которой также может стоять знак минус. В
качестве разделителя целой и дробной части используется точка.
Основные операции с вещественными числами:
A + B — сумма;
A - B — разность;
A * B — произведение;
A / B — частное, (результатом этого действия является
вещественное число, даже если A нацело делится на B);
A % B — взятие остатка от деления A на B, (подразумевается, что
неполное частное является целым числом);
A B — взятие целой части от деления A на B, (подразумевается, что
неполное частное является целым числом);
A * * B — возведение в степень.
Приоритеты операций Приоритеты операций совпадают с
приоритетами операций с целыми числами.
Строки в Python имеют тип str. Строкой называется
последовательность символов: букв, цифр, знаки препинания и т.д.
Основные операции со строками
A + B — конкатенация (строка B приписывается к строке A);
A * n — повторение n раз, значение n должно быть целого типа.
Целочисленная арифметика
Для целых чисел определены ранее рассматривавшиеся операции +, -, *
и * *. Операция деления / для целых чисел всегда возвращает значение типа
float. Также функция возведения в степень возвращает значение типа float,
если показатель степени — отрицательное число.
Но есть и специальная операция целочисленного деления, выполняющегося с
отбрасыванием дробной части, которая обозначается . Она возвращает целое
число: целую часть частного. Например:
print(17 3)
выведет 5
print(-17 3)
выведет(-6)
Другая близкая ей операция: это операция взятия остатка от деления,
обозначаемая %:
print(17 % 3)
выведет 2
print(-17 % 3)
выведет 1
Формальное определение деления с остатком такое. Если есть два
числа A и B (при этом B не равно 0), то деление A на B с остатком — это
нахождение таких целых чисел Q (частное) и R (остаток), что
A=B*Q+R
При этом если B > 0, то 0 ⇐ R < B, а если B < 0, то B < R ⇐ 0 (то есть
остаток имеет такой же знак, что и делитель).
Деление с остатком в других языках программирования для
отрицательных делимого или делителя может давать другой результат. Это
связано с особенностью реализации операции деления в процессоре.
Одно из наиболее распространенных применений операции деления с
остатком — это анализ цифр десятичной записи числа. А именно, деление
числа нацело на 10 (операция n 10) — это отбрасывание последней цифры
десятичной записи числа, а остаток от деления на 10 (n % 10) — это
последняя цифра числа.
Ввод-вывод в Python
Для считывания строки со стандартного ввода используется функция
input(), которая считывает строку с клавиатуры и возвращает значение
считанной строки, которое сразу же можно присвоить переменным:
a = input()
b = input()
Правда, функция input возвращает текстовую строку. Если нужно
сделать так, чтобы переменные имели целочисленные значения, то сразу же
после считывания выполним преобразование типов при помощи фунцкии int,
и запишем новые значения в переменные a и b:
a = int(a)
b = int(b)
Можно объединить считывание строк и преобразование типов, если
вызывать функцию int для того значения, которое вернет функция input():
a = int(input())
b = int(input())
Сложнее считать значения переменных, если они записаны в отдельной
строке. Здесь нужно применить к считанной строке метод split(), который
разделяет строку на части по одному или двум пробелам. Затем результат
выполнения этой функции присвоим кортежу из двух или нескольких чисел.
Например, если в строке вводятся два числа через пробел, то считать их
можно так:
a, b = input().split()
a = int(a)
b = int(b)
Аналогично, три переменные можно считать, записав слева от
оператора присваивания кортеж из трех переменных: a, b, c = input().split()
Можно также сразу же преобразовать считанные значения в числовой тип
(например, int), если воспользоваться функцией map, которая применяет к
каждому элементу списка заданную функцию (для преобразования к типу int
нужно, соответственно, задать функцию int для применения к каждому
элементу). Для начала можно просто запомнить эту конструкцию:
a, b, c = map(int, input().split())
Вывод данных
Для вывода данных используется функция print может выводить не
только значения переменных, но и значения любых выражений. Например,
допустима запись print(2 + 2 ** 2). Также при помощи функции print можно
выводить значение не одного, а нескольких выражений, для этого нужно
перечислить их через запятую:
a = 1 b = 2 print(a, '+', b, '=', a + b)
В данном случае будет напечатан текст 1 + 2 = 3: сначала выводится
значение переменной a, затем строка из знака “+”, затем значение
переменной b, затем строка из знака “=”, наконец, значение суммы a + b.
Обратите внимание, выводимые значение разделяются одним пробелом. Но
такое поведение можно изменить: можно разделять выводимые значения
двумя пробелами, любым другим символом, любой другой строкой,
выводить их в отдельных строках или не разделять никак. Для этого нужно
функции print передать специальный именованный параметр, называемый
sep, равный строке, используемый в качестве разделителя (sep —
аббревиатура от слова separator, т.е. разделитель). По умолчанию параметр
sep равен строке из одного пробела и между значениями выводится пробел.
Чтобы использовать в качестве разделителя, например, символ двоеточия
нужно передать параметр sep, равный строке ‘:’:
print(a, b, c, sep = ':')
Аналогично, для того, чтобы совсем убрать разделитель при выводе
нужно передать параметр sep, равный пустой строке:
print(a, '+', b, '=', a + b, sep = ' ')
Для того, чтобы значения выводились с новой строке, нужно в качестве
параметра sep передать строку, состоящую из специального символа новой
строки, которая задается так:
print(a, b, sep = '\n')
Символ обратного слэша в текстовых строках является указанием на
обозначение специального символа, в зависимости от того, какой символ
записан после него. Наиболее часто употребляется символ новой строки ‘\n’.
А для того, чтобы вставить в строку сам символ обратного слэша, нужно
повторить его два раза: ‘\\’.
Вторым полезным именованным параметром функции print является
параметр end, который указывает на то, что выводится после вывода всех
значений, перечисленных в функции print. По умолчанию параметр end равен
‘\n’, то есть следующий вывод будет происходить с новой строки. Этот
параметр также можно исправить, например, для того, чтобы убрать все
дополнительные выводимые символы можно вызывать функцию print так:
print(a, b, c, sep = , end = )
Задание
1. Даны катеты прямоугольного треугольника a и b. Найти его
гипотенузу c и периметр P.
2. Даны два круга с общим центром и радиусами R1 и R2 (R1 > R2).
Найти площади этих кругов S1 и S2, а также площадь S3 кольца, внешний
радиус которого равен R1, а внутренний радиус равен R2.
3. Известно, что X кг шоколадных конфет стоит A грн, а Y кг ирисок
стоит B грн. Определить, сколько стоит 1 кг шоколадных конфет, 1 кг
ирисок, а также во сколько раз шоколадные конфеты дороже ирисок.
4. Даны целые положительные числа A и B (A > B). На отрезке длины
A размещено максимально возможное количество отрезков длины B (без
наложений). Используя операцию деления нацело, найти количество
отрезков B, размещенных на отрезке AB.
5. Дано трехзначное число. Найти сумму и произведение его цифр.
6. Дано трехзначное число. Вывести число, полученное при прочтении
исходного числа справа налево.
7. Дано трехзначное число. В нем зачеркнули первую слева цифру и
приписали ее справа. Вывести полученное число.
8. Написать программу, позволяющую вычислить с помощью цикла:
5 6 7 (n 5) , где n задается с клавиатуры.
9. Написать программу, позволяющую вычислить с помощью цикла:
1 3 5 7 (2n 1) , где n задается с клавиатуры.
10. Написать программу, позволяющую вычислить с помощью цикла:
2 4 6 2n , где n задается с клавиатуры.
11. Написать программу, позволяющую вычислить с помощью цикла:
1 4 7 (3n 2) , где n задается с клавиатуры.
12. Написать программу, позволяющую вычислить с помощью цикла:
2 4 6 2n , где n задается с клавиатуры.
13. Написать программу, позволяющую вычислить с помощью цикла:
sin(1) sin( 2) sin(3) sin(n) , где n задается с клавиатуры.
14. Написать программу, позволяющую вычислить с помощью цикла:
n (n 1) (n 1) 2 1 , где n задается с клавиатуры.
15. Написать программу, позволяющую вычислить с помощью цикла
сумму натуральных чисел отрезка [a, b]. (a и b задаются с клавиатуры).
16. Написать программу, позволяющую вычислить с помощью цикла
сумму четных чисел отрезка [a, b]. (a и b задаются с клавиатуры).
17. Написать программу, позволяющую вычислить с помощью цикла
сумму нечетных чисел отрезка [a, b]. (a и b задаются с клавиатуры).
Практическая работа №2. Базовые операторы языка. Срезы.
Синтаксис инструкции if
Сначала записывается часть if с условным выражением, далее могут
следовать одна или более необязательных частей elif, и, наконец,
необязательная часть else. Общая форма записи условной инструкции if
выглядит следующим образом:
if test1:
state1
elif test2:
state2
else:
state3
>>> if 1:
... print('true')
... else:
... print('false')
...
true
Чуть более сложный пример (его результат будет зависеть от того, что
ввёл пользователь):
a = int(input())
if a < -5:
print('Low')
elif -5 <= a <= 5:
print('Mid')
else:
print('High')
Конструкция с несколькими elif может также служить отличной
заменой конструкции switch - case в других языках программирования.
X and Y
X or Y
not X
if X:
A=Y
else:
A=Z
A = Y if X else Z
В данной инструкции интерпретатор выполнит выражение Y, если X
истинно, в противном случае выполнится выражение Z.
Цикл while
While - один из самых универсальных циклов в Python, поэтому
довольно медленный. Выполняет тело цикла до тех пор, пока условие цикла
истинно.
>>> i = 5
>>> while i < 15:
... print(i)
... i=i+2
...
5
7
9
11
13
Цикл for
Цикл for уже чуточку сложнее, чуть менее универсальный, но
выполняется гораздо быстрее цикла while. Этот цикл проходится по любому
итерируемому объекту (например строке или списку), и во время каждого
прохода выполняет тело цикла.
Оператор break
Оператор break досрочно прерывает цикл.
>>> a = [1, 3, 8, 7]
>>> a[0]
1
>>> a[3]
7
>>> a[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> a = [1, 3, 8, 7]
>>> a[-1]
7
>>> a[-4]
1
>>> a[-5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Срезы
В Python, кроме индексов, существуют ещё и срезы.
item[START:STOP:STEP] - берёт срез от номера START, до STOP (не
включая его), с шагом STEP. По умолчанию START = 0, STOP = длине
объекта, STEP = 1. Соответственно, какие-нибудь (а возможно, и все)
параметры могут быть опущены.
>>> a = [1, 3, 8, 7]
>>> a[:]
[1, 3, 8, 7]
>>> a[1:]
[3, 8, 7]
>>> a[:3]
[1, 3, 8]
>>> a[::2]
[1, 8]
>>> a = [1, 3, 8, 7]
>>> a[::-1]
[7, 8, 3, 1]
>>> a[:-2]
[1, 3]
>>> a[-2::-1]
[8, 3, 1]
>>> a[1:4:-1]
[]
>>> a = [1, 3, 8, 7]
>>> a[1:3] = [0, 0, 0]
>>> a
[1, 0, 0, 0, 7]
>>> del a[:-3]
>>> a
[0, 0, 7]
S = 'spam"s'
S = "spam's"
\a Звонок
\b Забой
\f Перевод страницы
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
S = r'C:\newt.txt'
S = r'\n\n\\'[:-1]
S = r'\n\n' + '\\'
S = '\\n\\n'
Базовые операции
Конкатенация (сложение)
>>>
>>> S1 = 'spam'
>>> S2 = 'eggs'
>>> print(S1 + S2)
'spameggs'
Дублирование строки
>>>
>>> print('spam' * 3)
spamspamspam
>>> len('spam')
4
Доступ по индексу
>>>
>>> S = 'spam'
>>> S[0]
's'
>>> S[2]
'a'
>>> S[-2]
'a'
>>> s = 'spameggs'
>>> s[3:5]
'me'
>>> s[2:-2]
'ameg'
>>> s[:6]
'spameg'
>>> s[1:]
'pameggs'
>>> s[:]
'spameggs'
>>> s[::-1]
'sggemaps'
>>> s[3:5:-1]
''
>>> s[2::2]
'aeg'
>>> s = 'spam'
>>> s[1] = 'b'
Traceback (most recent call last):
File "", line 1, in
s[1] = 'b'
TypeError: 'str' object does not support item assignment
>>> s = s[0] + 'b' + s[2:]
>>> s
'sbam'
S = b"byte" Строка байтов
S1 * 3 Повторение строки
S.replace(шаблон,
Замена шаблона
замена)
S.format(*args,
Форматирование строки
**kwargs)
>>> list('список')
['с', 'п', 'и', 'с', 'о', 'к']
list.sort([key=функци
Сортирует список на основе функции
я])
>>> l = [1, 2, 3, 5, 7]
>>> l.sort()
>>> l
[1, 2, 3, 5, 7]
>>> l = l.sort()
>>> print(l)
None
unsigned long
'Q' int 8
long
>>> a = (1, 2, 3, 4, 5, 6)
>>> b = [1, 2, 3, 4, 5, 6]
>>> a.__sizeof__()
36
>>> b.__sizeof__()
44
>>> d = {(1, 1, 1) : 1}
>>> d
{(1, 1, 1): 1}
>>> d = {[1, 1, 1] : 1}
Traceback (most recent call last):
File "", line 1, in
d = {[1, 1, 1] : 1}
TypeError: unhashable type: 'list'
>>> a = ('s')
>>> a
's'
>>> a = ('s', )
>>> a
('s',)
>>> a = 's',
>>> a
('s',)
Операции с кортежами
Все операции над списками, не изменяющие список (сложение,
умножение на число, методы index() и count() и некоторые другие операции).
Можно также по-разному менять элементы местами и так далее.
Например, гордость программистов на python - поменять местами
значения двух переменных:
a, b = b, a
>>> a = set()
>>> a
set()
>>> a = set('hello')
>>> a
{'h', 'o', 'l', 'e'}
>>> a = {'a', 'b', 'c', 'd'}
>>> a
{'b', 'c', 'a', 'd'}
>>> a = {i ** 2 for i in range(10)} # генератор множеств
>>> a
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> a = {} # А так нельзя!
>>> type(a)
<class 'dict'>
>>> a = set('qwerty')
>>> b = frozenset('qwerty')
>>> a == b
True
>>> True
True
>>> type(a - b)
<class 'set'>
>>> type(a | b)
<class 'set'>
>>> a.add(1)
>>> b.add(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
random.seed
random.seed(<Параметр>) — настраивает генератор случайных чисел
на новую последовательность. По умолчанию используется системное время.
random.seed(20)
random.random()
0.9056396761745207
random.random()
0.6862541570267026
random.seed(20)
random.random()
0.9056396761745207
random.uniform
random.uniform(<Начало>, <Конец>) — возвращает псевдослучайное
вещественное число в диапазоне от <Начало> до <Конец>:
random.uniform(0, 20)
15.330185127252884
random.uniform(0, 20)
18.092324756265473
random.randint
random.randint(<Начало>, <Конец>) — возвращает псевдослучайное
целое число в диапазоне от <Начало> до <Конец>:
random.randint(1,27)
9
random.randint(1,27)
22
Задание.
Задание 1. Дана строка, заканчивающаяся точкой.
a. Вывести длину строки.
b. Подсчитать, сколько слов в строке.
c. Найти длину самого короткого слова и самого длинного слова.
d. Преобразовать ее, удалив каждый символ * и повторив каждый
символ, отличный от *.
Задание 2. Варианты заданий на перемещение элементов списка.
Элементы списка вводить с помощью random.
1. Скорректировать список A=(a1, а2, ..., аn), переписав в начало списка
группу, содержащую наибольшее число подряд идущих положительных
элементов.
2. В списке A=(a1, а2, ..., аn) все элементы, равные нулю, поставить
сразу после максимального элемента данного списка.
3. В списке A=(a1, а2, ..., аn) все отрицательные элементы отправить в
«хвост» списка.
4. В списке A=(a1, а2, ..., аn) все положительные элементы, стоящие
перед минимальным положительным элементом, переслать в «хвост» списка.
5. В списке A=(a1, а2, ..., аn) все положительные элементы, начиная со
второго положительного, отправить в хвост списка.
6. В одномерном списке A=(a1, а2, ..., аn) группу элементов,
содержащую наибольшее число подряд идущих отрицательных элементов,
переписать в «хвост» списка.
7. В одномерном списке A=(a1, а2, ..., аn) все отрицательные элементы,
имеющие нечетный порядковый номер, отправить в «хвост» списка, т. е.
поместить на место последних элементов.
8. В одномерном списке A=(a1, а2, ..., аn) все положительные элементы,
имеющие четный порядковый номер, переписать в начало списка.
9. В одномерном списке A=(a1, а2, ..., аn) отрицательные элементы,
имеющие четный порядковый номер, переписать в начало списка.
10.В одномерном списке A=(a1, а2, ..., аn) группу, содержащую
наибольшее число подряд идущих положительных элементов, переписать в
хвост списка.
Задание 3. Варианты заданий на удаление элементов списка.
1. В списке A=(a1, а2, ..., аn) удалить последнюю группу
положительных элементов. Группой называется подряд идущие элементы
одного знака, число которых больше или равно 2.
2. В списке A=(a1, а2, ..., аn) удалить все подряд идущие отрицательные
элементы, идущие вслед за минимальным элементом списка.
3. В списке A=(a1, а2, ..., аn) удалить все отрицательные элементы,
стоящие перед минимальным элементом списка.
4. В списке A=(a1, а2, ..., аn) удалить все элементы, меньшие, чем
элемент списка, расположенный слева от максимального.
5. В списке A=(a1, а2, ..., аn) удалить все элементы, стоящие между
минимальным положительным и максимальным отрицательным элементами.
6. В списке A=(a1, а2, ..., аn) удалить все положительные элементы,
имеющие четный порядковый номер, идущие после минимального элемента
списка.
7. В одномерном списке A=(a1, а2, ..., аn) удалить все отрицательные
элементы, расположенные между положительными.
8. В одномерном списке A=(a1, а2, ..., аn) удалить все равные элементы,
оставив только один из данных групп равных.
9. В одномерном списке A=(a1, а2, ..., аn) удалить все цепочки
отрицательных элементов, расположенные между положительными.
10.В списке A=(a1, а2, ..., аn) удалить все элементы, стоящие между
минимальным положительным и максимальным отрицательным элементами.
Задание 4.
Решето Эратосфена — алгоритм нахождения всех простых чисел до
некоторого целого числа n, который приписывают древнегреческому
математику Эратосфену Киренскому. Как и во многих случаях, здесь
название алгоритма говорит о принципе его работы, то есть решето
подразумевает фильтрацию, в данном случае фильтрацию всех чисел за
исключением простых. По мере прохождения списка нужные числа
остаются, а ненужные (они называются составными) исключаются.
Для нахождения всех простых чисел не больше заданного числа n,
следуя методу Эратосфена, нужно выполнить следующие шаги:
1. Выписать подряд все целые числа от двух до n (2, 3, 4, …, n).
2. Пусть переменная p изначально равна двум — первому простому
числу.
3. Зачеркнуть в списке числа от 2p до n считая шагами по p (это будут
числа кратные p: 2p, 3p, 4p, …).
4. Найти первое незачёркнутое число в списке, большее чем p, и
присвоить значению переменной p это число.
5. Повторять шаги 3 и 4, пока возможно.
Теперь все незачёркнутые числа в списке — это все простые числа от 2
до n.
Требуется:
а) вычислить все числа от 1 до n, кратные 7;
б) вычислить все простые числа от 1 до n;
в) определить простые числа от 1 до n, кратные 7.
Для выполнения задания следует использовать списки и множества.
Практическая работа №4. Рекурсивные функции и работа с файлами.
Функции
Именные функции, инструкция def
Функция в 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 у нас хранится словарь, с которым мы, опять-
таки, можем делать все, что нам заблагорассудится.
f = open('text.txt', 'r')
У функции open много параметров, они указаны в статье "Встроенные
функции", нам пока важны 3 аргумента: первый, это имя файла. Путь к файлу может
быть относительным или абсолютным. Второй аргумент, это режим, в котором мы будем
открывать файл.
Режим Обозначение
Чтение из файла
Открыли мы файл, а теперь мы хотим прочитать из него информацию.
Для этого есть несколько способов, но большого интереса заслуживают лишь
два из них.
Первый - метод read, читающий весь файл целиком, если был вызван
без аргументов, и n символов, если был вызван с аргументом (целым числом
n).
>>>
>>> f = open('text.txt')
>>> f.read(1)
'H'
>>> f.read()
'ello world!\nThe end.\n\n'
>>> f = open('text.txt')
>>> for line in f:
... line
...
'Hello world!\n'
'\n'
'The end.\n'
'\n'
Запись в файл
Теперь рассмотрим запись в файл. Попробуем записать в файл вот
такой вот список:
>>>
Для тех, кто не понял, что это за цифры, поясню: метод write
возвращает число записанных символов.
После окончания работы с файлом его обязательно нужно закрыть с
помощью метода close:
>>>
>>> f.close()
1
Код child.py:
import sys
word = sys.stdin.readline().rstrip()
filename = sys.stdin.readline().rstrip()
try:
with open(filename, "rb") as fh:
while True:
current = fh.readline()
if not current:
0 break
if (word in current ):
1 print("find: {0} {1}".format(filename,word))
except :
2 pass
3
4
5
2. Как работают потоки в питоне
Если нужно, чтобы ваше приложение выполняло несколько задач в
одно и то же время, то можете воспользоваться потоками (threads). Потоки
позволяют приложениям выполнять в одно и то же время множество задач.
Многопоточность (multi-threading) важна во множестве приложений, от
примитивных серверов до современных сложных и ресурсоёмких игр.
Когда в одной программе работают несколько потоков, возникает
проблема разграничения доступа потоков к общим данным. Предположим,
что есть два потока, имеющих доступ к общему списку. Первый поток может
делать итерацию по этому списку:
for x in L
а второй в этот момент начнет удалять значения из этого списка. Тут
может произойти все что угодно: программа может упасть, или мы просто
получим неверные данные.
Решением в этом случае является применение блокировки. При этом
доступ к заблокированному списку будет иметь только один поток, второй
будет ждать, пока блокировка не будет снята.
Применение блокировки порождает другую проблему – дедлок
(deadlock) – мертвая блокировка. Пример дедлока: имеется два потока и два
списка. Первый поток блокирует первый список, второй поток блокирует
второй список. Первый поток изнутри первой блокировки пытается получить
доступ к уже заблокированному второму списку, второй поток пытается
проделать то же самое с первым списком. Получается неопределенная
ситуация с бесконечным ожиданием. Эту ситуации легко описать, на
практике все гораздо сложнее.
Вариантом решения проблемы дедлоков является политика
определения очередности блокировок. Например, в предыдущем примере мы
должны определить, что блокировка первого списка идет всегда первой, а
уже потом идет блокировка второго списка.
Другая проблема с блокировками – в том, что несколько потоков могут
одновременно ждать доступа к уже заблокированному ресурсу и при этом
ничего не делать. Каждая питоновская программа всегда имеет главный
управляющий поток.
Питоновская реализация многопоточности ограниченная.
Интерпретатор питона использует внутренний глобальный блокировщик
(GIL), который позволяет выполняться только одному потоку. Это сводит на
нет преимущества многоядерной архитектуры процессоров. Для
многопоточных приложений, которые работают в основном на дисковые
операции чтения/записи, это не имеет особого значения, а для приложений,
которые делят процессорное время между потоками, это является серьезным
ограничением.
3. Создание потока
Для создания потоков мы будем использовать стандартный модуль
threading. Есть два варианта создания потоков:
вызов функции
threading.Thread()
вызов класса
threading.Thread
Следующий пример показывает, как к потоку приаттачить функцию
через вызов функции:
import threading
import time
def clock(interval):
while True:
print("The time is %s" % time.ctime())
time.sleep(interval)
t = threading.Thread(target=clock, args=(15,))
t.daemon = True
t.start()
Пример на создание потока через вызов класса: в конструкторе
обязательно нужно вызвать конструктор базового класса. Для запуска потока
нужно выполнить метод start() объекта-потока, что приведет к выполнению
действий в методе run():
import threading
import time
class ClockThread(threading.Thread):
def __init__(self,interval):
threading.Thread.__init__(self)
self.daemon = True
self.interval = interval
def run(self):
0 while True:
print("The time is %s" % time.ctime())
1 time.sleep(self.interval)
t = ClockThread(15)
2 t.start()
3
Для управления потоками существуют методы:
start() – дает потоку жизнь.
run() –этот метод представляет действия, которые должны быть
выполнены в потоке.
join([timeout]) – поток, который вызывает этот метод,
приостанавливается, ожидая завершения потока, чей метод вызван.
Параметр timeout (число с плавающей точкой) позволяет указать время
ожидания (в секундах), по истечении которого приостановленный поток
продолжает свою работу независимо от завершения потока, чей
метод join был вызван. Вызывать join()некоторого потока можно много раз.
Поток не может вызвать метод join() самого себя. Также нельзя ожидать
завершения еще не запущенного потока.
getName() – возвращает имя потока.
setName(name) – присваивает потоку имя name.
isAlive() – возвращает истину, если поток работает (метод run() уже
вызван).
isDaemon() – возвращает истину, если поток имеет признак демона.
setDaemon(daemonic) – устанавливает признак daemonic того, что поток
является демоном.
activeCount() – возвращает количество активных в настоящий момент
экземпляров класса Thread. Фактически это len(threading.enumerate()).
currentThread() – возвращает текущий объект-поток, т.е.
соответствующий потоку управления, который вызвал эту функцию.
enumerate() – возвращает список активных потоков.
Задание
Главный поток программы должен генерировать строки случайного
содержания и помещать их в конец списка. Дочерний поток №1 должен
выдавать текущее состояние списка на экран. Дочерний поток №2
пробуждается каждые пять секунд и сортирует список в лексикографическом
порядке и сохраняет в файл.
Упражнение 1
Создайте класс Cat. Определите атрибуты name (имя), color (цвет) и
weight (вес). Добавьте метод под названием meow («мяуканье»). Создайте
объект класса Cat, установите атрибуты, вызовите метод meow.
В предыдущем примере между созданием объекта myDog класса Dog и
присвоению ему имени (myDog.name="Spot") прошло некоторое время.
Может случиться так, что программист забудет указать имя и тогда собака
будет безымянная - такого допустить мы не можем! Избежать подобной
ошибки позволяет специальный метод (конструктор), который вызывается
сразу в момент создания объекта заданного класса.
Сначала рассмотрим работу конструктора в общем виде:
class Dog:
name = ""
#Конструктор вызывается в момент создания объекта этого типа;
#специальный метод Python, поэтому два нижних подчеркивания
def __init__(self):
print("Родилась новая собака!")
#создаем собаку (объект myDog класса Dog)
myDog = Dog()
Запустим программу:
>>>
========== RESTART: C:/Python35-32/dog1.py ==========
Родилась новая собака!
>>>
Рассмотрим пример присвоения имени собаки через вызов
конструктора класса:
class Dog ():
name = ""
#Конструктор
#Вызывается на момент создания объекта этого типа
init (self, newName):
self.name = newName
>>>
Упражнение 2
1. Напишите код, описывающий класс Animal:
• добавьте атрибут имени животного;
• добавьте метод eat, выводящий «Ням-ням»;
• добавьте методы getName и setName;
• добавьте метод makeNoise, выводящий «Имя животного говорит
Гррр»;
• добавьте конструктор классу Animal, выводящий «Родилось
животное имя животного».
2. Основная программа:
• создайте животное, в момент создания определите его имя;
• узнайте имя животного через вызов метода getName;
• измените имя животного через вызов метода setName;
• вызовите eat и makeNoise для животного.
Упражнение 3
Создайте класс StringVar для работы со строковым типом данных,
содержащий методы set и get. Метод set служит для изменения содержимого
строки, get - для получения содержимого строки. Создайте объект типа
StringVar и протестируйте его методы.
Упражнение 4
Создайте класс точка Point, позволяющий работать с координатами (x,
y). Добавьте необходимые методы класса.
Упражнение 5
1. Напишите код, описывающий класс Animal:
Добавьте атрибут имени животного.
Добавьте метод eat, выводящий «Ням-ням».
Добавьте методы getName и setName.
Добавьте метод makeNoise, выводящий «Имя животного говорит
Гррр».
Добавьте конструктор класса Animal, выводящий «Родилось
животное».
2. Пусть Animal будет родительским для класса Cat. Метод makeNoise
класса Cat выводит «Имя животного говорит Мяу». Конструктор класса Cat
выводит «Родился кот», а также вызывает родительский конструктор.
3. Пусть Animal будет родительским для класса Dog. Метод makeNoise
для Dog выводит «Имя животного говорит Гав». Конструктор Dog выводит
«Родилась собака», а также вызывает родительский конструктор.
4. Основная программа. Код, создающий кота, двух собак и одно
простое животное. Дайте имя каждому животному (через вызов методов).
Код, вызывающий eat и makeNoise для каждого животного.
Практическая работа №7 – Работа с pyQT
Особенности модулей:
- Модуль QtCore содержит ядро с неграфической функциональностью.
Этот модуль используется для работы с временем, файлами, папками,
различными типами файлов, потоками, адресами URL, MIME-типами и
процессами.
- QtGui содержит классы для интеграции систем окон, обработки
событий, 2D-графики, базовой обработки изображений, шрифтов и текста.
- Модуль QtWidgets содержит классы, которые обеспечивают набор UI-
элементов для создания классических пользовательских интерфейсов.
- QtMultimedia содержит классы для управления мультимедиа-
содержимым, а также API для доступа к камере или функциональности
радио.
- Модуль QtBluetooth содержит классы для поиска устройств,
соединения и взаимодействия с ними.
- Модуль QtNetwork содержит классы для сетевого программирования.
Эти классы облегчают работу с клиентами и серверами TCP/IP и UDP, делая
сетевое программирование более легким и адаптивным.
- QtPositioning содержит классы для определения местоположения с
использованием всевозможных источников, таких как спутники, Wi-Fi или
текстовые файлы.
- Модуль Enginio реализует клиентскую библиотеку для организации
доступа к облачным сервисам Qt – Manaded Application Runtime.
- Модуль QtWebSockets содержит классы, которые реализуют протокол
WebSocket.
- QtWebKit содержит классы для реализации веб-браузера, основанного
на библиотеке WebKit2.
- Модуль QtWebKitWidgets содержит классы для WebKit1, основанные
на реализации веб-браузера, для использования в приложениях,
базирующихся на QtWidgets.
- QtXml содержит классы для работы с XML файлами. Этот модуль
предоставляет реализацию сразу для двух API: SAX и DOM.
- Модуль QtSvg содержит классы для отображения содержимого SVG-
файлов. Scalable Vector Graphics (SVG) – это язык для описания двумерной
графики и графических приложений в XML.
- Модуль QtSql предоставляет классы для работы с базами данных.
- QtTest содержит функции, которые дают возможность модульного
тестирования PyQt-приложений.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple')
w.show()
sys.exit(app.exec_())
Приведенный выше код показывает небольшое окно на экране.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
Здесь мы делаем необходимые импорты. Основные виджеты
расположены в PyQt5.QtWidgets.
app = QApplication(sys.argv)
Каждое приложение PyQt5 должно создать объект приложения
(экземпляр QApplication). Параметр sys.argv это список аргументов
командной строки. Скрипты Python можно запускать из командной строки.
Это способ, которым мы можем контролировать запуск наших сценариев.
w = QWidget()
Виджет QWidget это базовый класс для всех объектов интерфейса
пользователя в PyQt5. Мы предоставляем конструктор по умолчанию для
QWidget. Конструктор по умолчанию не имеет родителя. Виджет без
родителей называется окно.
w.resize(250, 150)
Метод resize() изменяет размеры виджета. Он стал 250 пикселей в
ширину и 150 в высоту.
w.move(300, 300)
Метод move() двигает виджет на экране на координату x=300, y=300.
w.setWindowTitle('Simple')
Здесь мы задаём заголовок нашего окна.
w.show()
Метод show() отображает виджет на экране. Виджет сначала создаётся
в памяти, и только потом (с помощью метода show) показывается на экране.
sys.exit(app.exec_())
Наконец, мы попадаем в основной цикл приложения. Обработка
событий начинается с этой точки. Основной цикл получает события от
оконной системы и распределяет их по виджетам приложения. Основной
цикл заканчивается, если мы вызываем метод exit() или главный виджет
уничтожен. Метод sys.exit() гарантирует чистый выход. Вы будете
проинформированы, как завершилось приложение.
Метод exec_ () имеет подчеркивание. Это происходит потому, что exec
является ключевым словом в python 2.
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Statusbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Строку состояния создают с помощью виджета QMainWindow.
self.statusBar().showMessage('Ready')
Чтобы получить строку состояния, мы вызываем метод statusBar()
класса QtGui.QMainWindow. Первый вызов метода создаёт строку состояния.
Последующие вызовы возвращают объект строки состояния. showMessage()
отображает сообщение в строке состояния.
Меню программы
Строка меню – это распространенная часть приложений с графическим
интерфейсом (GUI).
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp,
QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
В примере выше, мы создаём строку меню с одним набором команд.
Этот набор команд будет содержать одно действие, завершающее
приложение при его выборе. Строка состояния тоже создаётся. Действие
доступно с горячей клавишей Ctrl+Q.
exitAction = QAction(QIcon('exit.png'), '&Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
QAction – это абстракция для действий, выполняемых из меню,
панелью инструментов или с использованием горячей клавишей. В
приведённых выше трёх строках, мы создаём действие с определённой
иконкой и меткой «Exit». Кроме того, для этого действия определена горячая
клавиша. Третья строка создаёт подсказку, которая показывается в строке
состояния, когда мы наводим курсор мыши на пункт меню.
exitAction.triggered.connect(qApp.quit)
Когда мы выбираем конкретное действие, срабатывает инициирующий
сигнал. Сигнал присоединяют к методу quit() виджета QApplication. Это
завершает приложение.
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
Метод menuBar() создаёт строку меню. Мы создаём меню «File» и
добавляем в него действие выхода из приложения.
Панель инструментов
Все команды из меню, которые мы можем использовать в приложении.
Панели инструментов предоставляют быстрый доступ к большинству часто
используемых команд.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp,
QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
В вышеприведённом примере, мы создаём простую панель
инструментов. Она имеет один инструмент, действие выхода, которое
завершает приложение, будучи инициированным.
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)
В аналогичном примере как с созданием меню выше, мы создаём
объект действия. Объект имеет метку, иконку и горячую клавишу. Метод
quit() из QtGui.QMainWindow присоединяется к инициирующему сигналу.
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
Здесь мы создаём панель инструментов и подключаем объект действия
к ней.
Панель инструментов
Совместное размещение
В примере ниже мы создадим меню, панель инструментов и строку
состояния. Мы также создадим центральный виджет.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction,
QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(self.close)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAction)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Этот пример кода создаёт каркас классического графического
приложения состоящей из меню, панелью инструментов и строкой
состояния.
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
Здесь мы создаём виджет редактирования текста. Мы устанавливаем
его так, чтобы он был центральным виджетом QMainWindow. Центральный
виджет займёт всё оставшееся пространство.
Рисунок: Главное окно
События
Все приложения с графическим интерфейсом являются событийно-
ориентированными. События вызываются главным образом пользователем
приложения. Однако, они могут быть вызваны другими средствами, к
примеру подключением к Интернету, диспетчером окон или таймером. Когда
мы вызываем метод exec_(), приложение входит в главный цикл. Главный
цикл получает события и отправляет их объектам.
В событийной модели имеются три участника:
Источник события;
Объект события;
Цель события.
Источник события – это объект, состояние которого меняется. Он
вызывает события. Объект события (событие) внедряет состояние, которое
меняется в источнике события. Цель события – это объект, которому
требуется уведомление. Объект источника события поручает задачу
обработки события цели события.
Чтобы начать работу с событиями, PyQt5 имеет уникальный механизм
сигналов и слотов. Сигналы и слоты используют для связи между объектами.
Сигнал срабатывает, когда происходит конкретное событие. Слот может
быть чем-то, вызываемым средствами Python. Слот вызывается, когда
срабатывает его сигнал.
Сигналы и слоты
Это простой пример, демонстрирующий сигналы и слоты в PyQt5.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
sld.valueChanged.connect(lcd.display)
Сигнал и слот
Переопределённый обработчик события
События в PyQt5 часто обрабатываются путём переопределённых
обработчиков события.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Event handler')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
В нашем примере, мы переопределяем обработчик
события keyPressEvent().
def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape:
self.close()
Если мы кликаем кнопку Esc, приложение завершается.
Отправитель события
Иногда удобно знать, какой виджет является отправителем сигнала.
Для этого, PyQt5 имеет метод sender().
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn1 = QPushButton("Button 1", self)
btn1.move(30, 50)
btn2 = QPushButton("Button 2", self)
btn2.move(150, 50)
btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)
self.statusBar()
def buttonClicked(self):
sender = self.sender()
self.statusBar().showMessage(sender.text() + ' was pressed')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Мы имеем две кнопки в нашем примере. В методе buttonClicked() мы
определяем, какую кнопку мы нажали, с помощью метода sender().
btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)
Обе кнопки подключены к одному слоту.
def buttonClicked(self):
sender = self.sender()
self.statusBar().showMessage(sender.text() + ' was pressed')
Мы определяем источник сигнала путём вызова метода sender(). В
строке состояния приложения, мы показываем метку нажатой кнопки.
Отправитель события
Срабатывание сигналов
Объекты, создаваемые из QObject, могут имитировать сигналы. В
следующем примере, мы увидим, как мы может имитировать
пользовательский сигнал.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication
class Communicate(QObject):
closeApp = pyqtSignal()
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.c = Communicate()
self.c.closeApp.connect(self.close)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Мы создаём новый сигнал, именуемый closeApp. Этот сигнал
испускается во время события нажатия кнопки мыши. Сигнал
присоединяется к слоту close() класса QMainWindow.
class Communicate(QObject):
closeApp = pyqtSignal()
Сигнал создаётся с pyqtSignal() как атрибут класса внешнего класса
Communicate.
self.c = Communicate()
self.c.closeApp.connect(self.close)
Пользовательский сигнал closeApp присоединяется к слоту close()
класса QMainWindow.
def mousePressEvent(self, event):
self.c.closeApp.emit()
Когда мы кликаем на окне курсором мыши, срабатывает сигнал
closeApp. Приложение завершается.
Задание к работе
Graphics
https://www.youtube.com/watch?v=aPu6eK97Ios
https://www.youtube.com/watch?v=c8pQChjQ1tY
https://www.youtube.com/watch?v=Airdzeoorsg
https://www.youtube.com/watch?v=Z6jgBcRiYK4
Gauss
http://mathprofi.ru/metod_gaussa_dlya_chainikov.html
https://math.semestr.ru/gauss/gauss.php
http://kontromat.ru/?page_id=4495
Варианты:
Решить систему уравнений методом Гаусса или обратной матрицы: