Python结合每个和计数

时间:2016-12-21 07:28:09

标签: python for-loop raspberry-pi gpio

我一直在阅读一些关于Python的教程,因为我很新,我遇到了一个我想要使用的函数。即,'foreach'。 The tutorial script I'm basing myself on looks as follows:

#!/usr/bin/python

for letter in 'Python':     # First Example
   print 'Current Letter :', letter

print "Good bye!"

#!/usr/bin/python

for num in range(10,20):  #to iterate between 10 to 20
   for i in range(2,num): #to iterate on the factors of the number
      if num%i == 0:      #to determine the first factor
         j=num/i          #to calculate the second factor
         print '%d equals %d * %d' % (num,i,j)
         break #to move to the next number, the #first FOR
   else:                  # else part of the loop
      print num, 'is a prime number'

我有自己的列表,我想要应用特定的操作,该列表的范围从relay1到relay16。有没有办法在列表中为我计算从1到16的数量?

我正在思考以下几点:

GPIO.setmode(GPIO.BCM)
for number in range(1, 17):
        GPIO.setup("relay" + number, GPIO.OUT)
        GPIO.output("relay" + number, GPIO.LOW)
        time.sleep(1)
        GPIO.output("relay" + number, GPIO.HIGH)
GPIO.cleanup()

但它失败了:

Traceback (most recent call last):
  File "relay.py", line 25, in <module>
    GPIO.setup("relay" + number, GPIO.OUT)
TypeError: cannot concatenate 'str' and 'int' objects

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

线索在错误消息中:

Traceback (most recent call last):
  File "relay.py", line 25, in <module>
    GPIO.setup("relay" + number, GPIO.OUT)
TypeError: cannot concatenate 'str' and 'int' objects

正如我在评论中提到的,您必须将整数number更改为字符串,最简单的方法是通过str()函数:

GPIO.setup("relay" + str(number), GPIO.OUT)
                     ^^^^      ^

当然,请对两个output()来电重复此操作。

另一方面,GPIO.setup()期望一个整数,而不是一个字符串作为第一个参数,所以另一种方法是,特别是如果中继引脚id不是顺序的话:

# Or they might be mylib.RELAY1?
relays = [relay1, relay2, ... relay16]

for number in range(1, 17):
    GPIO.setup(relays[number-1], GPIO.OUT)

或者更简单:

for relay in relays:
    GPIO.setup(relay, GPIO.OUT)

甚至更简单,因为函数似乎接受列表:

GPIO.setup(relays, GPIO.OUT)

third hand上:

GPIO.setup(globals()["relay" + str(number)], GPIO.OUT)

可能会工作,但你真的不想去那里。

答案 1 :(得分:1)

请查看此条目,了解原始字符串格式问题:

而且,正如我注意到这些“字符串”实际上是变量名称,我觉得这可能有用:

关于您的实际问题,您只需要将整数通道号传递给该函数。

示例:

GPIO.output(11, GPIO.LOW)

如果要一次打开/关闭多个引脚,可以使用for循环。

示例:

relays = [11, 12]
for i in relays:
    GPIO.output(i, GPIO.LOW)

或者更确切地说将数字作为元组/列表传递:

relays = [11, 12]
GPIO.output(relays, GPIO.LOW)

GPIO.setup()也是如此。

供参考:

此外,您应该查看有关您尝试使用的引脚的用法和功能的文档:

答案 2 :(得分:1)

首先,您需要修复连接问题。

如果您查看以下行:GPIO.setup("relay" + number, GPIO.OUT),您会发现您正在尝试将STRING "relay"和INTEGER number连接在一起。这不行。您必须将变量number的类型更改为str(number)之类的字符串才能处理错误。

现在,就计算清单而言,有几种方法。如果您只需要列表的索引号,那么您可以执行以下操作:for index in len(lst):。如果您需要索引号和列表元素,请使用enumerate()。有关示例,请参阅@ pbreach的答案。

答案 3 :(得分:0)

是的,请使用enumerate。此函数返回一个可迭代的元组,其中包含当前索引和元素。例如:

for i, e in enumerate(range(10, 20)):
    print(i, e)

i将打印出0到9的数字,e打印出10到19的数字。