На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: RaD
  
    > Распаковка аргументов, Python 3.7
      Доброго времени суток!

      Вот к примеру код, на Python 2.7 работает, а в Python 3.7 нет
      ExpandedWrap disabled
        persons = [('Gregory', 42), ('Julia', 27)]
         
        print([age for name, age in persons]) # OK Генератор списка в любой версии
        print(map(lambda (name, age): age, persons)) # OK в Python 2.7
         
        print(list(map(lambda name, age: age, persons))) # Python 3.7
        #                     ^^^ TypeError: <lambda>() missing 1 required positional argument: 'age'

      Как исправить? :wacko:
      Rabbit don't come easy: https://github.com/Cfon/ :D
        Ну, можно так на край
        ExpandedWrap disabled
          print(list(map(lambda item: item[1], persons)))
          В Python 3.x лучше пользоваться не map'ом, а генератором списка, работающим и в ранних версиях.
          А не работает, поскольку в Python 3.x решили сделать синтаксис объявления функций более строгим.

          А задачу можно решить и так
          ExpandedWrap disabled
            from itertools import starmap
             
            print(list(starmap(lambda name, age: age, persons)))
          или лучше так
          ExpandedWrap disabled
            from operator import itemgetter
             
            print(list(map(itemgetter(1), persons)))
          или составить список персон из размеченных кортежей и воспользоваться attrgetter
          ExpandedWrap disabled
            from collections import namedtuple
            Person = namedtuple('name age')
            persons = [Person('Gregory', 42), Person('Julia', 27)]
             
            from operator import attrgetter
             
            print(list(map(attrgetter('age'), persons)))



          Но, повторю, в данной ситуации это не слишком хорошие решения, даже если результат "маппирования" передаётся итератором куда-то, а не конвертится в список.
          map и starmap имеет смысл использовать для вызова "тяжёлых" функций.
          Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
            Спасибо Друзья! Это работает! :good:

            А вот мое гениальное решение :D :D
            ExpandedWrap disabled
              def get_person_attr(attr):
                  return {
                      'name': lambda person: person[0],
                      'age': lambda person: person[1],
                  }[attr]
               
              print(list(map(get_person_attr('age'), persons))) # Any Python


            Цитата amk @
            В Python 3.x лучше пользоваться не map'ом, а генератором списка, работающим и в ранних версиях.

            как правило его и юзаю

            Цитата amk @
            Но, повторю, в данной ситуации это не слишком хорошие решения, даже если результат "маппирования" передаётся итератором куда-то, а не конвертится в список.
            map и starmap имеет смысл использовать для вызова "тяжёлых" функций.

            из-за производительности?
            Сообщение отредактировано: Cfon -
            Rabbit don't come easy: https://github.com/Cfon/ :D
              Цитата Cfon @
              из-за производительности?
              Из-за этого тоже, но больше из-за ухудшения читаемости.
              Map с лямбдой воспринимается не так хорошо, как генератор. А с именем функции и переменной воспринимается нормально.
              Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0866 ]   [ 14 queries used ]   [ Generated: 17.06.19, 12:56 GMT ]