Social Profiles

My Projects

Типы данных, основные конструкции. Python.

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

1. Как получить список всех атрибутов объекта?

Очень просто, используя стандартную функцию dir. В качестве аргумента передаем тот самый объект, в данном случае (для примера) объект string.

import string
print dir(string)
# Или так
import inspect
print [name for name, thing in inspect.getmembers(string)]

Модуль inspect предоставляет несколько очень полезных методов которые позволяют собирать информацию о объектах Python, это достаточно важно, т.к. питон динамический ЯП и в нем очень просто сделать вещи которые обычно называют "хакерскими". Используя inspect можно получить содержимое класса, получить исходный код метода (ага, и поменять его), выделить формат и список аргументов функции и т.д.

2. Как получить список всех публичных атрибутов объекта?

Private методы в Python начинаются с "__" поэтому все что нужно сделать чтобы получить список public аттрибутов это отфильтровать все, что начинается с "__". Тут будет уместно использовать элемент функционального программирования - функцию filter(f, lst) которая формирует новый список элементов последовательности - lst руководствуясь функцией f.

import sting
# так проще для понимания
def f(x):
    if x[:2] == "__":
        return False
    else:
        return True
print filter(f, [atr for atr in dir(string)])
# а это то же самое в одну строчку
print filter(lambda x : False if not cmp(x[:2], "__") else True, [atr for atr in dir(string)])

3. Как получить список методов объекта?

Используя функцию callable() которая как бы говорит реально ли вызвать объект или нет. если вызвать реально - то это метод, если нет - то свойство

print filter(lambda x : callable(getattr(string, x)), [atr for atr in dir(string)])

4. В какой "магической" переменной хранится содержимое help?

В __doc__

print string.__doc_

5. Есть два кортежа, получить третий как конкатенацию первых двух.

Элементарно.

a = (1,2)
b = (3,4)
print a + b

6. Есть два кортежа, получить третий как объединение уникальных элементов первых двух кортежей.

Сначала преобразуем конкатенацию (операция склеивания объектов линейной структуры, обычно строк) в объект - множество (элементы которого уникальны, т.е. не могут повторятся, это свойство объекта) а затем преобразуем обратно в кортеж.

a = (1,2,3)
b = (5,3,6)
print tuple(set(a + b))

7. Почему если в цикле меняется список, то используется for x in lst[:], что означает [:]?

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

a = [1,2,3,4]
print a
for i,elem in enumerate(a[:]):
    a[i] = elem * elem
print a

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

Преобразуем в пары (a,1) и т.д. c помощью zip и далее преобразование в тип данных - словарь с помощью функции dict()

a = ['a','b','c']
b = [1,2,3]
print dict(zip(a,b))

9. Есть два списка разной длины, в одном ключи, в другом значения. Составить словарь. Для ключей, для которых нет значений использовать None в качестве значения. Значения, для которых нет ключей игнорировать.

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

# можно так но тогда не выполняется 2ая часть условия. игнорирование значений для которых нет ключей.
a = ['a','b','c','d']
b = [1,2,3]
print dict(map(None, a, b))
a = ['a','b','c']
b = [1,2,3,4]
# выполняет все требования задания.
print dict(filter(lambda x : False if x is False else True, map(lambda x, y : (x, y) if x is not None else False, a, b)))

10. Есть словарь. Инвертировать его. Т.е. пары ключ: значение поменять местами — значение: ключ.

На помощь приходит метод items() который возвращает элементы словаря в виде кортежа (в виде пар) - (key, value)

a = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4}
print dict([(y,x) for (x,y) in a.items()])

11. Есть строка в юникоде, получить 8-битную строку в кодировке utf-8 и cp1251.

str = u'unicode sting'
print str.encode('utf-8')
print str.encode('cp1251')

12. Есть строка в кодировке cp1251, получить юникод строку.

str = 'cp1251 string'
print str.decode('cp1251')

Итого

Чтобы более детально осознать о чем идет речь :

comments powered by Disqus