Определить функцию с помощью переменной?


Я пытаюсь определить функцию, которая будет включать переменную n, где n будет строкой чисел, например "3884892993", определение функции начинается как is_true(n), однако если n будет строкой, то она должна быть is_true(n), а затем, как только строка определена, я могу проверить функцию с помощью примера строки, такой как n = "3884892993". Однако я получаю синтаксическую ошибку, когда использую is_true(n). И мне просто интересно, как бы я проверил эту функцию с помощью примера строки для n.

Весь мой функция для определения показана здесь: http://oi44.tinypic.com/282i3qo.jpg но имейте в виду, что я абсолютный новичок, поэтому, скорее всего, будет много ошибок, но я был бы признателен за помощь некоторых экспертов, если это вообще возможно :)

def is_valid("n"): #n is the number to be checked.
    number = 
    [int(y) for y in A] #converts the string into a list of useable digits.
    altern1 = integer[-2::-2] #sets altern1 as one set of alternating digits.
    double = [x*2 for x in altern1] #doubles each element of the list altern1.
    sum1 = sum(double) # adds together all the doubled items of the list.
    altern2 = integer[-1::-2] #sets altern2 as the other set of alternating digits.
    return sum2 = sum(altern2)#sums the other set of alternating digits.
    sumtotal = sum1 + sum2 #works out the total sum to be worked with.
    for mod = sumtotal % 10: #works out remainder when sumtotal is divided by 10
        if mod == 0 : #if remainder is zero sumtotal is a multiple of 10
            print 'True' #sumtotal is a multiple of 10 therefore n is a credit card number
        else:
            print 'False' #sumtotal is NOT a multiple of 10 therefore not a valid credit card number

Вот фактический вопрос:

Алгоритм проверки числа выглядит следующим образом: а) начиная с предпоследней цифры и продвигаясь к первой цифре, удваивайте каждую переменную цифру. (б) сумма удвоенных цифр, рассматривая 13 Как 1+3 и т. д., и добавьте результат к сумме неоформленных десятичные знаки (в) если сумма делится на 10, то это действительный номер кредитной карты.

Напишите и протестируйте функцию is_valid (), которая принимает в качестве аргумента номер кредитной карты в виде строки (например, допустимо ("49927398716")) и возвращает True или False в зависимости от того, является ли число a действительный номер кредитной карты.

6 2

6 ответов:

Я не уверен, что это ваш вопрос, но если вы пытаетесь:

  • правильно определите функцию:
    • обратите внимание на отступ (это требуется Python!),
    • смотритездесь примеры определений функций,
  • Преобразовать строковую переменную в целое число можно следующим образом:

    new_var = int(old_var)

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

  • Считайте значение переменной, основываясь на ее имени:

    my_var = vars().get('variable_name')

    (где variable_name - имя переменной, и при необходимости вы можете указать контекст в скобках после vars - Подробнее см. help(vars))

Решило ли что-нибудь из вышеперечисленного вашу проблему?

Правка (на основе уточнения):

Это должно решить вашу проблему:

def is_true(my_variable):
    # Here the variable named "my_variable" is accessible

Если вы хотите сделать что-то "на месте" на переданной переменной, у меня есть плохая новость: строки и целые числа неизменяемы в Python, поэтому вы не можете просто изменить их-вы, вероятно, должны вернуть их в результате функции (есть по крайней мере два обходных пути, но я не рекомендую их, если вы новичок в Python).

Редактировать (для правильного стиля кода):

Вам, вероятно, следует прочитать PEP 8 , чтобы ознакомиться с тем, что является стандартом кодирования для Python скрипты-это обычно используется в сообществе Python, и вы должны следовать этому (в какой-то момент Вы должны оценить это).

Кавычки используются только для строковых литералов, вы не заключаете имя переменной или параметра в кавычки, чтобы указать, что это будет строка. Определение функции будет выглядеть следующим образом:

def is_true(n):

И затем в теле функции вы используете n для ссылки на значение, которое передается вызывающим объектом.

Чтобы вызвать функцию по определенному значению, выполните следующие действия:

is_true("3884892993")

Побочное предложение: подумайте о более понятных именах для ваших функций и переменных. Например, это похоже, что ваша функция может быть разумно названа is_valid_card_number.

Из статьи Википедии об алгоритме Луна :

def is_luhn_valid(cc):
    num = map(int, str(cc))
    return sum(num[::-2] + [sum(divmod(d * 2, 10)) for d in num[-2::-2]]) % 10 == 0

Я понятия не имею, что должна делать ваша функция, но вот некоторые замечания.

Прежде всего, если вы определяете функцию, то вы используете следующий синтаксис

def is_true(n):
    # do something

Вы можете вызвать эту функцию следующим образом is_true("3884892993"), то есть вы можете передать строку как n. Теперь ваша функция должна рассматривать переменную n как строку. Так что вы можете использовать

number = [int(d) for d in n]

, что приведет к преобразованию строки в список цифр.

Еще одно замечание: вы использовали оператор return внутри вашего is_true функция. Этот оператор остановит выполнение функции и вернет значение. Каждый код ниже return никогда не будет выполнен.

Может быть так. Я оставляю ваши комментарии

def is_valid(n): #n is the number to be checked.
    numbers = [int(y) for y in n] #converts the string into a list of useable digits.
    double_alt = [sum([int(i) for i in str(x*2)]) for x in numbers[-2::-2]]   #doubles      and sum if more than 10each element of the list altern1.
    sum1 = sum(double_alt) # adds together all the doubled items of the list.
    sum2 = sum(numbers[-1::-2]) #sums the other set of alternating digits.
    sumtotal = sum1 + sum2 #works out the total sum to be worked with.
    return not sumtotal % 10

Вот реализация алгоритма LUN, который я должен был сделать недавно.

def is_valid_luhn(cc):
    return not sum([sum(divmod(int(d) * 2, 10)) for d in cc[-2::-2]] + [int(d) for d in cc[-1::-2]]) % 10
    #                          | double |       |--- every -2th --|            |--- every -1th --|
    #                          |--------- step 1 -----------------|
    #              |------------- sum doubled digits --------------|   |-- sum undoubled digits --|
    #          |---------------------- step 2: sum doubled/undoubled digits -----------------------|
    #      |-------------------------- step 3: sum % 10 == 0 --> not sum % 10 --------------------------|

Или, если вы хотите более подробную версию:

def is_valid_luhn(cc):
    total = 0
    # Double and sum every 2nd digit starting at -2.
    for d in cc[-2::-2]:
        # divmod(d*2, 10) returns (d*2 // 10, d*2 % 10)
        # sum(divmod) return (d*2 // 10) + (d*2 % 10)
        total += sum(divmod(int(d) * 2, 10))
    # Sum every 2nd digit starting at -1.
    for d in cc[-1::-2]:
        total += int(d)
    # Check module 10 of total: total % 10 == 0 --> not total % 10
    return not total % 10