Первая пачка ответов на вопросы из какого-то собеседования, линк к сожалению потерялся. В принципе вопросы довольно простые, если знать немножко про функциональное программирование и ориентироваться в стандартных функциях.
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')
Итого
Чтобы более детально осознать о чем идет речь :