Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅在满足if条件后运行for循环_Python_Function_Python 3.x_If Statement_For Loop - Fatal编程技术网

Python 仅在满足if条件后运行for循环

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 ==

我目前正在尝试制作一个非常简单的测试函数,首先检查用户输入是否是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 == "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