1. Python / Говнокод #12778

    −103

    1. 1
    city_network_ip_adresses=reduce(lambda x,y: x+y,(map(lambda d,t: ['10.253.%s.%s' % (t,d) for d in xrange(1,255)],xrange(0),xrange(1,256))))

    Делать два for'а было ну совсем западло, обязательно же память засрать)

    Запостил: voiper, 21 Марта 2013

    Комментарии (9) RSS

    • Ну если это третий питон (или второй с from future_builtins import map), то по идее достаточно заменить генератор списка на итерацию ( ( ... ) вместо [ ... ] ), и тогда все итерируемые объекты будут ленивые.
      Ответить
      • Разве reduce(...) вернет итератор?
        Ответить
        • reduce() получит итератор, а вернет вообще скаляр.
          При этом, если я верно представляю работу reduce(), ей нет нужды грузить всё в память, она работает поэлементно.
          Ответить
          • а присваиванием к city_network_ip_adresses разве не херим всю ленивость вычисления?
            Ответить
      • Правда, ленивость не отменит того факта что это - write-only однострочник.
        Ответить
        • Да ладно уж там, write-only... вполне спокойно разворачивается даже на взгляд в уме. Но тут есть одно НО - поясните, плиз, кто-нибудь - в чём смысл xrange(0)?
          Ответить
    • два for смотрелись бы гораздо лучше. если я правильно понимаю суть, то вместо reduce правильней было бы использовать str.join.
      Ответить
      • с str.join налажал, вроде вот так можно, ленивей будет:
        itertools.chain(*map(lambda d,t: ['10.253.%s.%s' % (t,d) for d in xrange(1,255)],xrange(0),xrange(1,256)))
        вот вариант более читабельный вариант:
        city_network_ip_adresses = ('10.253.%d.%d' % (x, y) for x in xrange(1, 256) for y in xrange(1, 255))
        И с ленивостью всё в порядке.
        Ответить
    • И всё же, почему без xrange(0) не пашет?)
      Ответить

    Добавить комментарий