Определить функцию с помощью переменной? - PullRequest
2 голосов
/ 27 октября 2011

Я пытаюсь определить функцию, которая будет включать переменную 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

Вот актуальный вопрос:

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

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

Ответы [ 6 ]

4 голосов
/ 27 октября 2011

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

def is_true(n):

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

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

is_true("3884892993")

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

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

Я не уверен, какой у вас вопрос, но если вы пытаетесь:

  • правильно определить функцию:
    • обратите внимание на отступ (это требуется 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).

EDIT (для правильного оформления кода):

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

0 голосов
/ 27 октября 2011

Вот реализация алгоритма Луна, которую мне пришлось сделать недавно.

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
0 голосов
/ 27 октября 2011

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

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
0 голосов
/ 27 октября 2011

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

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

def is_true(n):
    # do something

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

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

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

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

...