Outline
平時寫if判斷和for循環都是中規中矩,按常規套路來,但今天同事問我這方面的東西給;
把他for循環+if else判斷改成了一行。
改完之后代碼看起來更優雅了 哈哈哈
需求
假設有這么個需求:
判斷一個可迭代對象中的元素是否以字母 “s” 結尾;
- 以 “s” 結尾,則保留這個元素
- 不以 “s” 結尾,則把這個元素替換為 666
實現
首先要for循環遍歷這個可迭代對象,然后對每次迭代的元素進行判斷,看是否以“s”結尾;
常規解法:

def is_endwith_s(n): """ 判斷是否以s結尾 :param n: str or int :return: bool """ return str(n).endswith('s') # 待判斷的可迭代對象 lis = ['ss', 'ss', 'ss', 'aa', 'aa', 'ss', 'ss', 'ss', 'ss', '22'] lis_s = [] for i in lis: if is_endwith_s(i): lis_s.append(i) print(lis_s) # ['ss', 'ss', 'ss', 'ss', 'ss', 'ss', 'ss']

def is_endwith_s(n): """ 判斷是否以s結尾 :param n: str or int :return: bool """ return str(n).endswith('s') # 待判斷的可迭代對象 lis = ['ss', 'ss', 'ss', 'aa', 'aa', 'ss', 'ss', 'ss', 'ss', '22'] lis_s = [] for i in lis: if is_endwith_s(i): lis_s.append(i) else: lis_s.append(666) print(lis_s) # ['ss', 'ss', 'ss', 666, 666, 'ss', 'ss', 'ss', 'ss', 666]
for循環+ if else 一行實現:

def is_endwith_s(n): """ 判斷是否以s結尾 :param n: str or int :return: bool """ return str(n).endswith('s') # 待判斷的可迭代對象 lis = ['ss', 'ss', 'ss', 'aa', 'aa', 'ss', 'ss', 'ss', 'ss', '22'] lis_s = [word for word in lis if is_endwith_s(word)] print(lis_s) # ['ss', 'ss', 'ss', 'ss', 'ss', 'ss', 'ss']

def is_endwith_s(n): """ 判斷是否以s結尾 :param n: str or int :return: bool """ return str(n).endswith('s') # 待判斷的可迭代對象 lis = ['ss', 'ss', 'ss', 'aa', 'aa', 'ss', 'ss', 'ss', 'ss', '22'] lis_s = [word if is_endwith_s(word) else '666' for word in lis] print(lis_s) # ['ss', 'ss', 'ss', '666', '666', 'ss', 'ss', 'ss', 'ss', '666']