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 的回答。
我一直在浏览一些关于 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 的回答。