2012-06-25 5 views
0
#!/usr/bin/python 

import time 
from array import * 

THINKING = 0 
HUNGRY = 1 
EATING = 2 

class Philosopher: 
    def __init__(self): 
     self.ph = array('i',[1, 2, 3, 4, 5]) 
     self.sleeptime = array('i',[30, 30, 30, 30, 30]) 

    def initialization_code(self): 
     for i in range(self.ph.__len__()): 
      self.ph[i] = THINKING 

    def pickup(self,i): 
     self.ph[i] = HUNGRY 
     self.test(i) 
     if(EATING not in (self.ph[i])): 
      while(EATING not in (self.ph[i])): 
       time.sleep(self.sleeptime[i]) 

    def putdown(self,i): 
     self.ph[i] = THINKING 
     self.test((i+4)%5) 
     self.test((i+1)%5) 

    def test(self,i): 
     if((2 not in (self.ph[(i+4)%5]))and(2 not in (self.ph[(i+1)%5]))and(self.ph[i]==HUNGRY)): 
      self.ph[i] = EATING 

    def start_process(self): 
     for i in range(self.ph.__len__()): 
      self.pickup(i) 
      self.putdown(i) 


    def display_status(self): 
     for i in range(self.ph.__len__()): 
      if (self.ph[i] == 0): 
       print "%d is THINKING" % i+1 
      elif (self.ph[i] == 1): 
       print "%d is WAITING" % i+1 
      elif (self.ph[i] == 2): 
       print "%d is EATING" % i+1 

phil = Philosopher() 
phil.initialization_code() 
phil.start_process() 
phil.display_status() 

위의 내용은 Python으로 철학자 문제를 구현하려고하는 코드 조각입니다. 내가이 코드를 실행할 때 그것은 나에게이 오류 보여줍니다TypeError : 'int'유형의 인수가 반복 가능하지 않습니다.

Traceback (most recent call last): 

File "dining.py", line 59, in <module> 

phil.start_process() 

    File "dining.py", line 43, in start_process  
    self.pickup(i)  
    File "dining.py", line 27, in pickup  
    self.test(i)  
    File "dining.py", line 38, in test  
    if((2 not in (self.ph[(i+4)%5]))and(2 not in (self.ph[(i+1)%5]))and(self.ph[i]==HUNGRY)): 
    TypeError: argument of type 'int' is not iterable 

사람이 왜이 오류가 표시되고,이 날 도와주세요 수 있습니다. 나는 그것에 대해 조사했지만 해결할 수 없었다. 미리 감사드립니다 !!

답변

6

방정식의 결과는 정수입니다. 정수에는 in을 사용할 수 없습니다.

>>> 'foo' in 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'int' is not iterable 
1

난 당신이 일반적으로 사용하는 생각 : 잘못

in/not in 

. 수행해야하는 정수를 비교하려고하는 것 같습니다. 대신에

== 
!= 
> 
>= 
< 
<= 

연산자를 사용해야합니다.

2

이터 레이블 및 클래스 정의에 __contains__이있는 객체에만 적용 할 수있는 in의 문제 외에도 다음과 같은 문제가 발생할 수 있습니다. 병렬화가 필요하지 않습니다. 당신이 중 하나는 스레드를 사용하거나

if(EATING not in (self.ph[i])): 
    while(EATING not in (self.ph[i])): 
     time.sleep(self.sleeptime[i]) 

라인 교체해야합니다 그래서 - 아무도 EATING 상태를 설정하지 않기 때문에, 무한 루프입니다.

또는 다른 방법으로 시간을 확인하거나 벽시계 시간을 지속적으로 확인하거나 수행해야 할 작업을 처리하는 이벤트 일정 계획 시스템을 만들어야합니다.

BTW : i+1% 주위에 ()이 없기 때문에 print "%d is THINKING" % i+1이 손상되었습니다.

+0

게다가'len (self.ph) '대신'self.ph .__ len __()'을 쓰는 이유는 무엇입니까? – glglgl

+0

답장을 보내 주셔서 감사합니다. 나는 이미이 오류를 발견했으며 솔루션은 현재 잘 돌아갑니다. – user1479198

관련 문제