Цикл 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'))

Почему итеративный подход более элегантен, спросите вы. Несколько простых причин:

  • Это работает с любой последовательностью, даже той, которая не индексируется.
  • Вам не нужно заранее вычислять длину последовательности, поэтому может потребоваться сначала загрузить ее в память.
  • Вы можете использовать это с последовательностью, длина которой бесконечна (тогда этот конкретный алгоритм будет бесконечно циклически повторяться) или с длиной, которая неизвестна (подумайте о вводе пользователем).
Другие вопросы по тегам