python中的列表理解有用吗?

python中的列表理解有用吗?,python,regex,list-comprehension,pyserial,Python,Regex,List Comprehension,Pyserial,事实上,我是使用python的新手程序员。 我想使用唯一的hwid查找端口,但我认为列表理解不合适,因为端口将只返回一个 我使用的是简单的for循环代码吗? 请分享您的评论。:)感谢您的阅读。我将使用进行循环,如果您可以在找到唯一设备后尽早停止迭代的话 import serial as ser import serial.tools.list_ports as listport import re try: # VID regex regex_vplogVID = re.com

事实上,我是使用python的新手程序员。 我想使用唯一的hwid查找端口,但我认为列表理解不合适,因为端口将只返回一个

我使用的是简单的for循环代码吗?
请分享您的评论。:)感谢您的阅读。

我将使用
进行
循环,如果您可以在找到唯一设备后尽早停止迭代的话

import serial as ser
import serial.tools.list_ports as listport
import re

try:
    # VID regex
    regex_vplogVID = re.compile(r'{\S+}_VID')

    # I want to find COM port by using specific hwid
    port_device = [n.device for n in listport.comports() if re.findall(regex_vplogVID, n.hwid)]

    vplogserial = ser.Serial(port_device[0])

except Exception as e:
    print(e)

我会使用
for
循环,因为一旦找到唯一的设备,就可以提前停止迭代

import serial as ser
import serial.tools.list_ports as listport
import re

try:
    # VID regex
    regex_vplogVID = re.compile(r'{\S+}_VID')

    # I want to find COM port by using specific hwid
    port_device = [n.device for n in listport.comports() if re.findall(regex_vplogVID, n.hwid)]

    vplogserial = ser.Serial(port_device[0])

except Exception as e:
    print(e)

如果确实只有一个匹配项,不要使用列表。相反,在找到匹配项后,使用正常的for循环和break:这样就可以保证只有一个匹配项:

for n in listport.comports():
    if re.findall(regex_vplogVID, n.hwid):
        vplogserial = ser.Serial(n.device)
        break

额外好处:如果你想超越这一点,如果没有匹配项,你可以使用for-else成语,但这不是一个常用的成语,经常会让人困惑:

# I want to find COM port by using specific hwid  
regex_vplogVID = re.compile(r'{\S+}_VID')  
port_device = None
for port in listport.comports():
    if re.findall(regex_vplogVID, port.hwid):
       port_device = port.device
       break

如果确实只有一个匹配项,不要使用列表。相反,在找到匹配项后,使用正常的for循环和break:这样就可以保证只有一个匹配项:

for n in listport.comports():
    if re.findall(regex_vplogVID, n.hwid):
        vplogserial = ser.Serial(n.device)
        break

额外好处:如果你想超越这一点,如果没有匹配项,你可以使用for-else成语,但这不是一个常用的成语,经常会让人困惑:

# I want to find COM port by using specific hwid  
regex_vplogVID = re.compile(r'{\S+}_VID')  
port_device = None
for port in listport.comports():
    if re.findall(regex_vplogVID, port.hwid):
       port_device = port.device
       break

如果确实只有一个匹配项,不要使用列表。相反,一旦找到匹配项,就使用普通的for循环和
break
:这样你就可以保证只有一个匹配项(如果你想更进一步,如果没有匹配项,你可以使用for-else习惯用法,但这不是一个常用的习惯用法)。列表理解非常有用,但我认为你没有充分解释你的问题,不知道它是否适合你的情况。如果有多个匹配,该怎么办?@9769953笼统的建议可能是有害的。有时候,您只想包装一个非关键操作,这样无论出现什么错误,事情都会继续进行。谢谢大家的评论。如果确实只有一个匹配项,请不要使用列表。相反,一旦找到匹配项,就使用普通的for循环和
break
:这样你就可以保证只有一个匹配项(如果你想更进一步,如果没有匹配项,你可以使用for-else习惯用法,但这不是一个常用的习惯用法)。列表理解非常有用,但我认为你没有充分解释你的问题,不知道它是否适合你的情况。如果有多个匹配,该怎么办?@9769953笼统的建议可能是有害的。有时候,您只想包装一个非关键操作,这样无论出现什么错误,事情都能继续工作。感谢大家的评论。或者是包装在
next(gen,None)
中的生成器,或者包装在
next(gen,None)