Как написать следующий код в форме понимания списка? - PullRequest
0 голосов
/ 06 января 2019

Попытка преобразовать следующий код в форму понимания списка, но я получаю синтаксическую ошибку для "+ =" рядом с остальным

def lucky_sum(a, b, c):
    ip = [a, b, c]
    sum = 0
    for i in ip:
        if i ==13:
            return sum
        else:
            sum+=i
    return sum

Я пробовал это:

def lucky_sum(a, b, c):
    ip = [a, b, c]
    sum = 0
    res = [sum if i == 13 else sum += i for i in ip]
    return sum

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Понимание списка здесь не адаптировано, но это не значит, что мы не можем использовать функциональное программирование.

Используйте встроенные sum и itertools.takewhile для завершения итерации при собрании 13. Создает однострочник.

import itertools


def lucky_sum(a, b, c):
    return sum(itertools.takewhile(lambda x:x!=13,[a, b, c]))

print(lucky_sum(1,2,3))
print(lucky_sum(1,13,3))

отпечатков 6, затем 1

Переменная число аргументов версия:

def lucky_sum(*ip):
    return sum(itertools.takewhile(lambda x:x!=13,ip))
0 голосов
/ 06 января 2019

Прежде всего: не делайте здесь понимания списка. Они существуют, поэтому вам легче создавать списки.

Просто чтобы посмотреть, возможно ли это (без внешнего модуля), я попробовал и придумал следующее:

def lucky_sum2(*args):
    return sum(el if el != 13 else next(iter([])) for el in args)

Это злоупотребляет тем фактом, что next(iter([])) повышает StopIteration (что, однако, скоро будет признано устаревшим).

Не используйте это, пожалуйста

0 голосов
/ 06 января 2019

Здесь невозможно использовать списочное понимание, так как вы назначаете что-то (этот случай +=, но в нем все еще есть =), поэтому вы должны оставаться в цикле, списочные понимания не являются вещи, которые можно использовать для чего угодно.

Так что оставайтесь с петлей.

...