2012-05-11 10 views
4

로컬 변수를 설정하고 함수에서이를 참조하며 조작 된 값을 기본 범위 (또는 호출 된 항목)로 되돌릴 수있는 스크립트를 만들려고합니다. ; 저는 Python을 처음 사용합니다.)Python : 함수에서 지역 변수를 사용하고 함수에서 변수를 반환하십시오.

모듈에서 함수 블록으로 로컬을 가져 오는 것이 무엇을 하려는지 최대한의 기본 사항을 보여주기 위해 코드를 단순화했습니다.

나는 이것을 globals을 사용하여 작동 시키려고했으나 이것이 최선의 해결책은 아닙니다. . .

chambersinreactor = 0; 
cardsdiscarded = 0; 

def find_chamber_discard(): 
    """Find chambers and discard in row (reads each player slot)""" 
    chambersinreactor = 0; # Resets the variable, not what I want 
    cardsdiscarded = 0; # Resets the variable, not what I want 
    chambersinreactor += 1 
    cardsdiscarded += 1 
    return # Don't know what to put here 

find_chamber_discard() 

print chambersinreactor # prints as 0, should be 1 
print cardsdiscarded # prints as 0, should be 1 
+0

함수에 인수를 전달한 다음 반환하려는 것을 의미합니까? –

+2

'chambersinreactor'와'cardsdiscarded'는 전역 변수입니다. 로컬 범위 외부에서 정의됩니다. –

답변

17

함수는 호출 된 범위를 알 필요가 없습니다. 함수의 핵심은 다른 장소에서 여러 번 호출 할 수있는 재사용 가능한 코드 블록을 만드는 것입니다.

~ 정보를 입력 변수를 통해 전달하여 함수와 통신합니다. 이 함수는 정보를 반환하여 호출자에게 정보를 다시 전달합니다.

범위의 변수를 관리하는 것은 해당 범위의 코드 작업이 이 아니라이 호출하는 모든 기능입니다. 변수를 함수에 의해 결정된 값으로 설정해야하는 경우 함수에서 해당 값을 반환하고 변수를 사용하여 변수를 설정합니다. 함수가 계산하는 값이 호출 범위에있는 변수의 값에 따라 다르면 함수에 인수로 전달해야합니다. 당신이 사용하고있는 함수는 당신이 사용하고있는 변수를 알 필요가 없어야하며, 그것들을 엉망으로 만들 수는 없습니다. 모두 함께하는 것이 퍼팅

, 싶은 것은이 같은 것입니다 :

def find_chamber_discard(chambersinreactor, cardsdiscarded): 
    chambersinreactor += 1 
    cardsdiscarded += 1 
    return (chambersinreactor, cardsdiscarded) 

chambersinreactor = 0; 
cardsdiscarded = 0; 

chambersinreactor, cardsdiscarded = find_chamber_discard(chambersinreactor, cardsdiscarded) 

print chambersinreactor 
print cardsdiscarded 

이 전역 변수 또는 가변 데이터 구조를 조작하여이 문제를 해결받을 수있는 방법이 있지만, 궁극적으로는 프로그램이 덜 유연하게 발견하기 어려운 오류를 포함 할 가능성이 높습니다. 이러한 기술을위한 장소가 있지만 함수와 정보를주고받는 첫 번째 방법은 인수를 전달하고 반환 값을 받아야합니다. 당신이 어떤 상태를 변경하는 기능이있는 경우, 당신이 모든 것을 포장 오프 아마 더 좋을 것 같아,

settings = dict(
    chambersinreactor = 0, 
    cardsdiscarded = 0 
) 

def find_chamber_discard(): 
    settings['chambersinreactor'] += 1 
    settings['cardsdiscarded'] += 1 

find_chamber_discard() 

print settings['chambersinreactor'] 
print settings['cardsdiscarded'] 

그러나 :

+1

'chamberinreactor, cardsdiscarded = find_chamber_discard (챔버 인 반응기, cardsdiscarded)'- 이것은 놀랍습니다 - 당신이 이것을 여러 값으로 돌려 줄 수 있다는 것을 알았습니까?! – toonarmycaptain

2
#!/usr/bin/env python 
chambersinreactor = 0; cardsdiscarded = 0; 

def find_chamber_discard(): 
    chambersinreactor = 0 
    cardsdiscarded = 0 
    chambersinreactor += 1 
    cardsdiscarded += 1 
    return(chambersinreactor, cardsdiscarded) 

#Here the globals remain unchanged by the locals. 
#In python, a scope is similar to a 'namespace' 
find_chamber_discard() 

print chambersinreactor #prints as 0 
print cardsdiscarded 

#I've modified the function to return a pair (tuple) of numbers. 
#Above I ignored them. Now I'm going to assign the variables in the 
#main name space to the result of the function call. 
print("=====with assignment===") 
(chambersinreactor, cardsdiscarded) = find_chamber_discard() 

print chambersinreactor # now prints as 1 
print cardsdiscarded 

# Here is another way that doesn't depend on returning values. 
#Pass a dictionary of all the main variables into your function 
#and directly access them from within the function as needed 

print("=======using locals===") 
def find_chamber_discard2(_locals): 
    _locals['chambersinreactor'] += 1 
    _locals['cardsdiscarded'] += 1 
    return 

find_chamber_discard2(locals()) 

print chambersinreactor #incremented the value, which was already 1 
print cardsdiscarded 
+1

문서의 권장 사항은 locals()를 수정하지 않는 것입니다.주의해야 할 행동은 전적으로 구현을 기반으로하며 보장되지 않습니다. "이 사전의 내용을 수정해서는 안되며 변경 사항은 인터프리터가 사용하는 지역 변수와 자유 변수. " –

2

한 가지 방법은 dicts 또는 목록 같은 가변 값을 사용하는 것입니다 수업 시간에, 그으로의 그들은을 위해하는지 :

class CardCounter(object): 
    def __init__(self): 
     chambersinreactor = 0 
     cardsdiscarded = 0 

    def find_chamber_discard(self, hand): 
     for card in hand: 
      if card.is_chamber: 
       self.chambersinreactor += 1 
      if card.is_discarded: 
       self.cardsdiscarded += 1 

당신이 계산되어 무슨 일을하는지, 어쩌면 당신이 사용할 수있는 경우 카운터 :

from collections import Counter 

def test_for_chamberness(x): return x == 'C' 
def test_for_discarded(x): return x == 'D' 

def chamber_or_discard(card): 
    if test_for_chamberness(card): 
     return 'chambersinreactor' 
    if test_for_discarded(card): 
     return 'cardsdiscarded' 

hand = ['C','C','D','X','D','E','C'] 

print Counter(
    x for x in (chamber_or_discard(card) for card in hand) if x is not None 
) 

개인적으로 클래스 접근법에 대해 설명하고 카운터를 래핑하는 것이 좋습니다. 모든 관련 기능을 함께 유지합니다.

관련 문제