'while' 将字符转换为 ASCII 码的循环(中级)
'while' loop with characters converted to ASCII code (intermediate level)
我正在研究必须将 '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'))
您不需要使用 split
。您可以直接使用字符索引索引到字符串中。
将 for
重写为 while
的直接方法如下所示:
char_index = 0
while char_index < len(string):
char = string[char_index]
...
char_index += 1
(...
部分可以与 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'))
您可能会问,为什么迭代器方法更优雅。几个简单的原因:
- 这适用于任何序列,即使是不可索引的序列。
- 您不必提前计算序列的长度,为什么可能需要先将其加载到内存中。
- 您可以将其用于长度为无限的序列(此特定算法将无限循环)或长度未知的序列(考虑用户输入)。
我正在研究必须将 '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'))
您不需要使用 split
。您可以直接使用字符索引索引到字符串中。
将 for
重写为 while
的直接方法如下所示:
char_index = 0
while char_index < len(string):
char = string[char_index]
...
char_index += 1
(...
部分可以与 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'))
您可能会问,为什么迭代器方法更优雅。几个简单的原因:
- 这适用于任何序列,即使是不可索引的序列。
- 您不必提前计算序列的长度,为什么可能需要先将其加载到内存中。
- 您可以将其用于长度为无限的序列(此特定算法将无限循环)或长度未知的序列(考虑用户输入)。