2013-07-11 3 views
2

При просмотре codegolf, я нашел this:В чем смысл print() [] в Python?

g=input();print("Approved","Summer School","Failed")[(g<7)+(g<3)] 

Я не понимаю, что [] означает, что после печати() ... Любое пояснение?

+0

Подумайте «print',' («Approved», «Summer School», «Failed») [(g <7) + (g <3)] 'отдельно, тогда вы его получите. Это Tuple и индексирование. – falsetru

+0

FWIW, тот, кто думал, что '(...) [(g <7) + (g <3)]' была хорошей идеей, сумасшедшая! –

+0

@DavidHeffernan Это код для гольфа; * crazy * - это название игры! – arshajii

ответ

3
>>> print("Approved","Summer School","Failed")[0] 
Approved 
>>> print("Approved","Summer School","Failed")[1] 
Summer School 
>>> print("Approved","Summer School","Failed")[2] 
Failed 

Просмотреть рисунок? Это просто индексирование.

Кстати, мы всегда знаем, (g<7)+(g<3) будет >= 0 (False + False) и <= 2 (True + True).

Напомним, что bool подкласс int, и что True == 1 и False == 0 (именно поэтому мы можем добавить bool с, как это сделано выше).

Наконец, само собой разумеется, что эта путаница могла бы легко избежать с дополнительным набором круглых скобок:

print(("Approved","Summer School","Failed")[(g<7)+(g<3)]) 
+0

Возможно, вы захотите сделать это явным, что 'True' и' False' являются логическими, а 'bool' является подклассом' int' в Python и, следовательно, True' == 1 и 'False' == 0 ... –

+0

@MartijnPieters Правильно, спасибо. Я редактировал, чтобы включить это. – arshajii

2

Это просто кортежем индексации. Нет отличается от этого:

x = (1, 2, 3)[1] 

, который назначает 2 к x.

В вашем более сложном варианте выбирается элемент кортежа, а затем передается в print.

Путаница в том, что код делает вид, что вы вызываете функцию с именем print. Эта путаница была удалена в Python 3 с помощью print, превратившегося в функцию. Код в вашем вопросе делает что-то совершенно другое в Python 3.

+1

* делает что-то совершенно отличное в Python 3 *: да, терпит неудачу с 'TypeError: объект NoneType не подлежит расшифровке'. –

+0

@MartijnPieters Пожалуйста, не говорите мне, что вам нужно было выполнить это, чтобы узнать, что произойдет ......... Я ожидаю большего от ниндзя ...... ;-) –

+2

Нет. Это хуже. Я знаю исключения наизусть .. ** или ** Я просто ввел 'None [0]' в открытую подсказку Python, чтобы напомнить мне. Это 'print()' возвращает 'None' является общеизвестным, а не? –

0

print(x,y,...)[i] следует разобрать как print (x,y)[i]. Его просто печать, а затем tuple.