среда, 14 декабря 2011 г.

Технические задачки





1. Что будет выведено в результате исполнения программы? Почему?
class A:
     def __init__(self, name):
          self.name = name
     def __del__(self):
          print self.name,
 
aa = [A(str(i)) for i in range(3)]
for a in aa:
    del a

Вывод узнать легко в любой IDE. Это 2 1 0. Вопрос почему? Исходя из порядка(он если что, обратен созданию), можно догадаться, что тут задействован стек, т.е. работает правило LIFO.
При удалении списка - элементы удаляются в обратном порядке созданию.
Но важно понять, что удаление происходит в нашем случае, всего лишь когда скрипт отработал, а инструкция del тут ни при чём!
Вызов инструкции del рвёт связь имени переменной(в нашем случае a) и данных, находящихся в памяти, т.е. в цикле мы создаём ссылку на элемент списка, дём ей название->a, выводим name элемента и рвём связь. Чтобы отработал магический метод __del__ нужно вызывать del напрямую к элементу, т.е. через индекс, например del a[0]


2. Что будет выведено в результате исполнения программы? Почему?
class A:
    def __init__( self ):
        self.__value = 1
    def getvalue( self ):
        return self.__value
 
class B( A ):
    def __init__( self ):
        A.__init__( self )
        self.__value = 2
 
b = B()
print b.getvalue() == b.__value
Ответ: случится Exception, потому что невозможно получить доступ к __value извне класса. Однако самое интересное, здесь другое. В данном случае b.getvalue() возвращает 1, т.к. self.__value различно в каждом контексте. А именно b._A__value и b._B__value!



3. Есть 2 таблицы users и messages
users
UID Name
1 «Вася»
2  «Петя»


messages
UID msg
1 “A”
1 “B”
2 “C”

Напишите SQL-запрос, результатом которого будет таблица из двух полей: «Имя пользователя» и «Общее количество сообщений».
Здесь, могу посоветовать -  SELECT INTO
UPD добавил пример)
CREATE TABLE cvc.users(
 uid INT,
 name varchar(100)
);

CREATE TABLE cvc.messages(
 uid INT,
 msg varchar(100)
);

INSERT INTO cvc.users (uid, name) VALUES (1, 'Vasja'), (2, 'Petja');
INSERT INTO cvc.messages (uid, msg) VALUES (1, 'A'), (1, 'B'), (2, 'C');

select name, count(*) as cnt from cvc.users join cvc.messages on users.uid = messages.uid group by users.uid;
select name, count(*) as cnt from cvc.users, cvc.messages where users.uid = messages.uid group by users.uid;

DROP TABLE cvc.users;
DROP TABLE cvc.messages;