我一直在阅读一些关于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
感谢您的帮助!
答案 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的数字。