2013-06-14 3 views
1

Так что давайте просто сказать, что я был код, который пошел что-то вроде:странно (МОГ) запрос начинающего Пайтона

x = 'foobar' 

, и я хотел напечатать первую половину (Foo), а затем второй (бар). Можно было бы подумать, что это будет либо записать подсчетом первую букву, как «0», как первый пункт в списке -

x = 'foobar' 
print x[0:2] 
print x[3:5] 

-или считая первую букву как «1»:

x = 'foobar' 
print x[1:3] 
print x[4:6] 

Но через несколько проб и ошибок я обнаружил, что первое значение (значение перед «:») отсчитывается от 0, тогда как второе значение (одно после «:») подсчитывается от 1. Таким образом,
Правильный код:

x = 'foobar' 
print x[0:3] 
print x[3:6] 

Я получаю это сейчас, но почему это? Есть ли какая-то причина?

+0

Связанные: [Python-фрагмент нотация] (http://stackoverflow.com/questions/509211/the-python-slice-notation), 'х [1: 3]' равно 'х [1] + x [2] ',' 3' не является исчерпывающим. –

+0

первый аргумент является включительным, а второй - исключительным. если оба были включены/исключительны, вы не сможете выбрать одиночные символы или граничные символы – shyam

+0

@shyam Wbu 'x [1]' или 'x [1: 1]', предположив, что оба включены? –

ответ

1

На самом деле второй элемент диапазона указывает на элемент после этого элемента, который мы хотели бы извлечь из str. Представьте себе, что, как for (i = 0; i < 3; ++i) ..., если я могу выразить, что такой способ :-)

+0

Ох. Понимаю. почему это делается именно так? –

+0

@ user2485209: Это имеет смысл, если вы копаете немного глубже. 'x [: 3]' (что совпадает с 'x [0: 3]'), дает вам 3 символа. 'x [0: 3] + x [3: 6] + x [6: 8]' дает вам 'x [0: 8]'. 'x [: - 3] == x [: len (x) -3]'. –

+1

@PetrViktorin Ваше объяснение на самом деле не имело никакого смысла. –

0

Пожалуй, лучше думать в математической нотации:

x[a:b] 
x[i], i ∈ [a, b) 
x[i], a <= i < b 

Отрицательное число отсчитывает с конца, например:

x[-1] # last element 
x[:-1] # all except last 
x[1:-1] # all except first and last 

Я надеюсь, что это способ мышления немного помогает!

4

Я понимаю, почему вы в замешательстве, но это имеет смысл, как только вы привыкнете к нему. Мне нравится думать о числах как промежутках между элементами, где вы делаете разрез, если это имеет смысл.

 0 --- 1 --- 2 --- 3 --- 4 --- 5 --- 6 
str = [ f  o  o  b  a  r ] 

      0 --- 1 --- 2 --- 3 
str[0:3] = [ f  o  o ] 

      3 --- 4 --- 5 --- 6 
str[3:6] = [ b  a  r ] 
Смежные вопросы