py 的字符串拼接是不是有点反人类啊 - 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
yxslnmp
V2EX    Python

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

  •  
  •   yxslnmp 2017-03-17 17:45:21 +08:00 7682 次点击
    这是一个创建于 3134 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 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 的习惯,各位打住,避免引起不必要的战争
    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...我嫌麻烦,就这么简单的一个拼接。换的着上意大利炮吗

    好了不多说了,各位散了
    syahd
        25
    syahd  
       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/div>
    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 是弱类型。

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

    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     Solana     1089 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:18 PVG 07:18 LAX 16:18 JFK 19:18
    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