map (setattr, & hellip;), отличный от python2 to python3 [duplicate]

Найти похожие ответы здесь: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

Нарезка означает, что данные, добавленные подклассом, отбрасываются, когда объект подкласса передается или возвращается по значению или из функции, ожидающей объект базового класса.

Объяснение: Рассмотрим следующее объявление класса:

           class baseclass
          {
                 ...
                 baseclass & operator =(const baseclass&);
                 baseclass(const baseclass&);
          }
          void function( )
          {
                baseclass obj1=m;
                obj1=m;
          }

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

10
задан yegle 25 August 2013 в 21:41
поделиться

4 ответа

Использование map для его побочных эффектов (например, вызов функции), когда вас не интересуют возвращенные значения, нежелательно даже в Python2.x. Если функция возвращает None, но повторяет миллион раз - вы бы создали список из миллиона None s, чтобы отменить его. Правильный способ - либо использовать цикл for и loop:

for row in data:
    writer.writerow(row)

, либо, как позволяет модуль csv, использовать:

writer.writerows(data)

Если по какой-то причине вы действительно, действительно хотел использовать map, тогда вы можете использовать рецепт consume из itertools и сгенерировать нуль длины, например:

from collections import deque
deque(map(writer.writerow, data), maxlen=0)
15
ответ дан Jon Clements 21 August 2018 в 03:21
поделиться

Если вы не заботитесь о возвращаемом значении, то map не лучший инструмент для задания. Простой for был бы лучше:

for d in data:
    writer.writerow(d)

Это отлично работает в Python 2.x и 3.x. Обратите внимание, что map полезна, когда вы хотите создать новый список, если вы переходите по итерируемому только для эффекта, а затем используйте for.

2
ответ дан Óscar López 21 August 2018 в 03:21
поделиться

Вы можете установить нулевую длину deque , чтобы сделать это:

with open("output.csv", "w") as f:
    writer = csv.writer(f)
    collections.deque(map(writer.writerow, data),0)

Это то же самое, что и рецепт itertools.consume (iterator, None). Он функционально исчерпывает итератор, не создавая список.

Вы также можете просто использовать рецепт потребления из itertools.

Но цикл более читабельный и Pythonic для меня, но YMMV.

2
ответ дан dawg 21 August 2018 в 03:21
поделиться
0
ответ дан user1637146 31 October 2018 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: