Python 2.7 如何减少Python中If-Else语句的代码重复

Python 2.7 如何减少Python中If-Else语句的代码重复,python-2.7,code-duplication,Python 2.7,Code Duplication,我是一个学生,有一个很坏的习惯,就是到处复制代码,这是我想要改变的 下面是我正在编写的函数的一段代码。快速解释:代码将为一个人查看人力资源网站,并返回他管理的员工的信息(假设他管理任何人) 有两种类型的员工:正式员工和合同工。在网站上,经理下面的正式员工将全部列在员工名单中,承包商将列在承包商名单中 response = opener.open('myFakeOrgHierarchy.com/JohnSmith_The_Manager') allDataFromPage = (response.

我是一个学生,有一个很坏的习惯,就是到处复制代码,这是我想要改变的

下面是我正在编写的函数的一段代码。快速解释:代码将为一个人查看人力资源网站,并返回他管理的员工的信息(假设他管理任何人)

有两种类型的员工:正式员工和合同工。在网站上,经理下面的正式员工将全部列在员工名单中,承包商将列在承包商名单中

response = opener.open('myFakeOrgHierarchy.com/JohnSmith_The_Manager')
allDataFromPage = (response.read())
jsonVersionOfAllData = json.loads(allDataFromPage)

listOfAllReports = []

numOfEmployeeDirectReports = len(jsonVersionOfAllData['employeeList']['list'])
numOfContractWorkerReports = len(jsonVersionOfAllData['contractWorkerList']['list'])

if numOfEmployeeDirectReports != 0:
    for i in range(0, numOfEmployeeDirectReports, 1):
        workerInfo = {}
        workerInfo['empLname'] = jsonVersionOfAllData['employeeList']['list'][i]['lastName']
        workerInfo['empFname'] = jsonVersionOfAllData['employeeList']['list'][i]['firstName']
        listOfAllReports.append(workerInfo)

if numOfContractWorkerReports != 0:
    for i in range(0, numOfContractWorkerReports, 1):
        workerInfo = {}
        workerInfo['empLname'] = jsonVersionOfAllData['contractWorkerList']['list'][i]['lastName']
        workerInfo['empFname'] = jsonVersionOfAllData['contractWorkerList']['list'][i]['firstName']
        listOfAllReports.append(workerInfo)
如您所见,我有几行代码与其他代码几乎相同,只是有一些小的变化。有没有办法检查contractWorkerList和employeeList是否为空,并且(假设它们不是空的)检查contractWorkerList和employeeList并获取值而不复制代码


(因为我是一个相对的初学者,如果您能提供任何简单的示例和建议,我将不胜感激)

避免代码重复的最常见方法是使用该代码定义函数

def checkIfEmpty(numOfReports, listName):
    if numOfReports != 0:
        for i in range(0, numOfReports, 1):
            workerInfo = {}
            workerInfo['empLname'] = jsonVersionOfAllData[listName]['list'][i]['lastName']
            workerInfo['empFname'] = jsonVersionOfAllData[listName]['list'][i]['firstName']
            listOfAllReports.append(workerInfo)
因此,您将得到简单易读的代码:

checkIfEmpty(numOfEmployeeDirectReports, 'employeeList')
checkIfEmpty(numOfContractWorkerReports, 'contractWorkerList')

在此特定场景中,您可以执行以下操作:

for var, key in [(numOfEmployeeDirectReports, 'employeeList'),
                 (numOfContractWorkerReports, 'contractWorkerList')]:
    if var != 0:
        for i in range(0, var, 1):
            workerInfo = {}
            workerInfo['empLname'] = jsonVersionOfAllData[key]['list'][i]['lastName']
            workerInfo['empFname'] = jsonVersionOfAllData[key]['list'][i]['firstName']
            listOfAllReports.append(workerInfo)

对于初学者,每次看到重复的内容时,都要考虑预先创建一个变量并使用它。之后,您可以决定应该将哪些因素分解到函数中。下面,我刚刚删除了大部分重复的项目

response = opener.open('myFakeOrgHierarchy.com/JohnSmith_The_Manager')
allDataFromPage = (response.read())
jsonVersionOfAllData = json.loads(allDataFromPage)

listOfAllReports = []

for listType in ('employeeList', 'contractWorkerList'):

    json_ver = jsonVersionOfAllData[listType]['list']
    directReports = len(json_ver)

    if directReports != 0:
        for i in range(0, directReports, 1):
            workerInfo = {}
            for wi_name, json_name in (('empLname', 'lastName'), ('empFname', 'firstName')):
                workerInfo[wi_name] = json_ver[i][json_name]
            listOfAllReports.append(workerInfo)

将其分离为一个函数,该函数接受一个参数,如JSONVersionFallData和一个字符串,如
employeeList
(可能还接受一些其他参数,具体取决于返回的内容)。