Python 合并每个并计数

Python combining for each and counting

我一直在浏览一些关于 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'

我有自己的列表,我希望对其应用特定操作,该列表的范围从中继 1 到中继 16。在浏览列表的过程中,有没有办法让我从 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

感谢您的帮助!

是,使用enumerate。此函数 returns 包含当前索引和元素的元组的可迭代对象。例如:

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

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

线索在错误信息中:

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)

可能有用,但你真的不想去那里。

查看有关您的原始字符串格式问题的条目:

  • Python string formatting: % vs. .format

而且,正如我注意到这些 "strings" 实际上是变量名,我觉得这可能有用:

  • How do you create different variable names while in a loop? (Python)

至于你的实际问题,你只需要将整数通道号传递给该函数即可。

示例:

GPIO.output(11, GPIO.LOW)

如果你想一次切换on/off多个引脚,你可以使用for循环。

示例:

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

或者更确切地说,将数字作为 tuple/list:

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

GPIO.setup()也一样。

供参考:


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

嗯,首先你需要解决连接问题。

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

现在,就列表的计数而言,有几种方法。如果你只需要列表的索引号,虽然你可以做你所做的,你也可以这样做:for index in len(lst):。如果您同时需要索引号和列表元素,请使用 enumerate()。有关示例,请参阅@pbreach 的回答。