Over six years ago, in December 1989, I was looking for a "hobby" programming project that would keep me occupied during the week around Christmas. My office ... would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately...
HOW TO RETURN words document:
PUT {} IN collection
FOR line IN document:
FOR word IN split line:
IF word not.in collection:
INSERT word IN collection
RETURN collection
- создать простой, понятный, удобный и полезный язык
- пример функции:
def magic(dir):
acc = []
for root, dirs, files in os.walk(dir):
acc.extend(os.path.join(root, file) for file in files)
return acc
- что делает эта функция?
import os
def magic(dir):
acc = []
for root, dirs, files in os.walk(dir):
acc.extend(os.path.join(root, file) for file in files)
return acc
magic('.')
['.\\custom.css',
'.\\README.ipynb',
'.\\README.md',
'.\\README.slides.html',
'.\\.ipynb_checkpoints\\README-checkpoint.ipynb',
'.\\pics\\1.png',
'.\\pics\\presentation.png']
-
Python 2.x находится в режиме поддержки, обновлений выходить не будет
- достоинства
- штабильно
- громадное количество библиотек
print "hello world"
- недостатки
- содержит много костылей, исправить которые, не нарушив работу системы нельзя
- строки и символы изначально кодируются в байткод
- ЛЕГАСИ
- достоинства
-
Python 3.x - в режиме активной разработки
- достоинства
- все строки ялвяются Unicode объектами
- упрощены некоторые конструкции методов
- бОльшая часть элементов языка стала объектами (например,
map
по версии 2.x -list
, по версии 3.x -map object
)
- недостатки
- не все библиотеки портированы с 2.x
- достоинства
В наших проектах будем использовать Python 3.x (3.4 - 3.6 котируются), для упрощения процедуры поддержки кода
- открыть консоль
python
(для пользователей Ubuntu -python3
)
- открыть консоль
cd <пусть\к\папке\с\файлом>
python my_program.py
- для пользователей Ubuntu/Debian:
python3 my_program.py
- для пользователей Ubuntu/Debian:
my_variable = input() # ввод данных с клавиатуры (или через стандартный ввод stdin)
print(my_variable) # вывод данных в стандартный вывод stdout
42
42
Присвоение значений переменным может производиться в одну строчку через запятую (как в учебниках по матану, с последующим "соответственно")
coords, speed, velocity = input(), input(), 'no'
print(coords, speed, velocity)
34
45
34 45 no
Хитрые способы присваивания позволяют творить и вот такие финты
- числовые
- целые числа
int
- 5 - вещественные числа (с плавающей точкой)
float
- 5.0 - логические
bool
- True/False
- целые числа
- строковые
- строки
str
- строки
int(x)
- преобразование к целому числу
int(2.3)
2
float(x)
- преобразование к числу с плавающей точкой
float(5)
5.0
вычислить выражение
9**19 - int(float(9**19))
- базовые операторы
print(42 + 24) # сложение
print(45 - 100) # вычитание
print(3 * 98) # умножение
66
-55
294
- оператор деления
print(7 / 3) # дробный результат деления
print(7 // 3) # целочисленный результат деления (аналог div в pascal)
print(7 % 3) # остаток от деления (аналог mod в pascal)
2.3333333333333335
2
1
- возведение в степень
print(2 ** 8)
256
Допустим, нам нужно проанализировать математическую модель, описывающую движение тела, подброшенного вертикально вверх:
написать алгоритм, принимающий значение
# решение
v0 = 5
g = 9.81
t = float(input())
y = v0 * t - (1/2) * g * t**2
print(y)
1
0.09499999999999975
Строки могут быть:
- однострочными:
not_very_long_string = 'wow, such little code here'
print(not_very_long_string)
wow, such little code here
- однострочными с переносами при помощи символа
\n
:
not_very_long_string = 'wow, \nsuch little \ncode here'
print(not_very_long_string)
wow,
such little
code here
- или просто многострочными:
very_long_string = """wow,
such little
code here"""
print(very_long_string)
wow,
such little
code here
Для версии 3.x существует 6 разных способов вывода строки, содержащую значения переменных. Рассмотрим основные:
"spam = {0}, eggs = {1}".format("blah", 2)
'spam = blah, eggs = 2'
# python >3.6 only
man_age = 42
woman_age = 31
print(f'man = {man_age}, woman = {woman_age}')
man = 42, woman = 31
"spam = %s, eggs = %d" % ("blah", 2)
'spam = blah, eggs = 2'
флаг | описание |
---|---|
%s | строка |
%d | целое число |
%f | десятичное представление с шестью знаками после запятой |
%e | "научное" представление |
%g | компактное представление десятичного числа |
%% | вывод знака процента |
- конкатенация:
'lorem' + 'ipsum'
'loremipsum'
- умножение:
'lorem ipsum ' * 3
'lorem ipsum lorem ipsum lorem ipsum '
- сравнение по значению (аналог
.equals()
в Java)
'lorem ipsum' == 'lorem ipsum'
True
'lorem ipsum' == 'hello world'
False
C = 40
print(C == 40) # C равно 40
print(C != 40) # C не равно 40
print(C >= 40) # C больше или равно 40
print(C > 40) # C больше 40
print(C < 40) # C меньше 40
True
False
True
False
False
x = 0; y = 1.2
x >= 0 and y < 1
False
x >= 0 or y < 1
True
x > 0 or not y > 1
False
not (x > 0 or y > 0)
False
x = 14
if x % 2 == 0:
print('Четное')
else:
print('Нечетное')
Четное
if statement_1:
expression_1
elif statement_2:
expression_2
else:
expression_3
"четное" if x % 2 == 0 else "нечетное"
'четное'
Требуется определить, является ли данный год високосным.
Напомним, что високосными годами считаются те годы, порядковый номер которых либо кратен 4, но при этом не кратен 100, либо кратен 400 (например, 2000-й год являлся високосным, а 2100-й будет невисокосным годом).
Программа должна корректно работать на числах
Выведите "Високосный" в случае, если считанный год является високосным и "Обычный" в обратном случае (не забывайте проверять регистр выводимых программой символов).
year = int(input())
if ((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0):
print('Високосный')
else:
print('Обычный')
2100
Обычный
Простейший пример:
def foo():
return 42
foo()
42
если не используется return
, функция по умолчанию возвращает None
:
def foo():
42
print(foo())
None
def min(x, y):
return x if x < y else y
min(-5, 12)
-5
min(x=12, y=-5)
-5
Напишите функцию f(x), которая возвращает значение следующей функции, определённой на всей числовой прямой:
Ввод | Вывод |
---|---|
4.5 | 7.25 |
-4.5 | -5.25 |
1 | -0.5 |
def f(x):
if x <= -2:
return(1-(x+2)**2)
if x > -2 and x <= 2:
return(-(x/2))
if x > 2:
return(((x-2)**2)+1)
f(1)
-0.5
Изменяемые наборы данных
list_ = [ ]
list_ = list()
x = ['zebra', 49, -879, 'aardvark', 200]
len(x)
5
x[0]
'zebra'
x[-1]
200
range(START, STOP, STEP)
print(list(range(10)))
print(list(range(1, 10)))
print(list(range(1, 10, 2)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 3, 5, 7, 9]
Для того, чтобы развернуть последовательность в обратную сторону, используется функция reversed()
list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Общий вид
list[START:STOP:STEP]
x[:]
['zebra', 49, -879, 'aardvark', 200]
x[:-1]
['zebra', 49, -879, 'aardvark']
x[1:-1]
[49, -879, 'aardvark']
x[::2]
['zebra', -879, 200]
lst.append(item) # добавить элемент в конец
lst.extend(seq) # добавить последовательность в конец
lst.insert(idx,val) # вставить значение по индексу
lst.remove(val) # удалить первое вхождение val
lst.pop(idx) # удалить значение по индексу и вернуть его
lst.sort() lst.reverse() # сортировать/обратить список по месту
x.append('datass')
x
['zebra', 49, -879, 'aardvark', 200, 'datass']
x.insert(1, 'face')
x
['zebra', 'face', 49, -879, 'aardvark', 200, 'datass']
last_val = x.pop(0)
print(x, last_val)
['face', 49, -879, 'aardvark', 200, 'datass'] zebra
a = [123, 4, 0, 44, 14, 2, 8]
a.sort()
a
[0, 2, 4, 8, 14, 44, 123]
Проверка на принадлежность списку
'face' in x
True
'MADI' in x
False
Сколько элементов будет содержать список students после следующих операций?
students = ['Ivan', 'Masha', 'Sasha']
students += ['Olga']
students += 'Olga'
Иммутабельны, т.е. неизменяемы.
tuple_ = ()
tuple_ = tuple()
tuple_ = ('Denmark', 'Finland', 'Norway', 'Sweden')
print("Длина кортежа - {0}".format(len(tuple_)))
Длина кортежа - 4
print(tuple_[0])
Denmark
print(tuple_[-1])
Sweden
Попытка изменить кортеж приведет к закономерному провалу, т.к. кортеж неизменяем
tuple_.append('something')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-22-f5f46c8f6eef> in <module>()
----> 1 tuple_.append('something')
AttributeError: 'tuple' object has no attribute 'append'
my_dict = {}
my_dict = dict()
my_dict = {'key':'value'}
MAI = {1:'авиастроение', 'инжэкин':5, 9:'прикладная механика'}
MAI.keys()
dict_keys([1, 'инжэкин', 9])
MAI.values()
dict_values(['авиастроение', 5, 'прикладная механика'])
MAI[1], MAI['инжэкин']
('авиастроение', 5)
MAI_2 = {8: 'прикладная математика',
4: 'радиоэлектроника летательных аппаратов'}
MAI.update(MAI_2)
MAI
{8: 'прикладная математика',
1: 'авиастроение',
4: 'радиоэлектроника летательных аппаратов',
'инжэкин': 5,
9: 'прикладная механика'}
- Выполнить таски из лекции (кто не сделал)
- Решить 11 задачек из модуля String-1 на CodingBat
- Отчитаться о выполнении в #random'e
- Правила оформления Python кода на русском, с которыми необходимо ознакомитья и следовать 95% написанного.
- списки, кортежи, словари
- циклы
- файлы
- модули
- немного функциональщины