Объединить функции, чтобы уменьшить количество запросов - PullRequest
3 голосов
/ 14 октября 2011

С Набор задач Python Три функции работают правильно, но для получения окончательного результата требуется выполнение по одной за раз перед переходом к следующей. Есть ли способ получить результат из всех трех без запроса каждого из них в отдельности?

>>> import itertools

>>> def prime_factors(value):
    if value > 3:
        for this in itertools.chain(iter([2]), xrange(3,int(value ** 0.5)+1, 2)):
            if this*this > value:  break
            while not (value % this):
                if value == this: break
                value /=  this
                yield this
    yield value

>>> prime_factors(315)
generator object prime_factors at 0x01182468>

>>> def prime_factors_mult(n):
    res = list(prime_factors(n))
    return sorted([fact, res.count(fact)] for fact in set(res))

>>> prime_factors_mult(315)
[[3, 2], [5, 1], [7, 1]]

>>> def totient(n):
    from operator import mul
    if n == 1: return 1
    return reduce(mul, [(p-1) * p**(m-1) for p,m in prime_factors_mult(n)])

>>> totient(315)
144

1 Ответ

1 голос
/ 14 октября 2011

Вы можете объединить вторые 2, но генератор должен оставаться генератором:

In [1]: import itertools
In [2]: from operator import mul

In [3]: def prime_factors(value):
            if value > 3:
                for this in itertools.chain(iter([2]), xrange(3,int(value ** 0.5) + 1, 2)):
                    if (this * this) > value:
                        break
                    while not (value % this):
                        if value == this:
                            break
                        value /= this
                        yield this
            yield value

In [4]: def totient(n):
            if n != 1:
                res = list(prime_factors(n))
                prime_factors_mult = sorted([fact, res.count(fact)] for fact in set(res))
                retValue = reduce(mul, [(p-1) * p**(m-1) for p,m in prime_factors_mult]), prime_factors_mult
            else:
                retValue = n
            return retValue

In [5]: x = totient(315)

In [6]: print x
(144, [[3, 2], [5, 1], [7, 1]])

In [7]: print x[0]
144

In [8]: print x[1]
[[3, 2], [5, 1], [7, 1]]

Вы на самом деле можете объединить все 3 и заставить функцию 1 возвращать 3-х кортеж каждого из них.возвращаемое значение будет:

import itertools
from operator import mul

def totient(n):
    if n == 1:  return 1
    res = list()
    value = int("%d" % n)
    if value > 3:
        for this in itertools.chain(iter([2]), xrange(3,int(value ** 0.5)+1, 2)):
            if this*this > value:  break
            while not (value % this):
                if value == this:  break
                value /= this
                res.append(this)
    res.append(value)
    prime_factors_mult = sorted([fact, res.count(fact)] for fact in set(res))
    return res, reduce(mul, [(p - 1) * p**(m - 1) for p,m in prime_factors_mult]), prime_factors_mult

x = totient(315)

# This would be the returned list from prime_factors(315)
print x[0]
[3, 3, 5, 7]

# This would be the returned value from totient(315)
print x[1]
144

# This would be the returned list from prime_factors_mult(315)
print x[2]
[[3, 2], [5, 1], [7, 1]]

# The 3-tuple:
print x
([3, 3, 5, 7], 144, [[3, 2], [5, 1], [7, 1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...