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

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

Вот собственно вопрос:

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

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


person George Burrows    schedule 26.10.2011    source источник
comment
Ну, я просто подумал, что будет проще использовать инструмент для обрезки, чем вставлять его сюда и следить за тем, чтобы он располагал правильным отступом (что, вероятно, в любом случае неправильно). Вот какой я новичок. Также это должно было быть PNG, извините за это.   -  person George Burrows    schedule 27.10.2011
comment
Не могли бы вы распечатать свой код в формате JPEG, положить его на деревянный стол и взять фото его?   -  person Adam Rosenfield    schedule 27.10.2011
comment
@ Адам Розенфилд Я предполагаю, что это был сарказм, ха-ха, я выложил необработанный код.   -  person George Burrows    schedule 27.10.2011
comment
@ Адам Спасибо за хороший смех. Джордж: да, это был сарказм ;) Но это было очень дружелюбно. Нам (имеется в виду SO-специалисты) нужен необработанный код, чтобы мы могли копировать/вставлять/запускать ваш код. Ваш вопрос получит гораздо больше (полезных) ответов, если вы опубликуете что-то, что мы можем запустить таким образом. Добро пожаловать в С.О.   -  person Chris Pfohl    schedule 27.10.2011
comment
@George: Да, это была шутка; Я полагал, что без ссылки это могло пройти через головы людей.   -  person Adam Rosenfield    schedule 27.10.2011
comment
Ну, по крайней мере, теперь вы знаете, как мало я знаю о программировании, я терпел неудачу в этом уже 3 недели, ха-ха.   -  person George Burrows    schedule 27.10.2011
comment
Вы работали через хороший учебник? Обычно я не рекомендую погружаться в Python ( diveintopython.nfshost.com/toc/index.html ) для новичков в программировании, но из вашего предыдущего вопроса кажется, что вы знаете о многих важных вещах и просто не поняли, как их собрать.   -  person Russell Borogove    schedule 27.10.2011


Ответы (6)


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

  • correctly define the function:
    • pay attention to the indentation (this is required by 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, и вы должны следовать этому (в какой-то момент вы должны это оценить).

person Tadeck    schedule 26.10.2011
comment
Привет, в основном я просто хотел, чтобы функция читала любую строку, заменяющую n, а затем выполняла над ней операции. - person George Burrows; 27.10.2011
comment
@GeorgeBurrows: Хорошо, я только что обновил свой ответ, так что, вероятно, он лучше отвечает на ваши вопросы. - person Tadeck; 27.10.2011
comment
Привет, так что, по сути, я не могу проверить код строкой? Если это так, то это немного раздражает, так как теперь мне будет практически невозможно обнаружить проблемы, ха-ха, спасибо за помощь. - person George Burrows; 27.10.2011
comment
@GeorgeBurrows: Конечно, можешь. Я имею в виду, что вы не должны ожидать, что переменная, которую вы передаете функции, будет изменена после вызова функции. Вы также не должны думать, что '3' / 1 совпадает с 3 / 1 (и обычно вы не можете выполнять над строкой действие, которое вы могли бы выполнить над целым числом). Это достаточно ясно? - person Tadeck; 27.10.2011

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

def is_true(n):

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

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

is_true("3884892993")

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

person Dave Costa    schedule 26.10.2011
comment
Привет, если вызвать функцию для конкретного значения, распознает ли она использование n в качестве конкретного значения, а затем выполнит остальную часть функции? - person George Burrows; 27.10.2011
comment
Да, n будет содержать значение, которое вы передаете в своем вызове is_true(3884892993). - person Wieland; 27.10.2011

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

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
person Kirk Strauser    schedule 26.10.2011
comment
К сожалению, мне не разрешено заниматься вопиющим плагиатом, мне нужно написать что-то оригинальное, а это слишком много для человека, у которого всего 3 недели опыта :( - person George Burrows; 27.10.2011

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

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

def is_true(n):
    # do something

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

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

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

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

person freakish    schedule 26.10.2011
comment
Функция предназначена для приема входной строки, состоящей из 11 чисел, затем с этими числами берут чередующиеся числа, начиная с предпоследней цифры и работая в обратном порядке, удваивают эти цифры, а затем суммируют цифры, например. если бы у вас было 18 и 3, вы бы сделали 1 + 8 + 3. Затем добавьте эту сумму к сумме оставшихся цифр, которые не были удвоены, затем определите, кратно ли оно 10, если оно напечатайте верно и если не тогда печатать ложь. Я не уверен, насколько сложно это будет сделать для эксперта, но для меня, начавшего изучать Python всего 3 недели назад, это невозможно. - person George Burrows; 27.10.2011
comment
Извините, во второй строке должно быть написано «чередующиеся цифры». - person George Burrows; 27.10.2011
comment
Также я понятия не имею, почему я включил туда «возврат», спасибо за место. - person George Burrows; 27.10.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
person Valentin Briukhanov    schedule 26.10.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
person All Workers Are Essential    schedule 27.10.2011