#python #if-statement #while-loop #iteration
#python #if-оператор #цикл while #итерация
Вопрос:
Чтобы найти две последовательные цифры (D) в заданном целом числе (N) без использования каких-либо встроенных функций и возврата True или False, следующий код, похоже, завершается при нахождении одного D, однако он работает, если есть два Ds. Почему это не работает так, как есть, и как это исправить? Спасибо!
def double_digits(n, d):
"""Return True if N has two Ds in a row otherwise return False.
int, int -> Boolean
>>> double_digits(91019, 1)
False
>>> double_digits(88, 8)
True
>>> double_digits(2772, 7)
True
>>> double_digits(88108, 0)
False
>>> double_digits(12345, 4)
False
>>> double_digits(81811081, 1)
True
"""
while n > 0:
remainder = n % 10
n = n // 10
if remainder == d:
if n % 10 == d:
return True
else:
remainder, n = n % 10, n // 10
return False
Комментарии:
1. Ваш
while
цикл всегда возвращается на первой итерации. Вероятно, это не то, что вам нужно для этого.2. Вероятно, в финале
return False
слишком большой отступ, хотя я еще не полностью проверил логику.3. Что именно вы считаете «встроенной функцией» и почему существует такое произвольное ограничение? Это может быть решено вообще без математики, просто простым
for
циклом, который запоминает предыдущую итерацию. FWIW, не слишком уверен в%
, но==
//
и ‘>’ также запускают «встроенную функцию»4. @DeepSpace Как вы получаете каждую цифру значения int без какой-либо математики?
5. @Code-Ученик,
for digit in str(n):
затем также преобразуйтеd
вstr
Ответ №1:
Последний оператор return должен быть вне цикла. Ниже приведен правильный код:
def double_digits(n, d):
while n > 0:
remainder = n % 10
n = n // 10
if remainder == d:
if n % 10 == d:
return True
else:
remainder, n = n % 10, n // 10
return False
Комментарии:
1. 1. Правильно и исправлено. 2. предложение else сокращает итерации. Попробуйте на pythontutor.com/visualize.html с double_digits(91019, 1)
2. Да, просто исправил мой ответ, пропустил ту часть, которая гарантирует, что другой символ не является d, который вы отбрасываете при проверке.
Ответ №2:
Вы должны сделать отступ в последнем операторе : вернуть False, 4 пробела слева. Это должно вам помочь.
В качестве альтернативы вы можете преобразовать входные данные в строку, и тогда сопоставление символов будет простым.
def double_digits(n: int, d: int)->bool:
n = str(n)
d = str(d)
i = 0
while i < len(n)-1:
if n[i] == d and n[i 1] == d:
return True
i =1
return False
Здесь я использовал некоторые встроенные функции, такие как len
и str
, но если вы явно
хотите избежать их использования, просто придерживайтесь своего оригинального подхода и просто сделайте отступ в инструкции return один раз
Комментарии:
1. Вы слишком сильно уменьшили отступ, его больше нет в функции.
2.
len(n-1)
должно бытьlen(n) - 1
, Python используетand
(неamp;amp;
), и будет бесконечный цикл, посколькуi
всегда остается 03. Вот и все. Неправильный отступ. Спасибо!