def FindingTwoPrimes(n, p1, p2):
    p1 = 0
    p2 = 0
    n = 0
    primeList = []
    for num in range(1,101):
        if all(num%i!=0 for i in range(2,num)):
            primeList.append(num)
    print (primeList)
    print ("Length of Primelist = ", len(primeList))
    lengthOfPrimelist = len(primeList)
    p1 = primeList[random.randint(0,lengthOfPrimelist)]
    p2 = primeList[random.randint(0,lengthOfPrimelist)]
    n = p1 * p2
    print ("p1 =", p1)
    print ("p2 =", p2)
    return n
    return p1
    return p2


FindingTwoPrimes(n, p1, p2)
print(p1, p2, n)

Así que arriba es una función que encontrará dos primos que usaré en el método del sistema de cifrado de clave pública. Sin embargo, cuando ejecuto la función, devuelve p1, p2 yn de nuevo como 0. ¿Por qué es esto y cómo lo resuelvo? Además, cualquier método para hacer este código más eficiente sería apreciado :-)

0
Jakob Camwell 28 oct. 2017 a las 20:01

3 respuestas

La mejor respuesta

Debe haber solo un retorno en una función, pero tiene 3. Cambie las líneas siguientes de

return n
return p1
return p2

Para

return [n,p1,p2]

Luego cambie la declaración de impresión como

print FindingTwoPrimes(n, p1, p2)

También el código en su función está mal. Por favor cambie eso también

import random
def FindingTwoPrimes(n, p1, p2):
    primeList = []
    for num in range(1,101):
        if all(num%i!=0 for i in range(2,num)):
            primeList.append(num)
    lengthOfPrimelist = len(primeList)
    p1 = primeList[random.randint(0,lengthOfPrimelist)]
    p2 = primeList[random.randint(0,lengthOfPrimelist)]
    n = p1 * p2
    return [p1,p2,n]

print FindingTwoPrimes(10, 11, 12)
1
Sandeep Lade 28 oct. 2017 a las 17:42

Su función devolverá un valor único, porque su ejecución finalizará después de la primera instrucción return. Puede devolver valores de multiplicación utilizando un tuple

def FindingTwoPrimes(n, p1, p2):
...
    return n, p1, p2


n, p1, p2 = FindingTwoPrimes(n, p1, p2)
print(p1, p2, n)

Además, su código no funcionaría en absoluto. Al comienzo de la función, asigna valores cero a todos sus argumentos.

def FindingTwoPrimes(n, p1, p2):
    p1 = 0
    p2 = 0
    n = 0

Intente utilizar variables con diferentes nombres dentro de la función.
Según tengo entendido, intentas pasar los resultados de la función en argumentos. Esta es una mala idea. Use tuple para obtener resultados de la función

def FindingTwoPrimes():
    p1 = 0
    p2 = 0
    n = 0
    ...
    return n, p1, p2

n, p1, p2 = FindingTwoPrimes()
print(p1, p2, n)

Sobre la última parte de su pregunta: cómo hacerlo más eficiente. Si planea llamar a esta función muchas veces, puede mover el cálculo primeList fuera de la función.

def FindingTwoPrimes(primeList):
    lengthOfPrimelist = len(primeList)
    p1 = primeList[random.randint(0,lengthOfPrimelist)]
    p2 = primeList[random.randint(0,lengthOfPrimelist)]
    n = p1 * p2
    print ("p1 =", p1)
    print ("p2 =", p2)
    return n, p1, p2

primeList = [num for num in range(1,101) if all(num%i!=0 for i in range(2,num))]

print (primeList)
print ("Length of Primelist = ", len(primeList))

n, p1, p2 = FindingTwoPrimes(primeList)
print(p1, p2, n)
4
kvorobiev 28 oct. 2017 a las 17:24

Para resolver esto solo necesito

(n, p1, p2) = FindingTwoPrimes(n, p1, p2)
-1
Javi Gonzalez 28 oct. 2017 a las 17:06