Стандартные типы данных

Повторение материала прошлой лекции

Немного об арифметических операциях

>>> 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)
>>>

LecturesCMC/PythonIntro2017/03_DataTypes/Conspect (последним исправлял пользователь AslanAshabokov 2017-12-29 12:56:19)