Стандартные типы данных
Повторение материала прошлой лекции
Немного об арифметических операциях
>>> 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) >>>