Skip to main content
 首页 » 编程设计

python之清理 python 中的嵌套 for 循环

2025年05月04日12kerrycode

我有这个代码:

def GetSteamAccts(): #Get list of steam logins on this computer. 
    templist = [] 
    Steamapp_Folders = ["C:\\Program Files (x86)\\Steam\\steamapps\\", "C:\\Program Files\\Steam\\steamapps\\"] #Check both of these directories. 
    for SF_i in range(len(Steamapp_Folders)): 
        if os.path.exists(Steamapp_Folders[SF_i]): #If the directory even exists... 
            Steam_AppDir_Items = os.listdir(Steamapp_Folders[SF_i]) #List items under steam install directory. 
            for S_AD_i in range(len(Steam_AppDir_Items)): #Make sure the user doesn't have any files in here... 
                if os.path.isdir(Steamapp_Folders + Steam_AppDir_Items[S_AD_i]): #If our path is a directory... 
                    templist.append(Steam_AppDir_Items[S_AD_i])  #Add it to our list of logins. 
                                                                 #(If some idiot puts extra folders in here, 
                                                                 #it's their own damn fault when it shows on the list.) 
    return templist #Return a (not so) properly filtered list of steam logins. 

我的问题是,它在我看来非常丑陋。我列出了 2 条路径(只有 1 条将永远存在),遍历这些路径,然后我必须获取这些路径中的项目列表,然后遍历这些路径并从中过滤掉非目录以获得用户计算机上的 Steam 登录伪列表。 (基本上只是在这两个路径中的任何一个下获取任何现有目录的列表(仅限目录!)

有没有更短的方法(除了将 for 循环压缩成单行?)?

我更愿意得到一个英文的解决方案,这样我就可以自己将其组合起来;而不是代码。这是我真正学习正确方法的唯一途径。即使是一个很好的小提示或摘录,以便我自己弄清楚也很好。

并且:for 循环中的列表是否总是必须像这样遍历:

for x in range(len(somelist)): 

或者有什么比使用 range(len( ?

请您参考如下方法:

for i in range(len(somelist)): 
   something( somelist[i] ) 

应该写成

for x in somelist:  
    something( x ) 

你也可以写得更短:

def GetSteamAccts(): 
    Steamapp_Folders = [f for f in ("C:\\Program Files (x86)\\Steam\\steamapps\\",  
                                    "C:\\Program Files\\Steam\\steamapps\\")  
                          if os.path.isdir(f)] 
    return [os.path.join(root, folder)  
                    for root in Steamapp_Folders  
                    for folder in os.listdir(root)  
                    if os.path.isdir( os.path.join(root, folder)) ] 

这看起来更干净,实际上可以满足您的要求:;-)

def subfoldernames( root ): 
    for folder in os.listdir(root): 
        path = os.path.join(root, folder) 
        if os.path.isdir(path): 
            yield folder # just the name, not the path 
 
# same, just shorter: 
def subfoldernames( root ): 
    # this returns a generator, written as a generator expression 
    return ( folder for folder in os.listdir( root )  
                    if os.path.isdir(os.path.join( root, folder )) ) 
 
def GetSteamAccts(): 
        Steamapp_Folders = ("C:\\Program Files (x86)\\Steam\\steamapps\\",  
                                             "C:\\Program Files\\Steam\\steamapps\\") 
        for folder in Steamapp_Folders: 
            if os.path.isdir(folder): 
                # only the subfolders of the first path that exists are returned 
                return list(subfoldernames( folder ))