请问关于 Python 中 string, list 的索引数字问题,和 range 函数 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lylehust
V2EX    Python

请问关于 Python 中 string, list 的索引数字问题,和 range 函数

  •  1
     
  •   lylehust 2018-11-21 12:14:27 +08:00 2520 次点击
    这是一个创建于 2564 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚开始学 python,以前用过 C 和 Matlab。学到 string 和 list 的索引数字时比较困惑。

    python 里是以元素的左边缘作为索引数字的位置,而 C 和 Matlab 直接以元素的位置作为索引数字。如下:

    x = ' P Y T H O N'
    Python:0 1 2 3 4 5 6
    C: 0 1 2 3 4 5

    这样,python 里 x[0:3]是‘ PYT',而 C 里 x[0:3]是'PYTH'。

    我比较疑惑 PYTHON 为什么这样定义,有什么好处或优势?因为我自己觉得 C 的定义更直观一些。

    另外,还有 range 函数,好像定义原理和索引数字一样。

    range(0, 4 )是 0,1,2,3,不包括 4,是指只能有 4 个数字?

    range(0, 10, 2)则是 0, 2, 4, 6, 8, 也不包括 10。

    同样的问题,为什么第二个参数不是实际边界,这样做的好处是什么?

    敬请大家帮我解惑,谢谢!
    9 条回复    2018-11-22 08:36:24 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2018-11-21 12:20:18 +08:00 via Android   1
    如果你想从某个位置切开一个字符串,就可以不用考虑加减一的问题

    ```python
    s = 'abcdef'
    p = s.index('c')
    left, right = s[:p], s[p:]
    ```
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2018-11-21 12:22:20 +08:00
    C 没有 slice,没有[0:3]这种写法,每一个下标都对应那唯一一个位置

    slice 是左开右闭区间,
    (好处是循环迭代都是先验边界再进循环体,右闭在自增时能保证被迭代变量最终不会越界,顺带一提从 0 开始的索引也是为了自减时类似效果,顺带一提这点在初学编程时应该能感觉到)

    matlab 的索引规则跟大多数编程语言不同


    还有啥问题
    GeruzoniAnsasu
        3
    GeruzoniAnsasu  
       2018-11-21 12:23:21 +08:00
    说反了 左闭右开
    Eleflea
        4
    Eleflea  
       2018-11-21 12:30:53 +08:00   1
    python 里的 slice 和 range 都是包括左闭右开。
    一是这样做有:`s = s[:i] + s[i:]`
    二是 slice 的长度可以通过左右索引之差简单的算出来。
    lniwn
        5
    lniwn  
       2018-11-21 13:02:18 +08:00   3
    《流畅的 Python 》一书第 2.4.1 节对这个问题有解释,大致说了如下几个方面:





    上面提到的延伸阅读<http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html>
    ClutchBear
        6
    ClutchBear  
       2018-11-21 13:10:24 +08:00
    ![]( )
    我觉得试一下跟容易理解
    no1xsyzy
        7
    no1xsyzy  
       2018-11-21 14:28:53 +08:00
    One way to remember how slices work is to think of the indices as pointing between characters, with the left edge of the first character numbered 0. Then the right edge of the last character of a string of n characters has index n, for example:

    +---+---+---+---+---+---+
    | P | y | t | h | o | n |
    +---+---+---+---+---+---+
    0 1 2 3 4 5 6
    -6 -5 -4 -3 -2 -1

    <https://docs.python.org/3/tutorial/introduction.html#strings>
    ddzzhen
        8
    ddzzhen  
       2018-11-21 15:58:19 +08:00 via Android
    题主想的挺多也挺好,我是强记的,左闭右开
    Outliver0
        9
    Outliver0  
       2018-11-22 08:36:24 +08:00
    你会发现 random.randint 就包含声明数字了,嘿嘿
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1050 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:46 PVG 07:46 LAX 15:46 JFK 18:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86