我目前正在开发一个 iTunes 数据程序,该程序不断循环浏览用户的图书馆,以获取有关某个图书馆的统计信息。 返回 我有一些这样的代码片段:
def numArtist(self):
num = 0
for song in self.allSongs:
tempList = []
if song.artist not in tempList:
tempList.append(song.artist)
num += 1
return num
def getAlbumNames(self):
albums = []
for song in self.allSongs:
if song.album not in albums:
albums.append(song.album)
return albums
重复主要 for 循环体的地方:
for song in self.allSongs: # same for-loop condition
# different for-loop body
有没有办法重构像这样的方法,我有相同的 for 循环条件但主体定义不同?
我有很多方法都使用相同的 for 循环,所以我想找到一种方法来降低代码的复杂性和冗余。
仅供引用,所有 Song 对象都有我用来获取数据的属性 - 艺术家、专辑(名称)、流派等。
最佳答案
使用set comprehensions和 len
来简化它们中的每一个:
def numArtist(self):
return len({song.artist for song in self.allSongs})
def getAlbumNames(self):
return {song.album for song in self.allSongs}
为了让它更通用,您可以编写一个方法,它接受 lambda并使用它来过滤每首歌曲的属性:
def uniqueProps(self, fxn):
return {fxn(song) for song in self.allSongs}
def getAlbumNames(self):
return self.uniqueProps(lambda song: song.album)
关于python - 在 Python 中重构 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695241/