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

#python #string #integer #digits

#python #строка #целое число #цифры

Вопрос:

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

Комментарии:

1. Ну, я просто подумал, что было бы проще использовать инструмент обрезки, чем вставить его сюда и убедиться, что он передает правильный отступ (что, вероятно, в любом случае неправильно). Вот насколько я новичок. Кроме того, он должен был быть PNG, извините за это.

2. Не могли бы вы, пожалуйста, распечатать JPEG вашего кода, поместить его на деревянный стол и сфотографировать его?

3. @ Adam Rosenfield Я предполагаю, что это был сарказм, ха-ха, я вставил необработанный код.

4. @Adam Спасибо за хороший смех. Джордж: да, это был сарказм 😉 Но это было очень дружелюбно. «Нам» (имеется в виду со-эс) нужен исходный код, чтобы мы могли копировать / вставлять / запускать ваш код. На ваш вопрос будет получено гораздо больше (полезных) ответов, если вы опубликуете что-то, что мы можем запустить таким образом. Добро пожаловать в S.O.

5. @George: Да, это была шутка; Я подумал, что это могло бы пройти через головы людей без ссылки.

Ответ №1:

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

 def is_true(n):
 

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

Для вызова функции с определенным значением необходимо:

 is_true("3884892993")
 

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

Комментарии:

1. Привет, если функция вызывается для определенного значения, распознает ли она использование n в качестве определенного значения, а затем выполняет остальную часть функции?

2. Да, n будет содержать значение, которое вы передаете в своем вызове is_true(«3884892993»).

Ответ №2:

Я не уверен, в чем заключается ваш вопрос, но если вы пытаетесь:

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

Комментарии:

1. Привет, по сути, я просто хотел, чтобы функция считывала любую строку, заменяющую «n», а затем выполняла с ней операции.

2. @GeorgeBurrows: Хорошо, я только что обновил свой ответ, поэтому он, вероятно, лучше отвечает на ваши вопросы.

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

4. @GeorgeBurrows: Конечно, ты можешь. Я хочу сказать, что вы не должны ожидать, что переменная, которую вы передаете функции, будет изменена после вызова функции. Вы также не должны думать '3' / 1 , что это то же 3 / 1 самое, что и (и вы обычно не можете выполнить над строкой действие, которое вы могли бы выполнить над целым числом). Достаточно ли это понятно?

Ответ №3:

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

 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
 

Комментарии:

1. К сожалению, мне не разрешено откровенно заниматься плагиатом, нужно написать что-то оригинальное, чего очень много для кого-то, у кого всего 3 недели опыта 🙁

Ответ №4:

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

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

 def is_true(n):
    # do something
 

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

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

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

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

Комментарии:

1. Функция предназначена для приема входной строки, состоящей из 11 чисел, затем с этими числами возьмите чередующиеся числа, начиная с предпоследней цифры и работая в обратном направлении, удвойте эти цифры, а затем суммируйте цифры, например, если у вас было 18 и 3, вы бы сделали 1 8 3 . Затем добавьте эту сумму к сумме оставшихся цифр, которые не были удвоены, затем определите, кратно ли оно 10, если оно равно print true, а если нет, то выведите false . Я не уверен, насколько сложным это было бы для эксперта, но для меня, только начавшего изучать python 3 недели назад, это невозможно.

2. Извините, во второй строке должно быть указано «чередующиеся цифры»

3. Также я понятия не имею, почему я включил туда «возврат», спасибо за замечание.

Ответ №5:

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

 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
 

Ответ №6:

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

 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