Python 代碼閱讀合集介紹:為什么不推薦Python初學者直接看項目源碼
本篇閱讀的代碼實現了在列表中尋找符合條件的元素的位置。
本篇閱讀的代碼片段來自於30-seconds-of-python。
find_index
def find_index(lst, fn):
return next(i for i, x in enumerate(lst) if fn(x))
# EXAMPLES
find_index([1, 2, 3, 4], lambda n: n % 2 == 1) # 0
find_index
函數接收一個列表和一個判別函數,返回第一個使判別函數為真的元素的下標。
函數使用列表推導式、enumerate()
和next()
來返回lst
中第一個 是判別函數fn
的返回為True
的元素的索引。
next(iterator[, default])
獲取迭代器的下一個元素。如果迭代器耗盡,則返回給定的 default,如果沒有默認值則觸發 StopIteration
enumerate(iterable, start=0)
返回一個枚舉對象。enumerate()
返回的迭代器的__next__()
方法返回一個元組,里面包含一個計數值(從start
開始,默認為0
)和通過迭代iterable
獲得的值。如果start
從0
開始,相當於獲取了列表的下標。
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
find_last_index
類似的,可以實現find_last_index
函數,使用lst[::-1]
切片形式,將列表倒序。然后使用len(lst)
和倒序后的列表中第一個符合判別函數的元素的位置,計算該元素在原列表中的位置。
def find_last_index(lst, fn):
return len(lst) - 1 - next(i for i, x in enumerate(lst[::-1]) if fn(x))
# EXAMPLES
find_last_index([1, 2, 3, 4], lambda n: n % 2 == 1) # 2