Модуль pickle

С помощью модуля pickle можно преобразовать объект в набор байтов, а потом обратно - из байтов в исходный объект.

import pickle
 
f = open("text.txt","w");
a = [1,2]
pickle.dump(a,f)
f.close()
 
f = open("text.txt","r");
a = pickle.load(f)
print(a)
f.close()

Содержимое файла выглядит странно:

(lp0
I1
aI2
a.

Списки. Передача ссылки и передача копии

Если один список является вложенным в другой, то этого списка, через переменную, повлечет за собой его изменение в том списке, куда он был вложен. Во второй строке кода в b записывается не значение, связанное с a, а ссылка. В результате на список [1, 2, 3, 4, 5] ссылаются из двух мест: из a и из b[2]. Изменять этот список можно через любую ссылку.

>>> a = [1, 2, 3, 4, 5]
>>> b = [10, 20, a, 30, 40]
>>> a.append(6)
>>> b
[10, 20, [1, 2, 3, 4, 5, 6], 30, 40]
>>> b[2][0:0] = [0]
>>> a
[0, 1, 2, 3, 4, 5, 6]

Как удалить элемент списка или вставить элемент в произвольное место

Допустим есть такой список:

>>> a = [1,2,3,4,5,6,7,8,9]

И мы хотим удалить из него элемент с индексом 3, имеющий значение 4. Если попытаться это сделать так:

>>> a[3] = []

, то получима совсем не то, что надо:

>>> a
[1, 2, 3, [], 5, 6, 7, 8, 9]

Другими словами, число 4 было заменено на пустой список.

Однако если указать срез из одного элемента и присвоить ему пустой список, то все сработает:

>>> a[3:4] = []
>>> a
[1, 2, 3, 5, 6, 7, 8, 9]

Подсчет количества строк, слов и букв в текстовом файле

Скрипту должно передаваться имя текстового файла. Например, в среде Windows в командной строке команда выглядит так:

words.py test.txt

Без слова python впереди.

Скрипт считает количество строк, слов и символов в файле.

import sys
 
fname = sys.argv[1]
lines = 0
words = 0
letters = 0
 
for line in open(fname):
    lines += 1
    letters += len(line)
 
    pos = 'out'
    for letter in line:
        if letter != ' ' and pos == 'out':
            words += 1
            pos = 'in'
        elif letter == ' ':
            pos = 'out'     
 

Поиск путей между точками по графам (v.2)

В отличие от предыдущей версии в данной программе находятся не только прямые пути (т.е. содержащие обе точки сразу), но и пути через пары графов, имеющих пересечение.

search_paths.png

Краткое описание программы "Search of paths"

Программа позволяет найти возможные пути от одной точки до другой. Описание графов (название и список точек, через которые он проходит) содержится в файле graphs.txt и загружается в момент запуска программы.

Обработка исключений, создание класса исключения

class MyError(Exception):
    def __init__(self,text):
        MyError.txt = text
 
a = input("Input positive integer: ")
 
try:
    a = int(a)
    if a < 0:
        raise MyError("you give negative!") # возбуждает собственное исключение
except ValueError:
    print("Error type of value!")
except MyError:
    print(MyError.txt)
 
print(a)


class General: pass
class Specific1(General): pass
class Specific2(General): pass
 
def raiser0():
    x = General()
    raise x
 
def raiser1():
    x = Specific1()
    raise x
 
def raiser2():

Пример работы с данными, представляющими собой таблицу базы данных

Программа загружает данные из файла такого формата, где первое поле - это уникальный ключ:

pr.v|Vasil Vas|30.11.1976|34.5|8
mg.s|Kosin Stepa|08.03.1973|40.1|7
el.p|Pier Pety|16.07.1985|30.8|8

В программе данные хранятся в виде словаря, у которого значения ключей представлены списками с четырьмя элементами.

Пользователь может просматривать содержимое словаря, добавлять новые элементы, удалять целые элементы. Правка значений в программе не предусмотрена.

В конце данные можно записать в файл.

Пример наследования

Объекты классов ListAdder и DictAdder могут участвовать в операциях сложения через класс Adder. При этом механизм сложения у каждого подкласса реализован отдельно.

class Adder:
    def add(self, y):
        print('not implemented!')
    def __init__(self, start=[]): # вызывается также из классов ListAdder и DictAdder
        self.data = start
    def __add__(self, other): # вызывается в выражениях < объект + other >
        return self.add(other) # self передается в первом аргументе
 
class ListAdder(Adder):
    def add(self, y): # сложение двух списков

Пример наследования и композиции в ООП

стр. 641-644

Первый файл содержит только элементы наследования, второй - содержит класс-конструктор. Объекты, созданные из класса конструктора, состоят из других объетов, созданных на основе других классов. Так в примере ниже объект-сцена имеет в своем составе "клиента", "официанта", "повара" и "печь".

class Employee:
    def __init__(self, name, salary=0):
        self.name = name
        self.salary = salary
    def giveRaise(self, percent):
        self.salary += self.salary * percent
    def work(self):
        print(self.name, "does stuff")
    def __repr__(self):

Пример создания класса, объекты которого можно складывать и умножать

### Идея такова:
###    создается объект класса Num2nums
###    его свойству value устанавливается числовое значение
###    методы summa и multi складывают и умножают цифры числа
###    при этом используют скрытые методы _sum и _mult
###    методы __add__ и __mul__ позволяют участвовать объектам в операциях сложения и умножения
 
class Num2nums():
    def _sum (a):
        b = 0
        while a > 0:
            b = b + a % 10
            a = a // 10
        return b
    def _mult (a):
        b = 1
        while a > 0:
            b = b * (a % 10)

Syndicate content