Python2.7每次通过循环返回值

2024-05-21 03:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是为nmap指定一个要扫描的IP地址范围,比如说(192.168.0.0-50),对于它扫描的每个IP,我需要在不同的函数中使用输出。你知道吗

下面是我正在做的一些代码:

def revLookup(ips):
    revCmd = "nmap -R -sP " + ips
    revargs = shlex.split(revCmd)
    revOut = subprocess.Popen(revargs, shell=False, stdout=subprocess.PIPE)
    for rline in revOut.stdout:
        if "Nmap scan report for " in rline:
            nmapNmIp = rline.strip("Nmap scan report for")
            rname, rip = nmapNmIp.split(" ")[0], nmapNmIp.split(" ")[-1]
            if rname.strip() == rip.strip():
                rname = "NO Name Provided"
            revNmapName = rname.split('.', 1)[0]
            rip = re.sub('[\(\)]', '', rip.strip())
        elif "MAC Address: " in rline:
            rnmapmac = rline.split(': ', 1)[-1]
            rnmapmac = rnmapmac.split(" ")[0]

    return revNmapName, rip, rnmapmac

返回的值只是列表中的最后一个值。 我还有其他函数使用各种值来创建其他信息,但我需要逐个生成这些信息。如果我创建一个长而混乱的函数,我知道这不是正确的方法。你知道吗

谢谢你的建议。你知道吗


Tags: 函数infornmapsplitstripripips
2条回答

在循环中的每次之后“return”的答案是yield,但是让函数使用单个ip并在ip上迭代可能更好:

def my_function(ip):
    new_data = dosomething
    return new_data

for ip in ips:
    result = my_function(ip)

另外,对于使用Nmap,您应该研究python Nmap,它非常好。你知道吗

使用yield而不是return并将其移动到循环中,如下所示:

for rline in revOut.stdout:
    if "Nmap scan report for " in rline:
        ...
    elif "MAC Address: " in rline:
        ...
    yield revNmapName, rip, rnmapmac

稍后,您可以在for循环中使用创建的生成器(返回yield的函数就是其中之一),例如:

for rev, rip, rnmap in revLookup(ips):
    print rev, rip, rnmap

你可以看看这个问题的一个很好的答案What does the "yield" keyword do in Python?

编辑:添加了方法的用法

相关问题 更多 >