Не могу понять основы основ в программировании. А именно, как работать с объектами когда о них ничего неизвестно?

Не могу понять абсолютно как работать с объектами в 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 шт):

Автор решения: CrazyElf

Допустим, вас забанили в гугле. Такое бывает. Попробуем обойтись самим питоном. Посмотрим краткую документацию по объекту, а также список доступных методов объекта. Для этого создадим небольшую функцию, чтобы не повторять код согласно принципу 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__ и методы, которые специфичны для, например, коллекций и других типов объектов. Тогда уже даже по одному только набору методов вполне можно догадаться, что это за объект и что с ним можно делать.

→ Ссылка