2013-03-28 44 views
3

我正在編寫代碼以使用GSM調制解調器在python中發送和接收消息。將打印語句與Python中的列表理解結合起來

每當接收到新消息時,從串口對象讀取後,我會在列表x中得到以下響應。

+CMTI: "SM",0 # Message notification with index 

我對這個指示投票,我已經利用列表內涵,以檢查自己是否已收到上述響應

def poll(x): 
    regex=re.compile("\+CMTI:.......") 
    [m for l in x for m in [regex.search(l)] if m] 

這似乎是工作,但是我想添加一個打印聲明,只要找到匹配項即可

print "You have received a new message!" 

如何將打印語句與上述內容結合使用?

+1

除非你想破解一個解決方案,否則使用正常的循環。 – Volatility 2013-03-28 08:46:12

+1

你意識到你沒有存儲該列表? – Serdalis 2013-03-28 08:46:24

+0

你不把打印語句放在列表解析中,它是不好的python。也作爲@Serdalis說你不存儲列表 – jamylak 2013-03-28 08:46:58

回答

3

與正常for循環,這是可以做到這樣的:

def poll(x): 
    regex = re.compile("\+CMTI:.......") 
    lst = [] 
    for l in x: 
     for m in [regex.search(l)]: 
      if m: 
       lst.append(m) 
       print "You have received a new message!" 

注意,此列表不被存儲在任何地方(功能範圍之外) - 也許你想return它。


作爲一個側面說明,哈克解決方案:

from __future__ import print_function 
def poll(x): 
    regex = re.compile("\+CMTI:.......") 
    [(m, print("You have received a new message!"))[0] for l in x for m in [regex.search(l)] if m] 

但是,這是非常unpythonic - 用其他的替代版本。

+0

第二個答案很混亂,不建議爲什麼「unpythonic」?我會考慮更換嵌套循環與列表理解一樣混亂,通常被認爲是更加pythonic。只是好奇,並試圖學習。謝謝。 – TMWP 2017-04-30 21:48:15

+0

@TMWP列表理解本身不是什麼unpythonic,它是一個事實,一個s [jamylak提到](http://stackoverflow.com/questions/15677429/combining-print-statements-with-list-comprehension-in-python/15677765?noredirect=1#comment22255322_15677429),第二個答案是打印內列表理解。列表解析是爲了生成列表,而不是作爲簡寫循環。 – Volatility 2017-05-01 04:49:03