Python 仅在满足if条件后运行for循环
我目前正在尝试制作一个非常简单的测试函数,首先检查用户输入是否是3的倍数,然后测试每个字符,看看它们是否是有效字符。下面是我的代码:Python 仅在满足if条件后运行for循环,python,function,python-3.x,if-statement,for-loop,Python,Function,Python 3.x,If Statement,For Loop,我目前正在尝试制作一个非常简单的测试函数,首先检查用户输入是否是3的倍数,然后测试每个字符,看看它们是否是有效字符。下面是我的代码: def is_dna(string): string.upper() if(len(string) % 3 == 0): print("LENGTH CORRECT") for n in string: if(n == "A" or n == "T" or n == "C" or n ==
def is_dna(string):
string.upper()
if(len(string) % 3 == 0):
print("LENGTH CORRECT")
for n in string:
if(n == "A" or n == "T" or n == "C" or n == "G"):
print("Valid")
else:
print("Invalid character")
break
return True
else:
print("Too many/little characters")
return False
运行时,底部部分将正常运行,如果使用了正确数量的字符,这也将成功打印调试“长度正确”字符串。问题是for循环不会初始化,我不知道为什么。仅测试循环就表明它工作良好;此功能有什么问题?简单修复
只需将字符串.upper()移到变量中,然后对该变量执行操作
固定的代码
def is_dna(stri):
string = stri.upper()
if(len(string) % 3 == 0):
print("LENGTH CORRECT")
for n in string:
if(n == "A" or n == "T" or n == "C" or n == "G"):
print("Valid")
else:
print("Invalid character")
break
return True
else:
print("Too many/little characters")
return False
is_dna("ATCGCTATC") #this works and tests it perfectly
函数upper()只返回字符的大写,字符串本身不会改变。您不需要循环,只需使用正则表达式:
import re
def is_dna(string)
return re.match("([CAGT]{3})+", string.upper()) is not None
string.upper()
不会更改字符串。将返回一个包含已转换字符的新字符串。循环初始化很好,但不管结果如何,您仍然会返回True
。谢谢Martijn,您已经发现了问题。上弦是这里的主要故障。非常感谢。FWIW,您可以使用set操作更有效地验证字母,例如{'A','T','C','G'}.issuperset(string.upper())
。您说的“不初始化”是什么意思,甚至不打印“无效字符”?如果您想检查字符串内容的有效性,我建议使用正则表达式,比如:re.match([ATCG]{3}),string)
添加到这一点上,如果将来有人遇到此问题,请在循环中断部分放置一个“return False”,否则不管怎样,您都将返回True。谢谢你的回答,这是错误!此外,即使打印了“无效字符”,此代码仍返回True
。@FragilePixel为什么要is\u dna
测试返回True
,如果它的长度正确,即使字符串包含无效字符?这对我来说似乎很奇怪。使用不是无而不是!=无
。
import re
def is_dna(string)
return re.match("([CAGT]{3})+", string.upper()) is not None