我有这个代码:
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 ))
