1. Типы данных¶
Примечание
Статья в разработке…
1.1. Переменные в Python:¶
Переменная в языке программирования это название для зарезервированного места в памяти компьютера, предназначенное для хранения значений. Это означает, что когда вы создаете переменную, вы на самом деле резервируете определенное место в памяти компьютера. Основываясь на типе данных переменной, интерпретатор выделяет необходимое количество памяти и решает, что может находится в зарезервированной области памяти. Для понимания, можете думать о переменной как о коробке, в которую можно положить любую вещь, но только определенного размера. Размер в данном примере будет типом переменной. Это не совсем верное определение, но оно дает общее представление о картине в целом.
Присвоение значения переменной:
В Python вам не нужно объявлять тип переменной вручную (как, например в С++). Объявление происходит автоматически (это называется динамическая типизация), когда вы присваиваете значение переменной. Знак равенства ( = ) используется для присвоения значения переменной. Операнд по левую сторону от знака равно ( = ) это имя переменной, операнд по правую сторону - значение присвоенное этой переменной.
Таблица - Обзор встроенных типов объектов
Имя |
Тип |
Описание и пример |
---|---|---|
Целые Числа |
int |
|
Числа с плавающей точкой |
float |
Дробные числа 3.14, 2.5, -2.33333, 0.12334 |
Строки |
str |
Строки «asdf», «Hello world», «123456» |
Списки |
list |
|
Словарь |
dict |
Последовательность пар элементов содержаших ключ-значение (key-value)
|
Кортеж (Tuple) |
tup |
Неизменяемая упорядоченная последовательность элементов («hostname», 1234, -0.45, -32) |
Множество |
set |
|
Булевые значения |
bool |
|
1.2. Числа¶
Числа - Это не изменяемый тип данных. Числа в Python бывают трёх типов: целые, с плавающей точкой и комплексные. * Примером целого числа может служить 2. * Примерами чисел с плавающей точкой (или «плавающих» для краткости) могут быть 3.23 и 52.3E-4. Обозначение E показывает степени числа 10. В данном случае 52.3E-4 означает 52.3 · 10−4. * Примерыкомплексныхчисел:(-5+4j)и(2.3-4.6j)
Примечание
Нет отдельного типа ‘long int’ (длинное целое). Целые числа по умолчанию могут быть произвольной длины.
1.3. Строки¶
Строки - это неизменяемая упорядоченная последовательность символов, заключенная в кавычки. Строки применяются для записи текстовой информации (кажем, вашего имени) и произвольных совокупностей байтов (наподобие содержимого файла изображения). Они являются первым примером того, что в Python называется последовательностью — позиционно упорядоченной коллекцией других объектов. Для содержащихся элементов последовательности поддерживают порядок слева направо: элементы сохраняются и извлекаются по своим относительным позициям. Строго говоря, строки представляют собой последовательности односимвольных строк.
Строки можно суммировать. Тогда они объединяются в одну строку, такая операция называется «Конкатенацией строк»:
firts_string = "asdfgh"
second_string = "oiuytr"
print(firts_string + second_string)
Примечание
В Python 3 нет ASCII-строк, потому что Unicode является надмножеством (включает в себя) ASCII. Если необходимо получить строку строго в кодировке ASCII, используйте str.encode(«ascii»). По умолчанию все строки в Unicode.
Предупреждение
Нельзя производить арифметтические операции над строкам и числами Например: «qwerty» + 3 Это вызовет ошибку, Но строки можно перемножать «#» * 10 выведет на экран строку ##########
1.3.1. Логические и физические строки¶
Физическая строка – это то, что вы видите, когда набираете программу. Логическая стро- ка – это то, что Python видит как единое предложение. Python неявно предполагает, что каждой физической строке соответствует логическая строка. Примером логической строки может служить предложение print(„Привет, Мир!“) – ес- ли оно на одной строке (как вы видите это в редакторе), то эта строка также соответствует физической строке. Python неявно стимулирует использование по одному предложению на строку, что об- легчает чтение кода. Чтобы записать более одной логической строки на одной физической строке, вам придёт- ся явно указать это при помощи точки с запятой (;), которая отмечает конец логической строки/предложения. Например:
i=5
print(i)
#то же самое, что
i = 5; print(i);
#и то же самое может быть записано в виде
i = 5; print(i);
Однако я настоятельно рекомендую вам придерживаться написания одной логической строки в каждой физической строке. Таким образом вы можете обойтись совсем без точки с запятой. Кстати, я никогда не использовал и даже не встречал точки с запятой в программах на Python. Можно использовать более одной физической строки для логической строки, но к этому следует прибегать лишь в случае очень длинных строк. Пример написания одной логиче- ской строки, занимающей несколько физических строк, приведён ниже. Это называется явным объединением строк.
s = 'Это строка. \
Это строка продолжается.'
print(s) #Это строка. Это строка продолжается.
1.3.2. Операции над последовательностями¶
Как последовательности, строки поддерживают операции, которые предполагают наличие позиционного порядка среди элементов. Например, если мы имеем четырех символьную строку, записанную в кавычках (обычно одинарных), то можем проверить ее длину с помощью встроенной функции len() и извлечь ее компоненты посредством выражений индексации.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
simple_string = 'Spam'
len(simple_string)
# 4
simple_string[0]
# 'S'
simple_string[1]
# 'p'
Нумерация всех символов в строке идет с нуля. Но, если нужно обратиться к какому-то по счету символу, начиная с конца, то можно указывать отрицательные значения (на этот раз с единицы).
simple_string = "StringBody"
simple_string[1]
# t
simple_string[-1]
# y
Кроме обращения к конкретному символу, можно делать срезы строк, указав диапазон номеров (срез выполняется по второе число, не включая его):
example_string = "Lorem Ipsum is simply dummy text of the printing and typesetting"
example_string[0:9]
# 'Lorem Ips'
example_string[10:22]
# 'm is simply '
# Если не указывается второе число, то срез будет до конца строки:
example_string[-3:]
# 'ing'
Также в срезе можно указывать шаг:
# Так можно получить нечетные числа
a = '0123456789'
a[1::2]
# '13579'
# А таким образом можно получить все четные числа строки a:
a[::2]
# '02468'
# Срезы также можно использовать для получения строки в обратном порядке:
a[::-1]
# '9876543210'
1.3.3. Методы для работы со строками¶
Методы upper, lower, swapcase, capitalize
Методы upper(), lower(), swapcase(), capitalize() выполняют преобразование регистра строки:
string1 = 'FastEthernet'
string1.upper()
#'FASTETHERNET'
string1.lower()
#'fastethernet'
string1.swapcase()
#'fASTeTHERNET'
string2 = 'tunnel 0'
string2.capitalize()
#'Tunnel 0'
#Очень важно обращать внимание на то, что часто методы возвращают преобразованную строку. И, значит, надо не забыть присвоить ее какой-то переменной (можно той же).
string1 = string1.upper()
print(string1)
#FASTETHERNET
Метод count
Метод count() используется для подсчета того, сколько раз символ или подстрока встречаются в строке:
string1 = 'Hello, hello, hello, hello'
string1.count('hello') # 3
string1.count('ello') # 4
string1.count('l') # 8
Метод find
Методу find() можно передать подстроку или символ, и он покажет, на какой позиции находится первый символ подстроки (для первого совпадения):
string1 = 'interface FastEthernet0/1'
string1.find('Fast') # 10
string1[string1.find('Fast')::] # 'FastEthernet0/1'
Методы startswith, endswith
Проверка на то, начинается или заканчивается ли строка на определенные символы (методы startswith(), endswith()):
string1 = 'FastEthernet0/1'
string1.startswith('Fast') # True
string1.startswith('fast') # False
string1.endswith('0/1') # True
string1.endswith('0/2') # False
Метод replace
Замена последовательности символов в строке на другую последовательность (метод replace()):
string1 = 'FastEthernet0/1'
string1.replace('Fast', 'Gigabit') # 'GigabitEthernet0/1'
Метод strip
Часто при обработке файла файл открывается построчно. Но в конце каждой строки, как правило, есть какие-то спецсимволы (а могут быть и в начале). Например, перевод строки.
Для того, чтобы избавиться от них, очень удобно использовать метод strip():
string1 = '\n\tinterface FastEthernet0/1\n'
print(string1)
#
#interface FastEthernet0/1
#
string1.strip()
#'interface FastEthernet0/1'
Примечание
По умолчанию метод strip() убирает пробельные символы. В этот набор символов входят: tnrfv
Методу strip можно передать как аргумент любые символы. Тогда в начале и в конце строки будут удалены все символы, которые были указаны в строке:
Метод strip() убирает спецсимволы и в начале, и в конце строки. Если необходимо убрать символы только слева или только справа, можно использовать, соответственно, методы lstrip() и rstrip().
Метод split
Метод split() разбивает строку на части, используя как разделитель какой-то символ (или символы) и возвращает список строк:
string1 = 'switchport trunk allowed vlan 10,20,30,100-200'
commands = string1.split()
print(commands) # ['switchport', 'trunk', 'allowed', 'vlan', '10,20,30,100-200']
#По умолчанию в качестве разделителя используются пробельные символы (пробелы, табы, перевод строки), но в скобках можно указать любой разделитель:
vlans = commands[-1].split(',')
print(vlans) #['10', '20', '30', '100-200']
Метод join
Метод join() позволяет объеденить список, кортеж или словарь в строку разделяя ее елементы другой строкой.
myTuple = ("John", "Peter", "Vicky")
x = "-".join(myTuple)
print(x) #John-Peter-Vicky
Метод format
Метод format() позволяет подставлять в отмеченные в строке области символами «{}» значени из списка аргументов
например:
price = 49
txt = "The price is {} dollars"
print(txt.format(price))
Так же можно указать тип подставлемых значений:
#Строковые занчения
'{} {}'.format('one', 'two') #one two
#Числовые значения
'{} {}'.format(1, 2) #1 2
#порядок значений можно указывать
'{1} {0}'.format('one', 'two') #two one
#Можно так же подставлять значения классов
class Data(object):
def __str__(self):
return 'str'
def __repr__(self):
return 'repr'
'{0!s} {0!r}'.format(Data()) #str repr
#Отступы и выравнивания
#по правому краю
'{:>10}'.format('test') # test
#по левому краю
'{:_<10}'.format('test') #test______
#по центру
'{:^10}'.format('test') # test
#срезы
'{:.5}'.format('xylophone') #xylop
#срезы и отступы
'{:10.5}'.format('xylophone') #xylop
#числа
'{:d}'.format(42) #42
'{:f}'.format(3.141592653589793) #3.141593
#числа и отступы
'{:4d}'.format(42) # 42
'{:06.2f}'.format(3.141592653589793) #003.14
'{:04d}'.format(42) # 0042
#знаковые числа
'{:+d}'.format(42) #+42
'{: d}'.format((- 23)) #-23
'{: d}'.format(42) # 42
'{:=5d}'.format((- 23)) #- 23
'{:=+5d}'.format(23) #+ 23
#можно вставлять значения по именам
data = {'first': 'Hodor', 'last': 'Hodor!'}
'{first} {last}'.format(**data) #Hodor Hodor!
'{first} {last}'.format(first='Hodor', last='Hodor!') #Hodor Hodor!
#Формат даты и времени
from datetime import datetime
'{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5)) #2001-02-03 04:05
другие примеры форматированого вывода можно ныйти по следующим ссылкам pyformat.info w3schools.com
1.3.4. Пример программы¶
Подсчет слов
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Программа подсчета слов в файле
import os #подуль для взаимодействия с операционной системой, например просмотр файлов
def get_words(filename):
'''функци принимает в качестве аргумента путь до файла'''
with open(filename, encoding="utf8") as file: #эта строка открывает файл
text = file.read() #читаем содержимое файла и записываем все в переменную text
text = text.replace("\n", " ") #преобразуем наш текст в одну длинную строку заменив символ перевода строки на пробел
text = text.replace(",", "").replace(".", "").replace("?", "").replace("!", "") #а так же уберем все запетые, пробелы, и прочие знаки пунктуации
text = text.lower() #перведем все слова в строчные, тоесть если было "Начало изучения Языка Программирования", то будет "начало изучения языка программирования"
words = text.split() #создадим список слов ("списки","выгледят","вот","так")
words.sort() #метод sort отсортирует все слова по алфовиту
return words #эта строка вернет нам массив строк
def get_words_dict(words):
''''эта функция содасть словарь где ключь, это слово, а значение, то сколько раз оно встречается в тексте'''
words_dict = dict() #создаем простой словарь
for word in words: #цикл который перебирает наш список и записывает каждое слово в отдельную переменную word
if word in words_dict: #проверим условие, если слово уже есть в словаре,
words_dict[word] = words_dict[word] + 1 # увеличим его значение на 1
else:
words_dict[word] = 1 # если не встречается, то просто присвоим значение 1
return words_dict #вернем наш словарь
def main():
'''наша главная функция в которой выполняется основная логика нашей программы
Вызываются все созданные ранее функции, передаются значения, выводятся на экран результаты'''
filename = input("Введите путь к файлу: ") #функция input() выводит на экран сообщение и ожидает ввода, все что будет введенобудет записано в переменную filename
if not os.path.exists(filename): #проверяем соществует ли наш файл на диске
print("Указанный файл не существует")
else:
words = get_words(filename) #получаем список слов
words_dict = get_words_dict(words) #получаем словарь из слов и их количества в тексте
print("Кол-во слов: %d" % len(words)) #печатаем количество слов в тексте
print("Кол-во уникальных слов: %d" % len(words_dict)) #печатаем количество уникальных слов
print("Все использованные слова:") # и все слова
for word in words_dict:
print(word.ljust(20), words_dict[word])
if __name__ == "__main__":
main()
1.4. Списки¶
Списки – это изменяемые упорядоченные последовательности произвольных объектов. Списки создаются посредством заключения элементов списка в квадратные скобки
names = [ “Dave”, “Mark”, “Ann”, “Phil” ]
Элементы списка индексируются целыми числами, первый элемент списка имеет индекс, равный нулю. Для доступа к отдельным элементам списка используется оператор индексирования
a = names[2] # Вернет третий элемент списка, “Ann”
names[0] = “Jeff” # Запишет имя “Jeff” в первый элемент списка
С помощью оператора среза можно извлекать и изменять целые фрагменты списков:
b = names[0:2] # Вернет [“Jeff”, “Mark”]
c = names[2:] # Вернет [“Thomas”, “Ann”, “Phil”, “Paula”]
names[1] = ‘Jeff’ # Во второй элемент запишет имя ‘Jeff’
names[0:2] = [‘Dave’,’Mark’,’Jeff’] # Заменит первые два элемента списком справа.
Списки могут содержать объекты любого типа, числа, строки, другие списки
a = [1,”Dave”,3.14, [“Mark”, 7, 9, [100,101]], 10]
Списки так же как и строки можно конкатинировать между собоой
[1,2,3] + [4,5] # Создаст список [1,2,3,4,5]
1.4.1. Меторы для работы со списками¶
List()
создаст пустой список, либо преобразует аргументы в список
l = list('1234567890')
print(l) # [1,2,3,4,5,6,7,8,9,0]
join()
собирает список строк в одну строку с разделителем, который указан перед join:
a = ['10', '20', '30']
print(','.join(a)) # 10,20,30
Примечание
Метод join на самом деле относится к строкам, но так как значение ему надо передавать как список, он рассматривается тут.
append()
добавляет в конец списка указанный элемент:
a = ['10', '20', '30', '100-200']
a.append('300')
print(a) # ['10', '20', '30', '100-200', '300']
extend()
Если нужно объединить два списка, то можно использовать два способа: метод extend() и операцию сложения.
У этих способов есть важное отличие - extend меняет список, к которому применен метод, а суммирование возвращает новый список, который состоит из двух.
a = ['10', '20', '30', '100-200']
b = ['300', '400', '500']
a.extend(b)
print(a) # ['10', '20', '30', '100-200', '300', '400', '500']
pop()
удаляет элемент, который соответствует указанному номеру. Но, что важно, при этом метод возвращает этот элемент:
a = ['10', '20', '30', '100-200']
a.pop(-1) # '100-200'
print(a) #['10', '20', '30']
Примечание
Без указания номера удаляется последний элемент списка.
remove()
удаляет указанный элемент и не возвращает удаленный элемент:
a = ['10', '20', '30', '100-200']
a.remove('20')
print(a) # ['10', '30', '100-200']
Примечание
В методе remove надо указывать сам элемент, который надо удалить, а не его номер в списке. Если указать номер элемента, возникнет ошибка:
insert()
позволяет вставить элемент на определенное место в списке:
a = ['10', '20', '30', '100-200']
a.insert(1, '15')
print(a) # ['10', '15', '20', '30', '100-200']
sort()
сортирует список на месте:
a = [1, 50, 10, 15]
a.sort()
print(a) # [1, 10, 15, 50]
1.5. Словари¶
Словари Python — нечто совершенно иное; они вообще не являются последовательностями и взамен известны как отображения. Отображения также представляют собой коллекции других объектов, но они хранят объекты по ключам, а не по относительным позициям. В действительности отображения не поддерживают какой-либо надежный порядок слева направо; они просто отображают ключи на связанные значения. Словари — единственный тип отображения в наборе основных объектов Python — являются изменяемыми,’ как и списки, их можно модифицировать на месте и они способны увеличиваться и уменьшаться по требованию. Наконец, подобно спискам словари — это гибкий инструмент для представления коллекций, но их мнемонические ключи лучше подходят, когда элементы коллекции именованы или помечены, скажем, как поля в записи базы данных.
Словари - это изменяемый упорядоченный тип данных:
данные в словаре - это пары ключ: значение
доступ к значениям осуществляется по ключу, а не по номеру, как в списках
данные в словаре упорядочены по порядку добавления элементов
так как словари изменяемы, то элементы словаря можно менять, добавлять, удалять
ключ должен быть объектом неизменяемого типа: число, строка, кортеж
значение может быть данными любого типа
для удобства словарь можно записать так:
london = {
'id': 1,
'name':'London',
'it_vlan':320,
'user_vlan':1010,
'mngmt_vlan':99,
'to_name': None,
'to_id': None,
'port':'G1/0/11'
}
Для того, чтобы получить значение из словаря, надо обратиться по ключу, таким же образом, как это было в списках, только вместо номера будет использоваться ключ:
london = {'name': 'London1', 'location': 'London Str'}
print(london['name'], london['location'])
#'London1' 'London Str'
При написании в виде литералов словари указываются в фигурных скобках и состо ят из ряда пар “ключ: значение”. Словари удобны всегда, когда нам необходимо ассо циировать набор значений с ключами — например, для описания свойств чего-нибудь. Рассмотрим следующий словарь их трех элементов (с ключами ’ food ’, ’ quantity ’ и ’ color ’, возможно представляющих детали позиции гипотетического меню):
D = {'food': 'Spam', 'quantity': 4, 'color': 'pink'}
Мы можем индексировать этот словарь по ключу, чтобы извлекать и изменять зна чения, связанные с ключами. Операция индексации словаря имеет такой же синтак сис, как для последовательностей, но элементом в квадратных скобках будет ключ, а не относительная позиция:
D['food'] # Извлечь значение, связанное с ключом 'food' 'Spam'
D['quantity'] += 1 # Добавить 1 к значению, связанному с ключом 'quantity'
print(D)
#{'color': 'pink', 'food': 'Spam', 'quantity': 5}
Хотя форма литерала в фигурных скобках встречается, пожалуй, чаще приходится видеть словари, построенные другими способами (все данные программы редко из вестны до ее запуска). Скажем, следующий код начинает с пустого словаря и заполняет его по одному ключу за раз. В отличие от присваивания элементу в списке, находящемуся вне установленных границ, которое запрещено, присваивание новому ключу словаря приводит к созданию этого ключа:
D = {}
D['name'] = 'Bob'
D['job'] = 'dev'
D['age'] =40
print (D)
#{'*:age 40, 'job': 'dev', 'name': 'Bob'}
print(D['name'])
#Bob
В словаре в качестве значения можно использовать словарь:
london_co = {
'r1': {
'hostname': 'london_r1',
'location': '21 New Globe Walk',
'vendor': 'Cisco',
'model': '4451',
'ios': '15.4',
'ip': '10.255.0.1'
},
'r2': {
'hostname': 'london_r2',
'location': '21 New Globe Walk',
'vendor': 'Cisco',
'model': '4451',
'ios': '15.4',
'ip': '10.255.0.2'
},
'sw1': {
'hostname': 'london_sw1',
'location': '21 New Globe Walk',
'vendor': 'Cisco',
'model': '3850',
'ios': '3.6.XE',
'ip': '10.255.0.101'
}
}
Получить значения из вложенного словаря можно так:
london_co['r1']['ios'] #'15.4'
london_co['r1']['model'] #'4451'
london_co['sw1']['ip'] #'10.255.0.101'
1.6. Методы для работы со словарями¶
clear()
позволяет очистить словарь:
copy()
создает полную копию словаря
london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'}
london2 = london.copy()
id(london) #25524512
id(london2) #25563296
london['vendor'] = 'Juniper'
london2['vendor'] #'Cisco'
Примечание
Если указать, что один словарь равен другому, то london2 будет ссылкой на словарь. И при изменениях словаря london меняется и словарь london2, так как это ссылки на один и тот же объект.
get()
запрашивает ключ, и если его нет, вместо ошибки возвращает None.
london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'}
print(london.get('ios')) #None
#Метод get() позволяет также указывать другое значение вместо None
print(london.get('ios', 'Ooops')) #Ooops
setdefault()
ищет ключ, и если его нет, вместо ошибки создает ключ со значением None, если ключ есть, setdefault возвращает значение, которое ему соответствует:
london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'}
ios = london.setdefault('ios')
print(ios) #None
london #{'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco', 'ios': None}
london.setdefault('name') #'London1'
#Второй аргумент позволяет указать, какое значение должно соответствовать ключу
model = london.setdefault('model', 'Cisco3580')
print(model) #Cisco3580
london
{'name': 'London1',
'location': 'London Str',
'vendor': 'Cisco',
'ios': None,
'model': 'Cisco3580'}
# Метод setdefault заменяет такую конструкцию:
if key in london:
value = london[key]
else:
london[key] = 'somevalue'
value = london[key]
keys(), values(), items()
Все три метода возвращают специальные объекты view, которые отображают ключи, значения и пары ключ-значение словаря соответственно.
Очень важная особенность view заключается в том, что они меняются вместе с изменением словаря. И фактически они лишь дают способ посмотреть на соответствующие объекты, но не создают их копию.
london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'}
keys = london.keys()
print(keys)
#dict_keys(['name', 'location', 'vendor'])
#Сейчас переменной keys соответствует view dict_keys, в котором три ключа: name, location и vendor.
#Но, если мы добавим в словарь еще одну пару ключ-значение, объект keys тоже поменяется:
london['ip'] = '10.1.1.1'
keys
#dict_keys(['name', 'location', 'vendor', 'ip'])
#Если нужно получить обычный список ключей, который не будет меняться с изменениями словаря, достаточно конвертировать view в список:
list_keys = list(london.keys())
list_keys
#['name', 'location', 'vendor', 'ip']
del()
Удаляет ключ и значение
london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'}
del london['name']
london
#{'location': 'London Str', 'vendor': 'Cisco'}
update()
Позволяет добавлять в словарь содержимое другого словаря:
r1 = {'name': 'London1', 'location': 'London Str'}
r1.update({'vendor': 'Cisco', 'ios':'15.2'})
r1
# {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco', 'ios': '15.2'}
#Аналогичным образом можно обновить значения:
r1.update({'name': 'london-r1', 'ios':'15.4'})
r1
'''
{'name': 'london-r1',
'location': 'London Str',
'vendor': 'Cisco',
'ios': '15.4'}
'''
1.7. Кортежи¶
Объект кортежа примерно похож на список, который нельзя изменять — кортежи являются последовательностями подобно спискам, но они неизменяемые подобно строка ми. Функционально они используются для представления фиксированных коллекций элементов: скажем, компонентов специфической даты в календаре. Синтаксически они записываются в круглых, а не квадратных скобках и поддерживают произвольные типы, произвольное вложение и обычные операции над последовательностями:
T = (1, 2, 3, 4) # Кортеж из 4 элементов
len(Т) # Длина 4
Т + (5, б) # Конкатенация (1, 2, 3, 4, 5, 6)
Т[О] # Индексация, нарезание и т.д.
Примечание
Главное отличие кортежей заключается в том, что после создания их нельзя из менять, т.е. они являются неизменяемыми последовательностями (одноэлементные кортежи вроде приведенного ниже требуют хвостовой запятой): tuple2 = („password“,)
Итак, зачем нам тип, который похож на список, но поддерживает меньше операций? Откровенно говоря, на практике кортежи применяются в целом не так часто, как списки, но весь смысл в их неизменяемости. Если вы передаете коллекцию объектов внутри своей программы в виде списка, тогда он может быть модифицирован где угодно; если вы используете кортеж, то изменить его не удастся. То есть кортежи обеспечивают своего рода ограничение целостности, что удобно в программах, крупнее тех, которые мы будем писать здесь. Позже в книге мы еще обсудим кортежи, включая расширение, которое построено поверх них и называется именованными кортежами.
1.8. Множество¶
Множество - это изменяемый неупорядоченный тип данных. В множестве всегда содержатся только уникальные элементы.
Множество в Python - это последовательность элементов, которые разделены между собой запятой и заключены в фигурные скобки.
С помощью множества можно легко убрать повторяющиеся элементы:
cities = ['Санкт-Петербург', 'Хабаровск', 'Казань', 'Санкт-Петербург', 'Казань']
un_cities = set(cities)
for city in un_cities:
print("Один мой друг живёт в городе " + city)
'''
Один мой друг живёт в городе Хабаровск
Один мой друг живёт в городе Санкт-Петербург
Один мой друг живёт в городе Казань
'''
Множества полезны тем, что с ними можно делать различные операции и находить объединение множеств, пересечение и так далее.
Объединение множеств можно получить с помощью метода union() или оператора |:
vlans1 = {10,20,30,50,100}
vlans2 = {100,101,102,102,200}
vlans1.union(vlans2) #{10, 20, 30, 50, 100, 101, 102, 200}
vlans1 | vlans2 #{10, 20, 30, 50, 100, 101, 102, 200}
#Пересечение множеств можно получить с помощью метода intersection() или оператора &
vlans1 = {10,20,30,50,100}
vlans2 = {100,101,102,102,200}
vlans1.intersection(vlans2) #{100}
vlans1 & vlans2 #{100}
Предупреждение
Нельзя создать пустое множество с помощью литерала (так как в таком случае это будет не множество, а словарь): set1 = {} type(set1) #dict
Но пустое множество можно создать таким образом set2 = set() type(set2) #set
1.9. Методы для работы с множествами¶
add()
добавляет элемент во множество:
set1 = {10,20,30,40}
set1.add(50)
set1 #{10, 20, 30, 40, 50}
discard()
позволяет удалять элементы, не выдавая ошибку, если элемента в множестве нет
set1 #{10, 20, 30, 40, 50}
set1.discard(55)
set1 #{10, 20, 30, 40, 50}
set1.discard(50)
set1 #{10, 20, 30, 40}
clear()
очищает множество
set1 = {10,20,30,40}
set1.clear()
set1 #set()
1.10. Булевы значения¶
Булевы значения в Python это две константы True и False.
В Python истинными и ложными значениями считаются не только True и False.
истинное значение:
любое ненулевое число
любая непустая строка
любой непустой объект
ложное значение:
0
None
пустая строка
пустой объект
Остальные истинные и ложные значения, как правило, логически следуют из условия.
Для проверки булевого значения объекта, можно воспользоваться bool:
items = [1, 2, 3]
empty_list = []
bool(empty_list) #False
bool(items) #True
bool(0) #False
bool(1) #True
1.11. Преобразование типов¶
В Python есть несколько полезных встроенных функций, которые позволяют преобразовать данные из одного типа в другой.
int()
преобразует строку в int:
int("10") #10
int("11111111", 2) #255 С помощью функции int можно преобразовать и число в двоичной записи в десятичную (двоичная запись должна быть в виде строки)
bin()
Преобразовать десятичное число в двоичный формат можно с помощью bin():
bin(10) #'0b1010'
bin(255) #'0b11111111'
hex()
Аналогичная функция есть и для преобразования в шестнадцатеричный формат:
hex(10) #'0xa'
hex(255) #'0xff'
list()
Функция list() преобразует аргумент в список:
list("string") #['s', 't', 'r', 'i', 'n', 'g']
list({1,2,3}) #[1, 2, 3]
list((1,2,3,4)) #[1, 2, 3, 4
set()
Функция set() преобразует аргумент в множество:
set([1,2,3,3,4,4,4,4]) #{1, 2, 3, 4}
set((1,2,3,3,4,4,4,4)) #{1, 2, 3, 4}
set("string string") #{' ', 'g', 'i', 'n', 'r', 's', 't'}
tuple()
Функция tuple() преобразует аргумент в кортеж:
tuple([1,2,3,4]) #(1, 2, 3, 4)
tuple({1,2,3,4}) #(1, 2, 3, 4)
tuple("string") #('s', 't', 'r', 'i', 'n', 'g')
str()
Функция str() преобразует аргумент в строку:
str(10) #'10'
1.12. Проверка типов¶
isdigit()
Проверяет, сосоит ли строка из одних только цифр
"a".isdigit() #False
"a10".isdigit() #False
"10".isdigit() #True
isalpha()
Проверяет, состоит ли строка из одних букв:
"a".isalpha() #True
"a100".isalpha() #False
"a-- ".isalpha() #False
"a ".isalpha() #False
isalnum()
позволяет проверить, состоит ли строка из букв или цифр:
"a".isalnum() #True
"a10".isalnum() #True
type()
Иногда, в зависимости от результата, библиотека или функция может выводить разные типы объектов. Например, если объект один, возвращается строка, если несколько, то возвращается кортеж.
Нам же надо построить ход программы по-разному, в зависимости от того, была ли возвращена строка или кортеж.
В этом может помочь функция type():
type("string") #str
type("string") is str #True
#Аналогично с кортежем (и другими типами данных):
type((1,2,3)) #tuple
type((1,2,3)) is tuple #True
type((1,2,3)) is list #False
1.13. Файлы¶
Объекты файлов являются главным интерфейсом к внешним файлам на компью тере. Они могут применяться для чтения и записи текстовых заметок, аудиоклипов, документов Excel, сохраненных сообщений электронной почты и всего того, что вы в итоге сохранили на своем компьютере. Файлы относятся к основным типам, но они кое в чем своеобразны — специфический литеральный синтаксис для их создания от сутствует, Взамен, чтобы создать объект файла, необходимо вызвать встроенную фун кцию open, передав ей в виде строк имя внешнего файла и необязательный режим обработки.
Например, для создания выходного текстового файла понадобится передать его имя и строку режима обработки ’ w ’, чтобы записывать данные:
f = open('data.txt' , 'w') # Создать новый файл в режиме записи ('w')
f.write('Hello\n') # Записать в него строки символов
f.write ('world\n') # Возвратить количество записанных элементов
f.close() # Закрыть для сбрасывания буферов вывода на диск
Код создает файл в текущем каталоге и записывает в него текст (имя файла мо жет содержать полный путь к каталогу, если нужно получить доступ к файлу где-то в другом месте на компьютере). Чтобы прочитать то, что было записано, необходимо повторно открыть файл в режиме обработки ’ г ’ для чтения текстового ввода (он вы бирается по умолчанию, если в вызове строка режима не указана). Затем следует про читать содержимое файла в строку и отобразить ее. В сценарии содержимое файла всегда будет строкой независимо от типа находящихся в нем данных:
f = open('data.txt') # 'г' (чтение) - стандартный режим обработки
text = f.read() # Прочитать все содержимое файла в строку
text #'Hello\nworld\n'
print(text) # print интерпретирует управляющие символы
#Hello
#world
text.split() # Содержимое файла - всегда строка
#['Hello', 'world']
Примечание
Обратите внимание, что для того что бы прочесь все строки из файла, нам нужно обернуть функцию чтения в цикл for line in open(’data.txt’): print(line)
так же не забывайте закрывать файл после операции чтения или записи f.close
Примечание
Ранее в примере с подсчетом слов мы использовали друую констукцию
- with open(filename, encoding=»utf8») as file: #эта строка открывает файл
text = file.read() #читаем содержимое файла и записываем все в переменную text
text = text.replace(«n», » «) #преобразуем наш текст в одну длинную строку заменив символ перевода строки на пробел
text = text.replace(«,», «»).replace(«.», «»).replace(«?», «»).replace(«!», «») #а так же уберем все запетые, пробелы, и прочие знаки пунктуации
text = text.lower() #перведем все слова в строчные, тоесть если было «Начало изучения Языка Программирования», то будет «начало изучения языка программирования»
words = text.split() #создадим список слов («списки»,»выгледят»,»вот»,»так»)
words.sort()
Такой подход позволяет не закрывать файл в ручную.