我试图编写一个函数来检查给定的字符串是否为二进制。我使用while循环逐个浏览字符串中的字符。如果所有这些都是0或1,它将返回True,如果没有 - 打破循环并返回False。 我刚刚编写了这一小部分代码,但它并没有运行。为什么呢?
def fnIsBin(string):
count = 0
while count < len(string):
character = string[count]
if character == '0' or character == '1':
print (count, character[count], "OK")
count = count+1
continue
else:
print (count, character[count], "ERROR")
return False
break
编辑:
我也尝试过使用&#39; set&#39;避免循环迭代,但我不知道如何设置(字符串)&#34;工作。我得到错误,我不能将其视为列表。那么如何将元素与0&amp; 1?
def fnIsBin(string):
charactersList = set(string)
if len(charactersList) > 2:
return False
else:
if (charactersList[0] == '0' or charactersList[0] == '1') and (charactersList[1] == '0' or charactersList[1] == '1'): #there i made error, how to deal with it?
return True
else:
return False
答案 0 :(得分:3)
您的功能失败,因为您实际上从未返回True
。这意味着如果字符串实际上是二进制的,那么在任何布尔检查中,你都会返回None
,Python认为它是False
。
只需在功能的末尾添加return True
。
正如@Barmar在评论中提到的那样,您还会打印character[count]
而不是string[count]
的值,这会导致IndexError
。
检查字符串是否为二进制的更简单方法是:
test_string = '010101'
all_binary = all(c in '01' for c in test_string)
答案 1 :(得分:1)
您可以使用int
对象并为其提供基础。如果传递的对象不包含二进制表示,它将失败。回想一下,二进制字符串是基数2。
def fnIsBin(string):
try:
binary_repr = int(string, 2)
except ValueError as err
print("error: {0}".format(err))
return False
return True
答案 2 :(得分:0)
这是你可以重写函数和维护类似结构的方法之一(循环遍历每个字符):
def fnIsBin(string):
for character in string:
if not character in '01':
return False
return True
您也可以使用正则表达式:
import re
def fnIsBin(string):
return re.match(r'^[10]+$', '01') is not None
答案 3 :(得分:0)
您为OK
或0
的每个字符打印1
,即使后来的字符可能不存在。你需要等到循环结束才能知道它真的没问题。
def fnIsBin(string):
for character in string:
if character != '0' and character != '1':
print (character, "ERROR")
return False
print "OK"
return True
在break
之后不需要return False
- 从函数返回会自动退出循环。
答案 4 :(得分:0)
有很多方法可以做到这一点:
集:
fnInBin(s):
return set(s).issubset({'0', '1'}) and bool(s)
正则表达式:
fnInBin(s):
return bool(re.fullmatch('[01]+', s))
整数转换:
fnIsBin(s):
try:
int(s, 2)
return True
except ValueError:
return False
但是最后一个会从输入中删除空格。
fnIsBin('\n 1 ') == True