Стандартные типы данных
Повторение материала прошлой лекции
Немного об арифметических операциях
>>> 123%5 3 >>> 123.3%5 3.299999999999999997 >>> 123.3%5.1 0.9000000000000000057 >>> a = 45 >>> a += 45 >>> a 90 >>> a /=45 >>> a 2.0 >>> a=a+45 >>> a+=45 >>> 2/3 0.66666666666666666 >>>
+= Присвоение операции сложения
>>> 2/3 0.666666666666666 >>> 2//3 0 >>> 11/3 3.666666666666665 >>> 11//3 3 >>> 4**8 65536 >>> 3<5<23 True >>> (3<5) and (5<23) True >>> 123 and "ASDF" 'ASDF' >>> [] and "ASDF" [] >>> "" and "ASDF" '' >>> 0.0 and "ASDF" 0.0 >>> 0.0 or "ASDF" 'ASDF' >>> 12312 or "ASDF" 12312 >>>
Математическая операция
>>3<5<23
означает, что мы выполняем такую операцию
>>(3<5) and (5<23)
Объект пустого типа – это объект любого типа.
>>> a=0
>>> a!=0 and 1/a
False
>>> 1/a
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
1/a
ZeroDivisionError: division by zero
>>>Оператор While
While выполняет тело цикла до тех пор, пока условие цикла истинно. Реализуем алгоритм поиска первого
a = eval(input())
while a:
if type(a) is str:
print("Строка есть")
break
a = eval(input())
print("Строки нет")Оператор break досрочно прерывает цикл. Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while).
Для оперативного и эффективного решения задачи, используйте это в Д.З.
Рассмотрим еще несколько примеров работы с eval.
s="1,2,3" type(s) <class 'str'> >>> eval(s) (1,2,3) >>> t=eval(s) >>> type(t) <class 'tuple'> >>> a,b,c=eval(s) >>> a 1 >>> b 2 >>> c 3 >>> x,y = eval(input()) 1,234,"QWE" >>> x 1.234 >>> y 'QWE' >>> x,y = eval(input()) 100*100, "QWE"+"ZZZ" >>> x 10000 >>> y 'QWEZZZ' >>> eval(input()) x*a 10000 >>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '_package__', '__spec__', 'a', 'b', 'c', 's', 't', 'x', 'y'] >>> del x >>>
Вернемся к программе поиска первого.
a = eval(input())
while a:
if type(a) is str:
print("Строка есть")
break
a = eval(input())
else:
print("Строки нет")Запускаем программу.
1 2 3 4 5 "QWE" Строка есть >>>
Замечание: связывание не является арифметическим выражением.
1
3.4545
100500+23
a=3
Traceback (most recent call last):
File "E:/6.py", line 6, in <module>
a = eval(input())
File "<string>", line 1
a=3
^
SyntaxError: invalid syntax
>>>Поговорим о модулях
Python позволяет поместить классы, функции или данные в отдельный файл и использовать их в других программах. Такой файл называется модулем. Объекты из модуля могут быть импортированы в другие модули. В то же время модуль — это не только физический файл. Модуль представляет собой коллекцию компонентов. В этом смысле модуль — это пространство имен, namespace, и все имена внутри модуля еще называются атрибутами — такими, например, как функции и переменные.
Вопрос: Можем ли мы организовать пространство имен?
Ответ: Да. Существует два способа.
>>> import ooo
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'ooo']
>>> type(ooo)
<class 'module'>
>>> dir(ooo)
['VAR', '__bultins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fun']
>>> ooo.VAR
1
>>> ooo.fun
<function fun at 0x034E26F0>
>>> ooo.fun("QWE", "sdf")
'QWEsdf'
>>>VAR = 1 def fun(a,b): return a+b
Существует около 200 модулей. Посмотрим на примере работу двух модулей для вычисления с произвольной точностью.
Модуль Decimal
>>> import decimal
>>> dir(decimal)
['BasicContext', 'Clamped', 'Context', 'ConversionSyntax', 'Decimal', 'DecimalException', 'DecimalTuple', 'DefaultContext', 'DivisionByZero', 'DivisionImpossible', 'DivisionUndefined', 'ExtendedContext', 'FloatOperation', 'HAVE_THREADS', 'Inexact', 'InvalidContext', 'InvalidOperation', 'MAX_EMAX', 'MAX_PREC', 'MIN_EMIN', 'MIN_ETINY', 'Overflow', 'ROUND_05UP', 'ROUND_CEILING', 'ROUND_DOWN', 'ROUND_FLOOR', 'ROUND_HALF_DOWN', 'ROUND_HALF_EVEN', 'ROUND_HALF_UP', 'ROUND_UP', 'Rounded', 'Subnormal', 'Underflow', '__builtins__', '__cached__', '__doc__', '__file__', '__libmpdec_version__', '__loader__', '__name__', '__package__', '__spec__', '__version__', 'getcontext', 'localcontext', 'setcontext']
>>> a = decimal.Decimal("1.1")
>>> b = decimal.Decimal("2.2")
>>> a+b
Decimal('3.3')
>>> float(a)
1.1
>>> b**8
Decimal('548.75873536')
>>> a = decimal.Decimal(1.1)
>>> a
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Модуль fractions
>>> import fractions
>>> fractions.Fraction(1.25)
Fraction(5, 4)
>>> a = fractions.Fraction(1.25)
>>> a*82
Fraction(205, 2)
>>> a*82
Fraction(205, 2)
>>> a**2
Fraction(25, 16)
>>> fractions.Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> fractions.Fraction('1.1')
Fraction(11, 10)
>>>Типы данных
Типы данных мы рассмотрели на прошлой лекции.
>>> type <class 'type'> >>> type(456) <class 'int'> >>> type(type) <class 'type'> >>> type(None) <class 'NoneType'> >>> type(print) class 'builtin_function_or_method'> >>> a=1.2 >>> type(a) <class 'float'> >>> int(a) 1 >>> b = int(a) >>> type(b) <class 'int'> >>>
Функция type возвращает не строку, а конструктор.
>>> ty
<class 'int'>
>>> ty = type(9)
>>> ty
<class 'int'>
>>> ty("123")
123
>>> ty(1.2345)
1
>>> int(1.2345)
1
>>> ty is int
True
>>> None
>>> NotImplemented
NotImplemented
>>> type(NotImplemented)
<class 'NotImplementedType'>
>>>Кортежи
Кортежи (tuple) используется для представления неизменяемой последовательности разнородных объектов. Они обычно записываются в круглых скобках, но если неоднозначности не возникает, то скобки можно опустить.
>>> lst = (1,2,3,4) >>>lst (1, 2, 3, 4) >>> lst = 1,2,3,4 >>> type(lst) <class 'tuple'> >>>
Иногда кортеж – это константный список.
>>> lst1 = 1, (1,"QQ",777), "ASDASD", None >>> len(lst1) 4 >>> lst[0] 1 >>> lst[1] 2 >>> lst[2] 3 >>> lst[-1] 4 >>> lst[-2] 3 >>> lst1[-2] 'ASDASD' >>>
Кортежи работают с операторами + и * так же, как и строки или списки – они используются для конкатенации и повторения, за исключением того – что в результате получится новый кортеж, а не список или строка.
>>> a = (7,6,5,4)
>>> b = ("WER",0)
>>> a+b
(7, 6, 5, 4, 'WER', 0)
>>>Кортежи являются неизменяемыми последовательностями в Python, т.е. вы не может просто изменить элемент, присвоив ему новое значение. Однако – можно взять часть имеющегося кортежа и создать новый.
>>> a = (7,6,5,4)
>>> a+= ("Q","QQ")
>>> a
(7, 6, 5, 4, 'Q', 'QQ')
>>>Из кортежей можно выбирать подпоследовательности.
Замечание: первый индекс включается, второй не включается.
>>> a = 7,6,5,4,'Q','QQ','Q','QQ'
>>> a
(7, 6, 5, 4, 'Q', 'QQ', 'Q', 'QQ')
>>> a[7:3]
()
>>> a[3:100500]
(4, 'Q', 'QQ', 'Q', 'QQ')
>>> a[3:]
(4, 'Q', 'QQ', 'Q', 'QQ')
>>> a[7:3:-1]
('Q', 'QQ', 'Q', 'QQ')
>>> a[-1:0:1]
()
>>> a = 1,4,6,7,89,909,100500
>>> a[7:3:-1]
(100500, 909, 89)
>>> a[-1:0:1]
()
>>> a[-1:0:-1]
(100500, 909, 89, 7, 6, 4)
>>> a[-1:0]
()
>>> a[-1:0]
()
>>>Кортежи имеют 2 метода: index() и count(). Index() используется для нахождения первого вхождения в кортеже. Соответственно count() используется для подсчета количества вхождений в кортеж.
>>> a = 1,4,6,7,89,909,100500
>>> a.index(89)
4
>>> a
(1, 4, 6, 7, 89, 909, 100500)
>>> a.index(80)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
a.index(80)
ValueError: tuple.index(x): x not in tuple
>>> 80 in a
False
>>> 89 in a
True
>>>Модуль numpy
>>>a = numpy
>>>a = numpy.array([1,2,3]),
. . .[4,5,6],
. . .[7,8,9]
. . .[8,7,6],])
>>>a
array([[1,2,3],
[4,5,6],
[7,8,9],
[8,7,6]])
>>>a.transpose()
array([[1,4,7,8],
[2,5,8,7],
[3,6,9,6]])Свойства
>>> s = 1,345,6,"w3",56,456
>>> s
(1, 345, 6, 'w3', 56, 456)
>>> it = iter(s)
>>> it
<tuple_iterator object at 0x02C4EA50>
>>> next(it)
1
>>> next(it)
345
>>> next(it)
6
>>> next(it)
'w3'
>>> next(it)
56
>>> next(it)
456
>>> next(it)
Traceback (most recent call last:
File "<pyshell#10>", line 1, in <module>
next(it)
StopIteration
>>>Цикл for
Этот цикл проходится по любому итерируемому объекту (например, строке или списку), и во время каждого прохода выполняет тело цикла.
>>> for c in 1,2,"WQW",None,(1,2,3):
print(c)
1
2
WQW
None
(1, 2, 3)
>>>Для повторения цикла некоторое заданное число раз n можно использовать цикл for вместе с функцией range:
>>>for i in range(n):
Тело циклаrange - универсальная функция Python для создания списков (list), содержащих арифметическую прогрессию.
range-object не хранится, он вычисляется.
>>> for i in "ASDFASDF":
print(i)
A
S
D
F
A
S
D
F
>>>>>> for i in (1,2,3,4,5):
print(i)
1
2
3
4
5
>>> a = range(10,3)
>>> a
range(10, 3)
>>> range(10, 15)
range(10, 15)
>>> tuple(range(10,15))
(10, 11, 12, 13, 14)
>>>Еще один вид последовательностей:
>>> a = 1,345,7,34,56,34,56
>>> for i in range(len(a)):
print(a[i])
1
345
7
34
56
34
56
>>>enumerate() возвращает генератор, отдающий пары счётчик-элемент для элементов указанной последовательности.
>>> a = 1,345,7,34,56,34,56
>>> for a in enumerate(a):
print(e)
(0, 1)
(1, 345)
(2, 7)
(3, 34)
(4, 56)
(5, 34)
(6, 56)
>>>