2016-10-13 1 views
2

방금 ​​작업 한 결과로, 이제는 첫 번째 입력 결과 만 생성되므로 계속해서 루프를 진행할 수 없습니다. 나는 어디로 잘못 갔는가? 나는 아마추어를 안다. 그러나 당신이 가지고 있을지도 모르는 것이 도움이 될 것 인 것은 굉장 할 것이다! 감사.내가 뭘 잘못하고있는거야, 파이썬 루프 반복되지?

sequence = open('sequence.txt').read().replace('\n','') 
enzymes = {} 
fh = open('enzymes.txt') 
print('Restriction Enzyme Counter') 
inez = input('Enter a Restricting Enzyme: ') 
def servx(): 
    for line in fh: 
     (name, site, junk, junk) = line.split() 
     enzymes[name] = site 
     if inez in fh: 
      xcr = site 
      print('Active Bases:', site) 
    for line in sequence.split(): 
     if xcr in line: 
      bs = (sequence.count(xcr)) 
      print('Enzyme', inez, 'appears', bs, 'times in Sequence.') 
servx() 
def servy(): 
    fh.seek(0); 
    qust = input('Find another Enzyme? [Yes/No]: ') 
    if qust == 'Yes': 
     inez = input('Enter a Restricting Enzyme: ') 
     servx() 
     servy() 
    elif qust == 'No': 
     print('Thanks!') 
    elif qust != 'Yes''No': 
     print('Error, Unknown Command') 
servy() 
fh.close() 
+5

_if inez in fh : _ - 아마도 _if inez in line을 의미 할 것입니다 : _ – volcano

+2

위 사람과 동의하면 아마도 전체 파일 대신 줄을 의미했을 것입니다. –

+0

나는 그것을 시험해 보았다. 운이 없다. 다른 아이디어? 감사합니다. – Joker

답변

2

이 범위의 문제입니다. 기본적으로 Python 변수는 범위가 로컬입니다. inez를 새로운 값으로 설정하는 servy에서, 파이썬은 이것이 전역 변수라고 명시하지 않았기 때문에 이것이 새로운 지역 변수라고 가정합니다. 따라서 serx를 두 번째 호출 할 때 전역 변수 inez는 변경되지 않습니다. 다음은이 문제를 설명하기위한 간단한 예입니다.

a = "hello" 

def b(): 
    print(a) 

def c(): 
    a = "world" 
    print(a) 
    b() 

b() 
c() 

나는 여러 번 나를 괴롭혔다. 글로벌 변수를 피할 수있는 가장 큰 이유 중 하나입니다.

루프가 사용되어야하는 재귀를 사용하는 것과 같은 위의 코드에 다른 문제가 있습니다. 파이썬의 범위 지정 규칙 (Short Description of the Scoping Rules?)에 대해 읽으면서 재귀를 피하기 위해 구조 조정을 시도한 다음 http://codereview.stackexchange.com에 코드를 게시하는 것이 좋습니다.

관련 문제