Search code examples
pythonintegerintmovefunction

Pass integer from one def to another in Python


I'm trying to cross compare two outputs labeled "S" in compareDNA (calculating Hamming distance). Though, I cannot figure out how to call an integer from one def to another. I've tried returning the variable, but, I am unable to call it (in a different def) after returning it. I'm attempting to see which output of "compareDNA(Udnalin, Mdnalin) and compareDNA(Udnalin, Hdnalin)" is higher, to determine which has a greater hamming distance. How does one call an integer from one def to another?

import sys
def main():
    var()

def var():
    Mdna = open("mouseDNA.txt", "r")
    Mdnalin = Mdna.readline()

    print(Mdnalin)
    Mdna.close

    Hdna = open("humanDNA.txt", "r")
    Hdnalin = Hdna.readline()
    print(Hdnalin)
    Hdna.close

    Udna = open("unknownDNA.txt", "r")
    Udnalin = Udna.readline()
    print(Udnalin)
    Udna.close
    S = 0
    S1 = 0
    S2 = 0
    print("Udnalin + Mdnalin")
    compareDNA(Udnalin, Mdnalin)
    S1 = S
    print("Udnalin + Hdnalin")
    compareDNA(Udnalin, Hdnalin)



def compareDNA(i, j):
    diffs = 0
    length = len(i)
    for x in range(length):
        if i[x] != j[x]:
            diffs += 1
    S = length - diffs / length
    S = round(S, 2)
    return S


    #   print("Mouse")

    #   print("Human")

    #   print("RATMA- *cough* undetermined")

main()

Solution

  • You probably want to assign the value returned by each call to compareDNA to a separate variable in your var function. Then you can do whatever you want with those values (what exactly you want to do is not clear from your question). Try something like this:

    S1 = compareDNA(Udnalin, Mdnalin)  # bind the return value from this call to S1
    S2 = compareDNA(Udnalin, Hdnalin)  # and this one to S2
    
    # do something with S1 and S2 here!
    

    If what you want to do is especially simple (e.g. comparing them to see which is larger), you could even use the return values directly in an expression, such as the condition in a if statement:

    if compareDNA(Udnalin, Mdnalin) >  S2 = compareDNA(Udnalin, Hdnalin):
        print("Unknown DNA is closer to a Mouse")
    else:
        print("Unknown DNA is closer to a Human")
    

    There's one further thing I'd like to point out, which is unrelated to the core of your question: You should use with statements to handle closing your files, rather than manually trying to close them. Your current code doesn't actually close the files correctly (you're missing the parentheses after .close in each case which are needed to make it a function call).

    If you use a with statement instead, the files will be closed automatically at the end of the block (even if there is an exception):

    with open("mouseDNA.txt", "r") as Mdna:
        Mdnalin = Mdna.readline()
    
    print(Mdnalin)
    
    with open("humanDNA.txt", "r") as Hdna:
        Hdnalin = Hdna.readline()
    
    print(Hdnalin)
    
    with open("unknownDNA.txt", "r") as Udna:
        Udnalin = Udna.readline()
    
    print(Udnalin)