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/m.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燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP