2016-12-21 3 views
0

Я изучаю некоторые уроки на Python, поскольку я довольно новый, и я натолкнулся на функцию, которую я хотел бы использовать. А именно, «foreach». The tutorial script I'm basing myself on looks as follows:Комбинация Python для каждого и подсчет

#!/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 до 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

Является ли «реле» + str (number) 'просто то, что вам нужно? –

+0

Не работает ли это? Очевидно, что 'для числа/в диапазоне ...' должно быть 'для числа в диапазоне ...' (no/before in). Если он не работает, возникает ошибка. Если это не работает и нет ошибки, у вас есть рабочий код без цикла? – sberry

ответ

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() ожидает, целое число, а не строка в качестве первого параметра, поэтому альтернативный подход, в частности, если реле контактных идентификаторы не являются последовательными:

# 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) 

может работать, но вы действительно не хотите, чтобы пойти туда.

+0

Благодарим вас за предложение. Однако это не создает рабочий сценарий.Это дает мне следующую ошибку: Traceback (последний последний звонок): Файл «relay.py», строка 25, в GPIO.setup («relay» + str (number), GPIO.OUT) ValueError: Channel должно быть целым числом или списком/кортежем целых чисел – user5740843

+1

А, я вижу. 'relay1' to' relay16' на самом деле являются константами? Какие ценности у них есть? Из какой библиотеки они происходят? –

+0

Они действительно. В верхней части скрипта я их сохранил с их номерами контактов GPIO, которые выглядели бы так: relay1 = 12 – user5740843

0

Да, используйте enumerate. Эта функция возвращает итерабельность кортежей, которые содержат текущий индекс и элемент. Например:

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

распечатает цифры от 0 до 9 для i и от 10 до 19 лет для e.

1

Посмотрите на эту запись о вашей исходной задаче Строка форматирования:

И, как я заметил, что эти «строки» на самом деле имена переменных, я чувствую это может быть полезно:


Что касается вашей реальной проблемы, вам нужно передать только целые номера каналов в эту функцию.

Пример:

GPIO.output(11, GPIO.LOW) 

Если вы хотите, чтобы включить/выключить несколько штырей сразу, вы можете использовать цикл.

Пример:

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

Или скорее передать числа как кортеж/список:

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

Это то же самое для GPIO.setup().

Для справки:


Кроме того, вы должны посмотреть в документацию об использовании и возможностях штырей, которые вы пытаетесь использовать:

1

Ну, в первую очередь вам необходимо исправить проблему конкатенации.

Если вы посмотрите на эту строку: GPIO.setup("relay" + number, GPIO.OUT), вы увидите, что вы пытаетесь объединить STRING "relay" и INTEGER number вместе. Это не сработает. Вам нужно будет изменить тип переменной number на строку, например str(number), чтобы справиться с этой ошибкой.

Теперь, что касается подсчета списка, существует несколько способов. Если вам нужны только номера индексов списка, в то время как вы можете делать то, что вы сделали, вы также можете сделать: for index in len(lst):. Если вам нужен номер индекса и элемент списка, используйте enumerate(). См. Ответ @ pbreach для примера.