Remiel Jester Arcay Remiel Jester Arcay - 2 months ago 9
Python Question

How do I split this into maybe 2 or 3 functions?

I was just wondering how do I split this into different functions say like maybe 2 or 3 functions? I'm not that good with passing parameters with functions yet. Would you recommend doing that or should I keep it the way it is in one function since it's a while loop? By the way it's for a beginner programming class so that's why its pretty long.

def sumOfDoublePlace(userChoice):
lenChecker = len(str(userChoice))
counter = 0
sumNumber = 0
userChoice = int(userChoice)
while counter < lenChecker-1:
counter += 1
endDigit, userChoice = divmod(userChoice, 10)

if counter % 2 == 0:
evenNumber = endDigit * 2

if evenNumber < 10:
sumNumber = sumNumber + evenNumber

else:
oddDigit = endDigit % 10
firstDigit = endDigit // 10
oddSum = oddDigit + firstDigit
sumNumber = sumNumber + oddSum
else:
sumNumber = sumNumber + endDigit

if sumNumber % 10 == 0:
print('This card is valid')
else:
print('This card is invalid')

Answer

Overall, I think this should be a single routine. However, you are taking a somewhat tortuous path to the solution. You're doing a lot of work to pull digits out of the integer version of the card number, when they're perfectly accessible in the original text.

Here's a start on accessing the string positions you need:

def isValidCardNumber(cardNumber):
    num_len = len(cardNumber)
    last  = int(cardNumber[-1])  # grab the last digit; convert to integer
    odds  = cardNumber[0:-1:2]   # positions 0, 2, 4, ... last-1
    evens = cardNumber[1:-1:2]   # positions 1, 3, 5, ... last-1

    # For each list of digits, make a list of their integer equivalents.
    #     ... and immediately take the sum of those integers.
    odd_sum  = sum([int(digit) for digit in odds])
    even_sum = sum([int(digit) for digit in evens])

I leave the rest of this to you. :-)