2017-01-17 4 views
1

Следующий фрагмент кода работает:Python 3: для синтаксиса цикла с словарем

param = {} 

for nround_counter in [1,2,3]: 
    { 
     print(nround_counter) 
     #param = {'objective' : 'multi:softmax'} 

    } 

Но следующий не будет:

param = {} 

for nround_counter in [1,2,3]: 
    { 
     print(nround_counter) 
     param = {'objective' : 'multi:softmax'} 

    } 

Ошибка данный недействителен синтаксис. Я новичок в Python и обращаюсь за помощью в отладку выше.

спасибо.

+0

Что такое '{' object ':' multi: softmax '}'. Вам нужны какие-либо конкретные значения или просто строка? –

+4

Тело петли Питона не заключено в фигурные скобки. Удалить их. – DyZ

+0

Эта конкретная строка задает определенные значения, но есть другие ключи, которые я хотел бы установить с помощью nround_counter, например param ['num_round'] = nround_counter. Я думал, что, разрешив проблему синтаксиса для этой строки, я смог бы отладить остальную часть кода. – jkyh

ответ

3

Тела кода, такие как циклы, функции, классы и т. Д., Не заключены в фигурные скобки в Python. Отступы - это то, что определяет структуру кода.

for nround_counter in [1, 2, 3]: 
    print(nround_counter) 
    param = {'object' : 'multi:softmax'} 
1

Здесь вы сталкиваетесь с различными проблемами.

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

#!python3 
param = {} 

for nround_counter in [1,2,3]: 
    { print(nround_counter) } 

Обратите внимание, что это Перебор ряд утверждений, утверждение (бесцельно и непоследовательно) кодируется в виде набора буквального выражение конструктора, вызываемое для его побочного эффекта (вызов функции печати). Он не модифицирует какое-либо состояние, но оценивается как набор, содержащий одиночный элемент None как единственный его элемент, на каждой итерации через цикл.

Это не специальный синтаксис. Это просто непонятное использование синтаксиса строкового литерала Python.

Это также совершенно непонятно, что вы пытаетесь выполнить. Нет смысла перебирать список, который постоянно связывает param с одним и тем же литеральным содержанием словаря снова и снова.

Возможно, если вы хотите построить какой-то стол?

param = dict() 
for n in range(1,4): 
    print(n) 
    param['objective%s'%n] = 'multi:softmax' 

... или что-то в этом роде. Примечание I инициализируйте param с dict(), а не буквально {}, потому что я думаю, что это немного чище и понятнее, если немного более подробный. Также я использую range(1,4), а не ваш литеральный список, опять же потому, что он чище. То, что я делаю в теле этого цикла, глупо, но это пример того, что вы могли бы сделать.

Обратите внимание, что я генерирую уникальный ключ (константный строковый литерал с интерполяцией строкового представления моей переменной итератора) для каждого прохождения через цикл. Обычно можно ожидать, что значения также будут динамически вычисляться или получаться каким-либо образом; но я не понимаю, как нет четкого педагогического примера, который приходит на ум.