Не могу понять основы основ в программировании. А именно, как работать с объектами когда о них ничего неизвестно?
Не могу понять абсолютно как работать с объектами в python. Я понимаю что в python всё является объектами (ну так пишут). И в большинстве случаев понятно, как с ними работать. Предположим если этот объект словарь то я знаю, что можно перебрать его ключи, обратиться к его значениям по ключам, добавить в него значения и т.п.
Но что делать, когда в результате какой-то операции я получаю такие вещи:
<pandas.core.groupby.generic.SeriesGroupBy object at 0x7f064fd517f0>
Или вот конкретный пример:
r = [1, 2, 3, 4, 5]
print(map(lambda x: x*3, r))
<map object at 0x7fc3861bbee0>
Я понимаю что map возвращает итератор и можно использовать next() или цикл for или сразу все перевести в list, чтобы увидеть значения. Но до конца не могу все равно понять что с ним можно делать и как применять можно, а как нет.
В большинстве случаев я вообще не понимаю, что возвращается, что скрывается за этими символами, можно ли это итерировать и т.д.
Как с этим работать?
Ответы (1 шт):
Допустим, вас забанили в гугле. Такое бывает. Попробуем обойтись самим питоном. Посмотрим краткую документацию по объекту, а также список доступных методов объекта. Для этого создадим небольшую функцию, чтобы не повторять код согласно принципу DRY (don't repeat yourseft):
def object_info(obj):
print(type(obj))
print()
print(obj.__doc__)
print()
print(dir(obj))
print()
Теперь попробуем немного изучить некоторые объекты, начнём со списка:
r = [1, 2, 3, 4, 5]
object_info(r)
Вывод:
<class 'list'>
Built-in mutable sequence.
If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
'__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']
Ну, нам сообщают, что это изменяемая последовательность и прочее по мелочи. Можно также увидеть, что у сего объекта есть методы append, pop, sort и прочие.
Посмотрим, что нам сообщит экземпляр объекта "словарь":
d = {1: 2, 3: 4}
object_info(d)
Вывод:
<class 'dict'>
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
'__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items',
'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
Ого, нам сообщили и как создать словарь, и как заполнить его разными методами. Куча методов есть у словаря, например keys, items.
m = map(lambda x: x*3, r)
object_info(m)
Вывод:
<class 'map'>
map(func, *iterables) --> map object
Make an iterator that computes the function using arguments from
each of the iterables. Stops when the shortest iterable is exhausted.
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__',
'__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Ну, тоже всякое понаписано. Удобно, если знать английский язык. Хотя большинство методов у объектов более-менее стандартные, но далеко не все. Полезно знать и те методы, которые встречаются у большинства объектов, например: __init__, __str__, __doc__ и методы, которые специфичны для, например, коллекций и других типов объектов. Тогда уже даже по одному только набору методов вполне можно догадаться, что это за объект и что с ним можно делать.