2013-05-29 8 views
1

Так что это, вероятно, очень простой вопрос о форматировании вывода в python с использованием .format, и поскольку я новичок, я не могу понять это для жизни меня. Я старался быть настолько подробным, насколько это возможно, просто чтобы убедиться, что нет путаницы.Форматирование вывода Python 3.3

Позвольте привести пример, чтобы вы могли лучше понять мою дилемму. Рассмотрим следующую программу

list = (['wer', 'werwe', 'werwe' ,'wer we']) # list[0], list[1], list[2], list[3] 
list.append(['vbcv', 'cvnc', 'bnfhn', 'mjyh']) # list[4] 
list.append(['yth', 'rnhn', 'mjyu', 'mujym']) # list[5] 
list.append(['cxzz', 'bncz', 'nhrt', 'qweq']) # list[6] 

first = 'bill' 
last = 'gates' 

print ('{:10} {:10} {:10} {:10}'.format(first,last,list[5], list[6]))  

Вполне понятно, что дало бы выход:

bill  gates  ['yth', 'rnhn', 'mjyu', 'mujym'] ['cxzz', 'bncz', 'nhrt', 'qweq'] 

Так вот мой вопрос. Я делал эту проблему из книги, и я не понимаю ответа. Программа ниже даст вам хорошее представление о том, какой вывод мы будем для:

students = [] 
students.append(['DeMoines', 'Jim', 'Sophomore', 3.45]) #students[0] 
students.append(['Pierre', 'Sophie', 'Sophomore', 4.0]) #students[1] 
students.append(['Columbus', 'Maria', 'Senior', 2.5]) #students[2] 
students.append(['Phoenix', 'River', 'Junior', 2.45]) #students[3] 
students.append(['Olympis', 'Edgar', 'Junior', 3.99]) #students[4] 
students.append(['van','john', 'junior', 3.56])   #students[5] 
def Grades(students): 
    print ('Last  First  Standing  GPA') 
    for students in students: 
     print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0],students[1],students[2],students[3])) 

выход мы пытаемся получить это своего рода таблицу, которая дает все статистику для всех студентов -

Last  First  Standing  GPA 
DeMoines Jim  Sophomore  3.45 
Pierre  Sophie  Sophomore  4.00 
Columbus Maria  Senior   2.50 
Phoenix River  Junior   2.45 
Olympis Edgar  Junior   3.99 
van  john  junior   3.56 

Так вот что я не понимаю. Мы работаем в основном с одним и тем же в двух примерах, то есть в списке внутри списка. Для моего первого примера, оператор печати был:

print('{:10} {:10} {:10} {:10}'.format(first, last, list[5], list[6])) 

где list[5] и list[6] являются списками и сами они напечатаны в полном объеме, как вы можете видеть на выходе. Но этого не происходит в книге проблема. Там, оператор печати говорит

print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0], students[1], students[2], students[3])) 

Как видно из таблицы вывода, здесь students[0] относится только к «DeMoines». Но если вы просто запустите оператор students[0] в интерпретаторе Python, он даст весь список подписок, как и должно быть.

['DeMoines', 'Jim', 'Sophomore', 3.45] 

Так, в принципе, у меня есть два вопроса, почему students[0] имеет два разных значения, и почему students[0] не печатает весь список, как мы делали с list[5] и list[6]?

+0

Если я могу предложить предложение: попробуйте сократить свои примеры и прояснить постановку проблемы. Вы получите больше внимания, если ваши вопросы будут более точными. – cfi

+0

Я буду помнить об этом. Благодарю. – Kye

ответ

3

Посмотрите на цикл:

for students in students: 
# ^^^^^^^^ 

Таким образом, students (внутри цикла) фактически не относится к списку списка. И students[0] относится к первый элемент от элемент от список перечней, как и ожидалось.

Предлагаю заменить students на аргумент функции, скажем, all_students или что-то в этом роде.

+0

Спасибо. Думаю, я сейчас это понимаю. Так правильно, если я ошибаюсь, когда мы делаем цикл for, применяемый к списку (или, как это бывает в нашем случае, список списков) , это как-то изменяет значение «учеников [0]» (ссылаясь на абсолютный первый ELEMENT), когда он INSIDE для цикла for. Но вне цикла for «students [0]» все еще относится к подменю. – Kye

+0

Немного Коррекция: _ «это как-то меняет смысл« учеников »[0]« »_ - не так. Посмотрите на цикл for снова. Он имеет форму' для в '. Основная проблема заключается в том, что это ваш case 'element_name' и' iterable_object' имеют одинаковые имена. – soon

+0

@Kye Использование 'for x in x' - это ужасно запутанная конструкция. Думаю, вы сможете лучше понять, что происходит, если вы переписываете ее как« для ученика » в студентах: «для студентов в студентах: print ('{0:10} {1:10} {2:10} {3: 8.2f}'. format (student [0], student [1] , студень t [2], ученик [3])) ' –

1

Попробуйте переименовать переменную list в нечто, что не является зарезервированным словом или встроенной функцией или типом.

Что вводит в заблуждение для новичков - и это случается со всеми рано или поздно - это то, что происходит, если вы переопределяете или используете непреднамеренными способами зарезервированное слово или встроенное.

Если вы

list = [1, 2, 3, 4] 

вы повторно связать имя list больше не точки к встроено типа list данных, но в списке фактических [1, 2, 3, 4] в текущей области. Это почти всегда не то, что вы намереваетесь делать. Использование переменной dir - аналогичная ошибка.

Также не используйте дополнительные скобки () вокруг квадратных скобок из списка. Кое-что вроде words = ['wer', 'werwe', 'werwe' ,'wer we'] хватает.

В целом рассмотрите, какие имена вы выберете для переменной. students Описательный, полезные комментарии, list нет. Также если list в настоящее время содержит список, ваш алгоритм может быть изменен позже с переменной, содержащей set или любым другим типом контейнера. Тогда имя переменной типа будет даже вводить в заблуждение.

+0

"вы переписываете определение и, следовательно, значение встроенного типа данных" list'. " - Неправильно. Единственное, что вы делаете, когда называете переменную подобно встроенной, - это затенение встроенного в область переменной (что в большинстве случаев не является проблемой в случае «списка», потому что не так много вариантов использования для типа, который не может быть решаются с помощью понимания списка или литерала). Самой важной проблемой при вызове переменной 'list' является то, что имя не является описательным вообще и не дает читателю никакой информации о переменной или ее содержимом, кроме очевидного факта, что это список. – l4mpi

+0

@ l4mpi: Правильно, что значение встроенного списка перезаписывается только в области этой переменной. Однако он действительно переопределяется. Иногда, отвечая на вопросы новичков, полезно не предоставлять слишком много подробных сведений. Точка о нечетких и бесполезных именах переменных также хороша, поэтому я отредактировал оба ответа. Пересмотрите нижний план (если это было сделано вами). Помните, что SO - это все, что касается наилучших ответов и конструктивной критики. Вы могли бы просто отредактировать «сферу» в ответ легко сами ... – cfi

+0

@ l4mpi: Я снова отредактировал свою формулировку, так как слово «переопределение», которое я использовал, действительно вводит в заблуждение. Спасибо за комментарий. – cfi

Смежные вопросы