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

py 的字符串拼接是不是有点反人类啊

  •  
  •   yxslnmp · 2017-03-17 17:45:21 +08:00 · 7050 次点击
    这是一个创建于 2589 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 url : http://www.xxx.xxx/search/user + '/' +id , id 为 int 型,结果报错,本来打算用 join 的,发现 join 函数也不允许连接一个 int 型
    我主要写 PHP 的。换 py 写感觉好不适应
    75 条回复    2017-03-20 23:51:40 +08:00
    upczww
        1
    upczww  
       2017-03-17 17:48:10 +08:00 via iPhone
    str(id)
    devzero
        2
    devzero  
       2017-03-17 17:48:58 +08:00 via Android
    url 是 str 型的,拼接要类型相同吧
    swulling
        3
    swulling  
       2017-03-17 17:49:35 +08:00 via iPhone
    请用 str.format
    jasontse
        4
    jasontse  
       2017-03-17 17:49:41 +08:00 via iPad
    强类型的差别,感觉又要吵了。。。。
    kaka826
        5
    kaka826  
       2017-03-17 17:49:41 +08:00
    eastpiger
        6
    eastpiger  
       2017-03-17 17:51:09 +08:00   ❤️ 1
    字符串拼接都是推荐"".format()来做的吧
    imn1
        7
    imn1  
       2017-03-17 17:57:30 +08:00
    这个要看人类怎么定义
    yxslnmp
        8
    yxslnmp  
    OP
       2017-03-17 17:59:22 +08:00
    @upczww
    @devzero
    @swulling
    @jasontse
    @kaka826
    @eastpiger
    感谢各位解答。。直接 str()了,写了几个月吐槽点越来越多。
    比如用 peewee 库, get 一个不存在的数据会报错,还非要 try 捕捉下, PHP 里就没有这么多蛋疼的地方
    希望随着时间的推移让我爱上 py 交易吧
    wevsty
        9
    wevsty  
       2017-03-17 18:02:05 +08:00
    py 这也算蛋疼的话,那 C++之类只能哭晕在厕所了
    liujinlingchn
        10
    liujinlingchn  
       2017-03-17 18:02:34 +08:00   ❤️ 3
    我曹, 还敢有 python 反人类的
    拉出去
    dishonest
        11
    dishonest  
       2017-03-17 18:03:42 +08:00
    @yxslnmp 这个不是 python 的锅吧
    peewee 我没用过,如果你用 django 的 ORM , get 仍然会报错,但是用 first 就不会。
    这个取决于你的需求,如果这是一个意料之外的,比如不合法访问,那么报错保护了数据,直接结束整个流程,是完全正确的;反之如果处理不存在的情况也是一种业务上的需求,你可以 try ,也可以用 first 再去处理 first 的返回值。
    kindjeff
        12
    kindjeff  
       2017-03-17 18:04:28 +08:00
    其实这个字符串拼接不自动转还是有好处的!

    ——以前用 flv.js 视频时间显示不出来,慢慢找发现我给的数字其实是字符串型,它用+号加起来的时候全部变成了巨长的数字。
    scriptkid
        13
    scriptkid  
       2017-03-17 18:05:18 +08:00
    各有各的蛋疼之处,主要看你习惯罢了
    python 这样的语言你都觉得反人类,那我还有什么话说
    dishonest
        14
    dishonest  
       2017-03-17 18:05:36 +08:00
    @yxslnmp 如果 PHP 不报错,那空值直接进入下面的业务,产生无法控制的 bug ,这个才是真反人类
    mutoulbj
        15
    mutoulbj  
       2017-03-17 18:07:32 +08:00
    如果 get 不报错,那你想获得什么结果呢
    yxslnmp
        16
    yxslnmp  
    OP
       2017-03-17 18:10:08 +08:00
    @imn1 #7
    @dishonest #14
    @scriptkid #13
    @kindjeff #12
    @dishonest #11
    @liujinlingchn #10
    @wevsty #9

    我知道错了,主要刚过来写没多久,保留了很多 PHP 的习惯,各位打住,避免引起不必要的战争
    maomaomao001
        17
    maomaomao001  
       2017-03-17 18:11:30 +08:00 via Android
    没有模板字符串也就算了,字符串拼接居然不会自动转换类型。。。。
    jkneedout
        18
    jkneedout  
       2017-03-17 18:19:04 +08:00 via iPhone
    用 c 语言的表示很淡定
    Ge4Los
        19
    Ge4Los  
       2017-03-17 18:24:09 +08:00
    字符串拼接居然用 + 。
    不用 format 也可以 % 来拼接啊。
    另外 peewee get 不到的话,还有 get_object_or_404() 的方法。
    LZ 还是多看看文档吧
    GuestID
        20
    GuestID  
       2017-03-17 18:25:12 +08:00
    就算报错,也会和你清清楚楚的说是类型错误啊。。
    Hstar
        21
    Hstar  
       2017-03-17 18:26:20 +08:00
    简单拼接比较习惯 'http://www.xxx.xxx/search/user/%d' % id 这样写
    eason622
        22
    eason622  
       2017-03-17 18:27:54 +08:00 via iPhone
    用 format()岂不是美滋滋
    yxslnmp
        23
    yxslnmp  
    OP
       2017-03-17 18:30:15 +08:00
    @Ge4Los #19 懒得用%,在 php 中简单的我一直是+来拼接

    @imn1 #7
    @Hstar
    @GuestID #20
    @Hstar #21
    @jkneedout #18
    @maomaomao001 #17
    @mutoulbj #15

    感谢各位热心解答,想不到一个小小的话题这么多人回复,小弟受宠若惊啊。

    后来人打住吧,此贴作废。下班回家
    yxslnmp
        24
    yxslnmp  
    OP
       2017-03-17 18:31:22 +08:00
    @eason622 #22 php 也有 format...我嫌麻烦,就这么简单的一个拼接。换的着上意大利炮吗

    好了不多说了,各位散了
    whwq2012
        25
    whwq2012  
       2017-03-17 19:50:12 +08:00 via Android
    推荐用 join ,性能比+高很多
    nicevar
        26
    nicevar  
       2017-03-17 19:55:33 +08:00   ❤️ 1
    所以学编程从复杂的语言开始也有好处, c++用多了觉得其他语言怎么折腾也能接受,用 kotlin 踩了一段时间坑之后觉得太爽了
    shalk
        27
    shalk  
       2017-03-17 19:59:38 +08:00
    用 perl 的时候,觉得类型随便用啊, 上下文自己感受,php 也是借鉴过来的
    kghch
        28
    kghch  
       2017-03-17 20:04:39 +08:00
    大概是还不适应吧,平心而论 python 是写起来最符合审美的语言,说到反人类,怎么没有 java
    billlee
        29
    billlee  
       2017-03-17 20:07:16 +08:00
    还好你用的不是 C.
    xavierskip
        30
    xavierskip  
       2017-03-17 20:19:18 +08:00
    还好你不是用的静态类型的语言,要不然你可以去自杀了。
    palmers
        31
    palmers  
       2017-03-17 21:07:48 +08:00
    @kghch 怎么说 java 了 类似 java 这种高级语言 更接近生活 怎么反人类了? 反人类的都是底层语言
    est
        32
    est  
       2017-03-17 21:13:17 +08:00
    《 python 的 orm 是不是有点反人类啊》

    居然不能 "select * from table where a=" + 1
    fy
        33
    fy  
       2017-03-17 21:15:36 +08:00
    @maomaomao001
    1. 模板字符串 3.6 有了, f-string ,现在生产环境是 3.5 , 3.6 并不遥远

    2. 字符串拼接自动转换类型?到时候又会来喷 1 + '1' = '11' 了
    springmarker
        34
    springmarker  
       2017-03-17 21:21:38 +08:00
    这个 xxx.xxx 域名点开后很。。。。嗯。。。。。
    zhustec
        35
    zhustec  
       2017-03-17 21:37:07 +08:00 via Android
    @liujinlingchn
    Python 本来就很反直觉啊
    icedx
        36
    icedx  
       2017-03-17 21:52:21 +08:00
    Python 是强类型语言啊
    phrack
        37
    phrack  
       2017-03-17 22:07:38 +08:00 via Android
    换语言不适应就是依然是以前语言的思维习惯问题而已,多用用就自然而然了。

    还记得用 c 换 py 的时候也有一两个月不适应。
    foo2bar
        38
    foo2bar  
       2017-03-17 22:08:38 +08:00
    python 下的字符串拼接很好用啊
    url = 'http://www.xxx.xxx/search/user/%d' %id
    PythonAnswer
        39
    PythonAnswer  
       2017-03-17 22:55:18 +08:00
    用+是 js 党的习惯啊,哈哈哈
    yunji3344
        40
    yunji3344  
       2017-03-17 23:01:47 +08:00
    同感
    WispZhan
        41
    WispZhan  
       2017-03-17 23:13:33 +08:00
    看来是需要探讨一下“第一个语言是 c/c++的重要性”。
    think2011
        42
    think2011  
       2017-03-17 23:14:02 +08:00
    ` http://www.xxx.xxx/search/user${id}` 觉得 js 的最好用, 'http://www.xxx.xxx/search/user/%d' %id 也还行
    bombless
        43
    bombless  
       2017-03-17 23:16:40 +08:00 via Android
    确实,还不如 cpp ,隐式转换都没法做(逃

    不过格式化字符串用从一串模板字符串出发其实也算是标准做法
    likuku
        44
    likuku  
       2017-03-17 23:23:50 +08:00
    果然 PHPer 的代码习惯够糟糕的哎...
    102400
        45
    102400  
       2017-03-17 23:24:06 +08:00   ❤️ 1
    与 py 交易不如和 ruby
    "http://www.xxx.xxx/search/user/#{id}"
    likuku
        46
    likuku  
       2017-03-17 23:26:35 +08:00
    @PythonAnswer 哦?+ 是 JS 习惯?今天才知道...

    我当初直接 py 上手,开始用 + 好多年,最近两年才慢慢换成 %类型 嵌入字符串里,末尾再加个 变量列表。
    limbo0
        47
    limbo0  
       2017-03-17 23:56:38 +08:00
    lz 只会 php 吗
    freestyle
        48
    freestyle  
       2017-03-18 00:06:30 +08:00
    这是强类型语言 不自动转型的 花式 format 很好用的 'http://www.xxx.xxx/search/user/{}',format(id)
    Miy4mori
        49
    Miy4mori  
       2017-03-18 00:07:24 +08:00 via iPhone
    你在 v2 吐槽 py 不是找不自在吗?😂😂😂
    uucloud
        50
    uucloud  
       2017-03-18 02:00:11 +08:00
    你随便找本新手教程看一遍再用。。省时间
    RqPS6rhmP3Nyn3Tm
        51
    RqPS6rhmP3Nyn3Tm  
       2017-03-18 02:04:30 +08:00 via iPhone
    动态类型一时爽……
    写 PHP 我感觉是没有 py 爽
    PythonAnswer
        52
    PythonAnswer  
       2017-03-18 05:00:08 +08:00
    @likuku `%` 是淘汰的方法了,社区前阵子推荐 `str.format()`

    3.6 以后可以用这个

    ```python
    >>> f'The value is {value}.'
    'The value is 80.'
    ```
    andyiac
        53
    andyiac  
       2017-03-18 08:04:32 +08:00
    习惯就好
    XYxe
        54
    XYxe  
       2017-03-18 09:43:17 +08:00   ❤️ 1
    以 CPython 2.7.11 为例,在 Objects/stringobject.c 文件的 string_concat 函数开头加上:

    ```
    if(!PyString_Check(bb) && bb->ob_type->tp_str != NULL)
    {
    PyObject *nbb = bb->ob_type->tp_str(bb);
    return string_concat(a, nbb);
    }
    ```
    然后就:

    junnplus
        55
    junnplus  
       2017-03-18 09:47:13 +08:00
    @XYxe 233333
    fengfisher2
        56
    fengfisher2  
       2017-03-18 09:47:23 +08:00
    是 python2.x 还是 3.x ?
    我觉得 python 的已很人性化了。
    precisi0nux
        57
    precisi0nux  
       2017-03-18 10:12:50 +08:00 via iPhone
    楼主一定是个假 php dev , php 里 string concatenation 明明是 '.'
    wangjie
        58
    wangjie  
       2017-03-18 11:17:36 +08:00
    可以试试写 node
    pynix
        59
    pynix  
       2017-03-18 11:41:13 +08:00
    坐等 3.6
    fuxkcsdn
        60
    fuxkcsdn  
       2017-03-18 12:24:06 +08:00
    @xavierskip 静态类型语言反而不觉得
    正因为 python 和 js 和 php 一样是弱类型的语言,所以想当然会觉得
    str + int 应该自动转换成 str + str ,还特地 str + str(int) 确实很蛋疼

    P.S. 用 python 三个礼拜有感
    wildplant
        61
    wildplant  
       2017-03-18 12:38:03 +08:00
    楼主开了喷语言的贴,是说打住就能打住的吗?不翻页已经算好了。
    billwsy
        62
    billwsy  
       2017-03-18 12:41:02 +08:00
    我觉得真正要吐槽的是运行到那一句才报错吧,要是 Python 静态类型多好
    dant
        63
    dant  
       2017-03-18 13:07:57 +08:00
    @fuxkcsdn Python 是强类型+动态类型
    exoticknight
        64
    exoticknight  
       2017-03-18 13:08:04 +08:00
    重要的是在 python 下拼接字符串就不应该用 +
    不同语言要分开对待
    exoticknight
        65
    exoticknight  
       2017-03-18 13:08:41 +08:00
    另外我记得 php 的拼接更奇葩吧,好像是用.
    vicalloy
        66
    vicalloy  
       2017-03-18 13:37:53 +08:00 via iPhone
    如果真打算用一种新语言,应当找本书仔细看看,可以少很多坑,花不了几天时间。
    你的问题都是最基础的东西,看过书都知道。另外你是在有 PHP 的思维写 python ,自然不爽。
    第一个问题是因为类型不匹配。实际上 PHP 和 js 的自动类型转换很可能带来潜在的问题。
    第二个问题,你给个默认值就不会抛错。
    xavierskip
        67
    xavierskip  
       2017-03-18 13:53:45 +08:00
    @fuxkcsdn #60 Python 应该是强类型, js 是弱类型。

    弱类型语言是指变量的类型可以被隐式转换。而强类型语言趋向于不自动转换变量类型,转换类型需要手动进行。

    https://www.v2ex.com/t/61513

    https://www.zhihu.com/question/19918532
    neoblackcap
        68
    neoblackcap  
       2017-03-18 14:02:13 +08:00
    @whwq2012 其实少量拼接的时候+跟 join 的性能相差不大。
    msg7086
        69
    msg7086  
       2017-03-18 14:58:17 +08:00
    #23 @yxslnmp 你一定是用了假的 PHP 。
    我写 PHP 的时候都是要用 . 来拼接的,你怎么会用 + 的?
    freestyle
        70
    freestyle  
       2017-03-18 15:05:04 +08:00 via iPhone
    其实 lz 是来黑 php 用.连接字符的 (doge
    jhdxr
        71
    jhdxr  
       2017-03-18 15:29:28 +08:00
    @yxslnmp 写了这么多年 PHP 我到现在才知道 php 能用+连接字符串,但怎么感觉连完的结果不大对呢→_→
    hoyixi
        72
    hoyixi  
       2017-03-18 16:22:38 +08:00
    那你用 Swift 岂不是要砸电脑,嘿嘿
    liuzhiyong
        73
    liuzhiyong  
       2017-03-19 17:09:53 +08:00 via iPad
    Python 和 php 是不同的编程语言啦,相信楼主很快就能适应。
    JerryZhang
        74
    JerryZhang  
       2017-03-20 09:09:39 +08:00
    Python 反人类的又不只这一个,何必大惊小怪的。
    Chyroc
        75
    Chyroc  
       2017-03-20 23:51:40 +08:00
    3.6 f-string:

    `f'http://www.xxx.xxx/search/user/{id}'`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3850 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.