python中的列表理解有用吗?
事实上,我是使用python的新手程序员。 我想使用唯一的hwid查找端口,但我认为列表理解不合适,因为端口将只返回一个 我使用的是简单的for循环代码吗?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
请分享您的评论。:)感谢您的阅读。我将使用
进行
循环,如果您可以在找到唯一设备后尽早停止迭代的话
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)