“ while”循环,字符转换为ASCII代码(中级)

时间:2018-09-08 04:15:30

标签: python while-loop ord

我正在研究一些示例,在这些示例中,我必须将“ for”循环转换为“ while”循环,而这让我感到困惑。对我来说,问题是“ for”循环经过精心设计,可以迭代字符串中的每个字符,然后可以将该字符轻松转换为“ ord”以获取其ASCII码。但是,当我尝试检索此“ ord”部分时,将其转换为“ while”循环会给我一些问题。我已经尝试过使用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 :(得分:2)

您不需要使用split。您可以直接使用字符索引来索引字符串。

for重写为while的简单方法如下所示:

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

...部分可以与for循环的主体完全一样。)

答案 1 :(得分:1)

我会提出一种更优雅,甚至更等效的方式来编写该循环:

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

您可能会问,为什么迭代器方法更优雅。一些简单的原因:

  • 这适用于任何序列,甚至是无法索引的序列。
  • 您不必事先计算序列的长度,为什么可能需要先将其加载到内存中。
  • 您可以将其用于长度为无限的序列(此特定算法将无限循环),或者长度未知的序列(请考虑用户输入)。