第一个函数的第二个返回值打印两次

时间:2018-07-17 12:51:42

标签: python function return

我试图简单地打印出我附加到它们各自列表中的值(端口)。我用TCP和UDP分开。我要传递给_does_port_dict_have_type的字典看起来像这样{'22': 'TCP', '53': 'UDP', '31337': 'TCP', '80': 'TCP', '515': 'UDP'}

这是我的代码

x = _expected_ports_type_to_dict(ET.parse('scanme.nmap.org.xml'))


TCP_LIST = []
UDP_LIST = []


def _does_port_dict_have_type(port_dict):
    for port, typee in port_dict.iteritems():
         if (typee is not None) and len(typee) > 0:
             if typee == "TCP":
                 TCP_LIST.append(port)
             else:
                 UDP_LIST.append(port)
        else:
            pass
    return ','.join(UDP_LIST), ','.join(TCP_LIST)


UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]


def print_value(func):
    print func


print_value(UDP)
print_value(TCP)

这是我的输出80,31337,22 515,53,515,53

TCP变量或_does_port_dict_have_type()的[1]位置是始终显示两次的值。我通过UDP_LIST还是TCP_LIST都没有关系。有谁知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

实际上,您在这里两次调用了该函数:

UDP = _does_port_dict_have_type(x)[0]
TCP = _does_port_dict_have_type(x)[1]

由于该函数返回一个元组,因此无需调用它两次。您可以使用元组拆包,并在单个语句中分配两个返回值,例如:

UDP, TCP = _does_port_dict_have_type(x)

通过理解,您的功能可以大大简化:

def _does_port_dict_have_type(port_dict):
    tcp = [k for k,v in port_dict.items() if v == "TCP"]
    udp = [k for k,v in port_dict.items() if v == "UDP"]
    return ','.join(udp), ','.join(tcp)

在python 2中,看起来您正在使用iteritems而不是items

def _does_port_dict_have_type(port_dict):
    tcp = [k for k,v in port_dict.iteritems() if v == "TCP"]
    udp = [k for k,v in port_dict.iteritems() if v == "UDP"]
    return ','.join(udp), ','.join(tcp)