#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