Цикл while с символами, преобразованными в код ASCII (промежуточный уровень) - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю над примерами, в которых мне нужно преобразовать циклы 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 ]

0 голосов
/ 08 сентября 2018

Я бы предложил более элегантный и даже более эквивалентный способ написания этого цикла:

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'))

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

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

Вам не нужно использовать split.Вы можете индексировать в строку непосредственно с помощью символьного индекса.

Простой способ переписать for как while показан ниже:

    char_index = 0
    while char_index < len(string):
        char = string[char_index]
        ...
        char_index += 1    

(...часть может быть в точности как тело цикла for.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...