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