Python 板


LINE

: 推 tzouandy2818: print("Name:" + str(name)) 09/16 22:25 : → tzouandy2818: 不知道用逗号跟转字串连接差在哪 不过应该还是f-str 09/16 22:25 : → tzouandy2818: ing比较好 09/16 22:25 稍微展开来说说,关於使用逗号、加号 以及 f-string 一些容易混淆的地方。 首先来试试以下的程式: >>> str1 = "Hello" >>> str2 = "World!" >>> print(str1, str2) Hello World! >>> print(str1 + str2) HelloWorld! >>> print((str1, str2)*3) ('Hello', 'World!', 'Hello', 'World!', 'Hello', 'World!') >>> print((str1 + str2)*3) HelloWorld!HelloWorld!HelloWorld! 在这个例子可以「猜」出来: 1. 使用逗号时,具体的操作其实是传递   两个引数 str1 与 str2 给 print()   被放置在 tuple 中保持顺序 2. 使用加号时,是将字串经过连结之後   的结果(一个新的字串)传递下去 CPython 直译器在执行程式时,会先将其 翻译成一系列的位元组码(byte code), 我们可以透过 dis 来分析一下究竟他们 做了些什麽: >>> import dis >>> def fun1(str1, str2): return str1, str2 >>> def fun2(str1, str2): return str1 + str2 >>> dis.dis(fun1) 2 0 LOAD_FAST 0 (str1) 2 LOAD_FAST 1 (str2) 4 BUILD_TUPLE 2 6 RETURN_VALUE >>> dis.dis(fun2) 2 0 LOAD_FAST 0 (str1) 2 LOAD_FAST 1 (str2) 4 BINARY_ADD 6 RETURN_VALUE 这样是不是更清楚了一些? --- 至於原生字串与 f-string 的差异,我们 来看看 PEP 498 里怎麽说的: Regular strings are concatenated at compile time, and f-strings are concatenated at run time. [REF] https://hhp.li/ZDsgG 让我们多分析一个函数: >>> def fun3(str1, str2): return f'{str1} {str2}' >>> dis.dis(fun3) 2 0 LOAD_FAST 0 (str1) 2 FORMAT_VALUE 0 4 LOAD_CONST 1 (' ') 6 LOAD_FAST 1 (str2) 8 FORMAT_VALUE 0 10 BUILD_STRING 3 12 RETURN_VALUE 大概是这样,至於实际上开发时要怎麽选择 ,我认为这个没有标准答案。多数的情况下 我会选择使用 f-string 处理,因为相较於 加号来说,写起来更具可读性,并且能够处 理不同资料型别的输入。 关於效率的差异,可以用 timeit 去做测量 ,当然他的结果会根据使用的机器有所不同 : >>> from timeit import timeit >>> timeit('str1 + str2', setup='str1, str2 = "Hello", "World"') 0.06561679998412728 >>> timeit('f"{str1} {str2}"', setup='str1, str2 = "Hello", "World"') 0.09325840001110919 建议把引数数量增添到三个、四个、五个再 做一次测试,懒得自己测试就看一下别人的 测试结果: String concatenation with + vs. f-string [REF] https://hhp.li/bZH9Q --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 223.141.109.67 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1663390765.A.E1C.html
1F:推 tzouandy2818: 感谢补充 09/17 13:26
2F:→ tzouandy2818: 虽然本来想说用Python就不要在计较效率了 可是看到 09/17 13:27
3F:→ tzouandy2818: 效率差那麽多 又忍不住想计较 09/17 13:27
4F:推 lycantrope: fstring 跟concat功能差很多,本来就不能单纯比效能。 09/17 14:03
5F:→ Hsins: 实际上效能差异并没有特别显着啦.... 09/17 14:06
6F:推 vic147569az: 感谢H大开示 09/17 14:12
7F:推 lycantrope: 没错,而且大部分时候concat都比较慢 09/17 14:34
8F:→ Hsins: 通常 f'{var}' 也比 str(var) 要来的快,後者多了一个呼叫 09/17 14:41
9F:→ Hsins: 函数的操作,一样可以透过 dis 来做确认 09/17 14:41
10F:推 Schottky: 推 09/17 17:16
11F:推 cloki: 推 09/19 01:36







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP