首页 文章

TypeError:类型'int'的参数不可迭代

提问于
浏览
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中实现餐饮哲学家问题 . 当我运行此代码时,它显示我的错误:

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

任何人都可以帮助我,为什么它显示这个错误 . 我搜索了它但无法解决 . 提前致谢!!

3 回答

  • 1

    你的方程导致整数 . 你不能在整数上使用 in .

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

    除了 in 的问题,它只能应用于迭代和类定义中具有 __contains__ 的对象,你可能会遇到下一个问题:你没有并行化 . 所以你应该使用线程或替换

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

    行 - 这是一个无限循环,因为没有人设置 EATING 状态 .

    或者你应该通过其他方式,通过不断检查挂钟时间或通过创建一个事件调度系统来完成计时,该系统负责必须完成的操作 .

    BTW: print "%d is THINKING" % i+1 也被打破了,因为 i+1 周围没有 ()% 具有更高的优先权 .

  • 2

    我认为你通常使用:

    in / not in
    

    不正确 . 看起来你正在尝试比较应该完成的整数

    ==
    !=
    >
    >=
    <
    <=
    

    而是运营商 .

相关问题