Цикл while с символами, преобразованными в код ASCII (промежуточный уровень)
Я работаю над примерами, в которых мне нужно преобразовать циклы for в циклы while, и это меня озадачило. Проблема для меня заключается в том, что циклы for идеально подходят для итерации по каждому символу в строке, а затем этот символ может быть легко приведен к типу 'ord', чтобы получить его код ASCII. Но преобразование этого в цикл while вызывает у меня проблемы, когда я пытаюсь получить часть ord. Я пытался с помощью split() и пытался найти каждую букву с помощью индекса, но пока это не работает.
Обратите внимание, что сам код является просто мусорным кодом, который не производит ничего полезного - он предназначен только для практики циклов while. Спасибо!
Поставляемая проблема для преобразования в цикл while:
def convert(string):
"""take string and return an int that is the unicode version"""
num = 0
for char in string:
if ord(char) > 20:
num = ord(char) - 10
else:
num = ord(char) * 2
return num
print(convert('Test this string'))
Моя попытка версии цикла while:
def convert(string):
"""take string and return an int that is the unicode version"""
char_value = string.split()
num = 0
char_index = 0
while char_index < len(string):
if ord(char_value[char_index]) > 20:
num = char_value - 10
else:
num = char_value * 2
char_index += 1
return num
print(convert('Test this string'))
РЕДАКТИРОВАТЬ: вот рабочее решение, адаптированное после предложения NPE (на случай, если новички захотят увидеть полное решение):
def convert(string):
"""take string and return an int that is the unicode version"""
num = 0
char_index = 0
while char_index < len(string):
char = string[char_index]
if ord(char) > 20:
num = ord(char) - 10
else:
num = ord(char) * 2
char_index += 1
return num
print(convert('Test this string'))
2 ответа
Вам не нужно использовать split
, Вы можете индексировать в строку непосредственно с помощью символьного индекса.
Простой способ переписать for
как while
показано ниже:
char_index = 0
while char_index < len(string):
char = string[char_index]
...
char_index += 1
(The ...
часть может быть в точности как тело for
цикл.)
Я бы предложил более элегантный и даже более эквивалентный способ написания этого цикла:
def convert(string):
"""take string and return an int that is for sure not any kind of Unicode version, whatever that's supposed to be"""
it = iter(string)
while True:
char = next(it, None)
if char is None:
break
if ord(char) > 20:
num = ord(char) - 10
else:
num = ord(char) * 2
return num
print(convert('Test this string'))
Почему итеративный подход более элегантен, спросите вы. Несколько простых причин:
- Это работает с любой последовательностью, даже той, которая не индексируется.
- Вам не нужно заранее вычислять длину последовательности, поэтому может потребоваться сначала загрузить ее в память.
- Вы можете использовать это с последовательностью, длина которой бесконечна (тогда этот конкретный алгоритм будет бесконечно циклически повторяться) или с длиной, которая неизвестна (подумайте о вводе пользователем).