Sto provando a creare un elenco di porte disponibili in Python. Sto seguendo this tutorial, ma invece di stampare le porte aperte, le sto aggiungendo a un elenco.Perché le prese sono chiuse nel ciclo di comprensione degli elenchi ma non in ciclo?
Inizialmente, ho avuto qualcosa di simile al seguente:
available_ports = []
try:
for port in range(1,8081):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
available_ports.append(port)
sock.close()
# ...
Questo funziona chiaramente bene, ma è ben noto che comprehensions are faster than loops, così ora ho:
try:
available_ports = [port for port in range(1, 8081) if not socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex((remoteServerIP, port))]
# ...
ho assunto la prese wouldn essere chiuso, ma ho provato con il seguente:
try:
available_ports = [port for port in range(1, 8081) if not socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex((remoteServerIP, port))]
for port in range(1,8081):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
print("Port {}: \t Open".format(port))
sock.close()
# ...
e in effetti th Sono state stampate le porte aperte.
Perché le prese sono chiuse nella comprensione ma non nel ciclo for? Posso fare affidamento su questo comportamento o questa è una falsa pista?
Interessante. Mi sento anche se ci fosse un modo per GC manualmente i riferimenti, non sarebbe pietoso. Inoltre, non penso che ci sia un modo per chiudere i socket all'interno della comprensione (non 'con open (socket) as s'). Potrei aver bisogno di mangiare solo i pochi millisecondi necessari per aggiungere le porte. – erip
Questa è una domanda diversa, ma se devi garantire la chiusura del socket, dovresti preferire il ciclo 'for'. –
Nessuna domanda - solo riflessioni. Apprezzo l'aiuto e i riferimenti. – erip