2009-03-13 2 views
1

부분적으로 작동합니다. 더 많은 정보가 필요할 수도 있습니다. 그러나 여기에 잘못된 정보가 있으면 알려 드릴 것입니다.Django, Python 루프 논리 문제

activity.get_cost()가 False 값을 반환하면 함수가 완전히 종료되어 None을 반환하는 것 같습니다.

내가 원하는 것은 cost 십진수 값을 costs = []에 모아서 합계를 반환합니다. 간단합니다, 나는 생각했을 것입니다 ...하지만 초보자 파이썬 기술은 분명히 뭔가 빠져 있습니다.

자세한 정보는 요청시 제공됩니다. 고맙습니다.

def get_jobrecord_cost(self): 
    costs = [] 
    for activity in self.activity_set.all(): 
     cost = activity.get_cost() 
     if cost: 
      costs.append(cost) 
    if len(costs): 
     return sum(costs) 
    else: 
     return False 

답변

1
def get_jobrecord_cost(self): 
    return sum((activity.get_cost() or 0 for activity in activity_set.all()) or 0) 

을,이 버전이 조금 더 효율적으로 DNS 년대보다 얼마나 당신이 상대하고있는 데이터에 따라서는 발전기의 이해를 사용하기 때문에 전체 목록을 메모리에로드 할 필요가 없습니다. C에서 루핑이 일어나는 것을 제외하고는 슬프게도 기능적으로 동일합니다. 이것이 반드시 이 더 나은임을 의미하지는 않습니다. 이 접근법은 분명히 더 밀도가 높고 읽기 어려울 수 있습니다.

2

나는 당신이이 문제를 단순화 할 수 있다고 생각 :

def get_jobrecord_cost(self): 
    costs = 0 
    for activity in self.activity_set.all(): 
     cost = activity.get_cost() 
     if cost: 
      costs += cost 

    return costs 
3

나는 모든 비용은 아무도 없었다 경우 false를 반환하고 알; 특별한 이유가 있는지는 모르지만 글을 쓰는 것이 조금 어렵습니다. 그 요구 사항이 아니라면,이처럼 쓸 수있다 :

def get_jobrecord_cost(self): 
    costs = [activity.get_cost() or 0 for activity in self.activity_set.all()] 
    return sum(costs)