我刚刚在Uni学习python上学了半个学期.我真的很喜欢它,并希望提供一些关于如何编写更多'pythonic'代码的技巧.
这是__init__我最近做的一个课程.在我写这篇文章的时候,我试图找出如何使用lambdas重新编写它,或者以更整洁,更有效的方式重写它,但是时间不多了.
def __init__(self, dir):
def _read_files(_, dir, files):
for file in files:
if file == "classes.txt":
class_list = readtable(dir+"/"+file)
for item in class_list:
Enrol.class_info_dict[item[0]] = item[1:]
if item[1] in Enrol.classes_dict:
Enrol.classes_dict[item[1]].append(item[0])
else:
Enrol.classes_dict[item[1]] = [item[0]]
elif file == "subjects.txt":
subject_list = readtable(dir+"/"+file)
for item in subject_list:
Enrol.subjects_dict[item[0]] = item[1]
elif file == "venues.txt":
venue_list = readtable(dir+"/"+file)
for item in venue_list:
Enrol.venues_dict[item[0]] = item[1:]
elif file.endswith('.roll'):
roll_list = readlines(dir+"/"+file)
file = os.path.splitext(file)[0]
Enrol.class_roll_dict[file] = roll_list
for item in roll_list:
if item in Enrol.enrolled_dict:
Enrol.enrolled_dict[item].append(file)
else:
Enrol.enrolled_dict[item] = [file]
try:
os.path.walk(dir, _read_files, None)
except:
print "There was a problem reading the directory"
Run Code Online (Sandbox Code Playgroud)
如你所见,它有点笨重.如果有人有时间或倾向,我真的很感激一些python最佳实践的一些提示.
谢谢.
结合可以清理代码的东西:
使用字典的setdefault.如果缺少密钥,则将其设置为您提供的默认密钥,然后将其返回.否则,它只是忽略第二个参数并返回字典中的内容.这避免了笨重的if语句.
Enrol.venues_dict.setdefault(key, []).append(file)
>>> x = {}
>>> x.setdefault(99, []).append(5)
>>> x.setdefault(99, []).append(6)
>>> x
{99: [5, 6]}
>>> x.setdefault(100, []).append(1)
>>> x
{99: [5, 6], 100: [1]}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是使用os.path.join来创建文件路径.这比仅仅进行字符串连接更安全.
os.path.join(dir, file)
Run Code Online (Sandbox Code Playgroud)
除此之外,IMO的风格看起来不错.