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
GTD
V2EX  ›  Python

问一个 Python 的简单语法区别, for i in list 和 for i in range 的区别?

  •  
  •   GTD · 2020-05-13 19:20:45 +08:00 · 5387 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已知 list = [1,2,3,4,5]

    for i in list 和 for i in range(len(list))

    有什么区别呢?感谢
    21 条回复    2020-05-14 17:30:03 +08:00
    Pagliacii
        1
    Pagliacii  
       2020-05-13 19:24:05 +08:00   ❤️ 1
    前者是遍历列表元素,后者是遍历 [0, len(list)) 序列的元素
    wenqiang1208
        2
    wenqiang1208  
       2020-05-13 19:24:15 +08:00   ❤️ 1
    。。。。
    for i in list : i 是 list 里面的元素的值
    for i in range(len(list)) :i 是 range 新生成迭代器( 0,1,2,3,4 )里的元素
    GTD
        3
    GTD  
    OP
       2020-05-13 19:24:24 +08:00
    哦哦 我明白了,for i in list 的话,是把 i 变成 list 的每一个,然后每次增加一个,按 1,2,3,4,5 来。in range 的话,就一定是从 0-5 这样来
    GTD
        4
    GTD  
    OP
       2020-05-13 19:25:37 +08:00
    不好意思我丢人了。。。好久没写 Python,刚刚突然发现用 range 可以,直接 in list 不行,哈哈哈
    Pagliacii
        5
    Pagliacii  
       2020-05-13 19:26:19 +08:00
    只是恰好你的列表元素是数字而已
    cz5424
        6
    cz5424  
       2020-05-13 19:28:48 +08:00 via iPhone   ❤️ 1
    for i in range(1, 5)举一反三
    cz5424
        7
    cz5424  
       2020-05-13 19:29:04 +08:00 via iPhone
    @cz5424 写错,应该是 6
    ipwx
        8
    ipwx  
       2020-05-13 19:30:03 +08:00   ❤️ 1
    @GTD 。。。你还是理解错了。python 的 for 从来没有“i 累加”这个语义,都是“foreach”的语义。
    arrow8899
        9
    arrow8899  
       2020-05-13 20:02:12 +08:00
    还可以这样写
    for index, value in enumerate(list):
    print (index, value)
    效率更高,也更简洁
    crella
        10
    crella  
       2020-05-13 20:02:41 +08:00 via Android
    实现了 iterable 就行(好像是这样吧
    crella
        11
    crella  
       2020-05-13 20:04:11 +08:00 via Android
    感觉动态语言的发展方向都差不多,啥时候 nodejs 也能支持 for 或者 each 迭代?(
    crella
        12
    crella  
       2020-05-13 20:10:35 +08:00
    sorry,又暴露了我的无知,js 对应的是 for (let value of/in list){...}
    l1nyanm1ng
        13
    l1nyanm1ng  
       2020-05-13 20:12:04 +08:00
    @crella 直接用 Array.prototype.forEach 或者 Array.prototype.map 岂不美哉,感觉都好久没用过命令式的 api 了
    zhanglintc
        14
    zhanglintc  
       2020-05-13 22:01:51 +08:00
    我还以为是在问 list 和 generator 的区别, 结果是这个.

    list 里放点别的东西差别就很明显了嘛.
    sudoy
        15
    sudoy  
       2020-05-13 23:10:11 +08:00   ❤️ 1
    楼上说的对,你放点别的东西,别放 12345,这样一眼就看出来。一个是值,一个是 index

    mylist = ['google', 'facebook', 'microsoft']

    for x in mylist:
    print(x) # 输出结果应该是 google, amazon, facebook

    for y in range(len(mylist)):
    print(y) # 输出结果应该是 0, 1, 2
    Enying
        16
    Enying  
       2020-05-14 00:05:13 +08:00 via Android
    大家都是正解
    sunmker
        17
    sunmker  
       2020-05-14 09:23:42 +08:00
    前者是遍历,后者是取下标,list 有下标,别的嘞?
    julyclyde
        18
    julyclyde  
       2020-05-14 09:55:29 +08:00
    @sunmker 后者也不是取下标
    24bit
        19
    24bit  
       2020-05-14 10:25:23 +08:00
    本质上都是一样的,只要实现了迭代器协议就可以用 for ... in 语法,range 对象迭代时返回的是数字而已
    llsquaer
        20
    llsquaer  
       2020-05-14 11:32:32 +08:00
    for i in list:
    print('i') 表示遍历列表,并打印 i 的值( 比如 a b c d).你的案例看不出区别

    for i in range(len(list)):
    print('i') 表示遍历的次数,并打印迭代后的数值

    当然 你问题 有 list 和 range ...list 是列表,,而 range 简单理解为计数用的.
    northisland
        21
    northisland  
       2020-05-14 17:30:03 +08:00
    python3 里 range 返回的是迭代器,和 list 不一样,运行时才生成。

    python2 里木有什么区别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3638 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:30 · PVG 18:30 · LAX 03:30 · JFK 06:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.