#python
Вопрос:
Я практиковался в кодировании и нашел это упражнение в Интернете:
Введите строку s и целое число n в двух строках соответственно и определите функцию для перемещения строки s вправо на n битов и влево, когда n-отрицательное число.
Если s-пустая строка «, выведите » независимо от n.
Ввод образца:
s ='123456' n=3
Пример вывода:
Output result: 456123
Я делал это до сих пор:
def shiftall(s, n, left, right): while left lt;= right: if s[left] lt; 0 and s[right] lt; 0: left = n elif s[left] gt; 0 and s[right] lt; 0: s[left], s[right] = s[right], s[left] left = n right -= n elif s[left] gt; 0 and s[right] gt; 0: right -= n else: left = n right -= n def display(s): for i in range(len(s)): print(s[i], end=" ") print() if __name__ == "__main__": s = str(input('s=')) n = int(input('n=')) shiftall(s, 0, n - 1) display(s)
Но получаю ошибку и не могу с ней справиться:
Traceback (most recent call last): File "C:UsersUserPycharmProjectspythonProjectmain.py", line 31, in lt;modulegt; shiftall(s, 0, n - 1) TypeError: shiftall() missing 1 required positional argument: 'right'
Есть какие-нибудь предложения? ОТРЕДАКТИРОВАННЫЙ ВЫВОД ОШИБОК*
Комментарии:
1. Воспользуйся
__name__
.2. это
if __name__ == "__main__":
3. Просто предложение, другой подход к этому таков:
s = "123456" n = 3 n = n % len(s) while n: s = s[-1] s[:-1] n -= 1 print(s)
4. Вы можете добиться сдвига более лаконично, используя нарезку:
s[-n:] s[:-n]
это ваша сдвинутая строка.5. Просто уточняю, вы не сдвигаете строку по битам , а просто меняете положение символа в строке. Каждый символ в строке ASCII равен 7 битам.
Ответ №1:
Это и есть __name__
, и нет name
Также вы можете сделать :
s = s[n:] s[:n]
чтобы переместить строку.
Комментарии:
1. Извините, что я включил неправильную ошибку, теперь вы можете проверить это нормально
Ответ №2:
if name == "__main__":
должно быть if __name__ == "__main__":
__name__
это специальная встроенная переменная python,соответствующая имени текущего модуля.
ИЗМЕНИТЬ: Новая ошибка:
shiftall(s, 0, n - 1)
предоставляется только 3 аргумента:
- s
- 0, и
- n-1
Ты забыл последний аргумент или ты имел в виду shiftall(s, 0, n, 1)
?
Похоже, что вы указываете n как 0, а вместо этого указываете его как значение «правильно»
Комментарии:
1. извините, что я включил неправильную ошибку, теперь вы можете проверить точную ошибку
2. @GreatDreamer обновлен ответ
Ответ №3:
Что именно является параметром left
и right
для чего? Вся информация содержится в номере n
. Кроме того, строки являются неизменяемыми, поэтому вы не можете назначать строковые индексы, такие как s[foo] = "b"
. Вам придется вернуть новую строку из вашей функции:
def shiftall(s, n): n %= len(s) # make sure you are within the bounds of s return s[n:] s[:n]
Затем вы можете переназначить свой s
результат с помощью функции:
s = "123456" n = 3 s = shiftall(s, n) print(s) # 456123