首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

刚发现 Python 一个现象,求解释

  •  
  •   MartinWu · 75 天前 · 1530 次点击
    这是一个创建于 75 天前的主题,其中的信息可能已经有所发展或是发生改变。
    long_str = ("This is a long %s" % "story." "And you are welcome to %s." % "listen")
    

    是没有语法错误的。 然后,

    long_str = ("It is %d stories." % 3 )
    

    也是没问题的。 最后,

    long_str = ("我编不下去了,随便搞%d 个测试" % 123 "这是一个%s 测试啊" % "有趣的")
    

    就是说这种方式来组合字符串, % 后的元素穿插在中间的,只能是字符串,其他类型元素,只能安排在最后。 不然会报语法错误。大家知道是那部分的 python 文档解释到吗?

    第 1 条附言  ·  75 天前
    看了各位大佬的回复,我觉得是 @Alexhex 大佬才说到点子上(或者说,解答了我的疑惑)。实际上就是运算优先级的问题,导致了我的疑惑。谢谢各位解惑的大佬。
    第 2 条附言  ·  75 天前
    啊,上面 @ 错了, 是 @wnh3yang 大佬才对!
    第 3 条附言  ·  75 天前

    我觉得重点是:

    只用空格分开的两个字符串,会被解释成一个字符串。

    其实这其中也就不涉及运算优先级的问题了。

    12 回复  |  直到 2019-04-11 15:01:38 +08:00
        1
    wnh3yang   75 天前   ♥ 1
    我不是程序员,但我看出来错误了。

    <img src="https://img.vim-cn.com/ff/7eeb833337ed48124facf6489efb169a13a141.png" alt="">

    两个字符串放一起会自动拼成一个字符串, 数字和字符串放一起报语法错误。
        2
    lithiumii   75 天前
    % 是用来把变量插到字符串里面的,当然是完整的字符串写前面,别的扔后面……
    但是,我从来没学会过用 %,跟谜语似的。反正你写 py 的话建议用 str.format(),比如:

    long_str = ("我编不下去了,随便搞{}个测试这是一个{}测试啊".format(123, "有趣的"))

    https://docs.python.org/3.7/library/string.html#formatstrings
        3
    MartinWu   75 天前
    @lithiumii #2 但是我觉得你的这个解释没法解释为什么:

    ``` python
    long_str = ("This is a long %s" % "story." "And you are welcome to %s." % "listen")
    ```

    语法没报错,这也是中间穿插了一个 % 渲染,只是这里是"story" 而不是 123。
        4
    besto   75 天前
    123 '错误'
    '123' '正确'

    好理解一点了么
        5
    Alexhex   75 天前
    你试着 print 一下第一个。
        6
    Alexhex   75 天前
    说错了,你试着 print 一下下面这个:

    long_str = ("This is a long %s, but" % "story." " you are welcome to %s." % "listen")
        7
    wnh3yang   75 天前   ♥ 1
    @MartinWu

    我觉得是运算优先级的问题:

    ``` python
    long_str = ("This is a long %s" % "story." "And you are welcome to %s." % "listen")
    ```

    "story." "And you are welcome to %s." 最先合并成一个字符串。会变成:
    ``` python
    long_str = ("This is a long %s" % "story.And you are welcome to %s." % "listen")
    ```

    再变成
    ``` python
    long_str = ("This is a long %s" % "story.And you are welcome to listen.")
    ```

    再变成
    ``` python
    long_str = ("This is a long story.And you are welcome to listen.")
    ```


    所以
    ``` python
    long_str = ("我编不下去了,随便搞%d 个测试" % 123 "这是一个%s 测试啊" % "有趣的")
    ```

    123 "这是一个%s 测试啊"

    这个数字和字符串合并的过程会报语法错误
        8
    LFly   75 天前
    print(123 "long str")
    print("123" "long str")
    long_str = ("我编不下去了,随便搞%s 个测试" % 123, "这是一个%s 测试啊" % "有趣的")
        9
    Tink   75 天前
    "123"
        10
    lihnzx   75 天前
    "我编不下去了,随便搞%d 个测试" % 123 + "这是一个%s 测试啊" % "有趣的"

    没明白你的意思
    拼接字符串使用 format 或 join 性能更高一点
        11
    rrfeng   75 天前 via Android
    ("aaaa" "bbbbb") == ("aaaabbbbb")
    (3 "aaaaaa") = error


    看懂这个就好了跟 % 没关系
        12
    lithiumii   75 天前
    @MartinWu
    圆括号里面放字符串并且不加逗号,视同一个长的字符串,放别的类型不行
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3870 人在线   最高记录 5043   ·   Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 08:26 · PVG 16:26 · LAX 01:26 · JFK 04:26
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1