iT邦幫忙

0

Python解讀問題

Hi,各位大神好,小弟初學Python,這段程式碼是照著書打的思考後有一段還是不太懂...所以上來邦幫忙技術版詢問

-------------------------以下程式碼-------------------------
start1 = ["fee" ,"fie" ,"foe"]
rhymes = [
("flop","get a mop"),
("fope","turn the rope"),
("fa","get your ma"),
("fudge","call the judge"),
("fat","pet the cat"),
("fog","walk the dog"),
("fun","say we're done")
]
start2 = "Someone better"

start1_caps = " ".join([word.capitalize() + "!" for word in start1]) #這段不太懂
for first, second in rhymes:
print(f"{start1_caps}{first.capitalize()}!")
print(f"{start2}{second}.")

-------------------------分隔線-------------------------
start1_caps = " ".join([word.capitalize() + "!" for word in start1])
print(start1_caps)
印出結果是:
Fee! Fie! Foe!

這段似乎是用很簡易(一行程式碼就可以完成一個迴圈)的方式打出來的,雖然很COOL看起來也很厲害!但我還在對這種寫法要解讀還有點吃力的階段QQ

看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 4 級 ‧ 2020-12-02 09:14:56 檢舉
Google搜 "python join 用法" 首先你先了解str.join()怎麼玩,就不覺得利害了,再來是python有些語法糖使用上很便利,例如它可以在串列裡動態賦值,原本我們在其它程式語言裡要用到陣列並同時賦值可能是這樣:
var my_arr=Array(0,1,2,3,4,5.....99); //以javasrcript為例
如果陣列內容有1萬個肯定不能這麼搞,
而在Python裡很簡單的可以達到同樣效果,例如:
my_arr=[i for i in range(0,100)] # my_arr=[0,1,2....99]
看得懂上面的[ ... for...] 加上 str.join() 應該就可以理解了
主要是現階段看到這種一行就結束的程式碼會愣住,不知道在幹麻?雖然很酷,但真的不方便閱讀,可能我經驗值還太弱了...
start1_caps = " ".join([word.capitalize() + "!" for word in start1])

向下方有人回答這種就比較方便閱讀(引薦一下海綿寶寶打的XD)
start1 = ["fee" ,"fie" ,"foe"]
#print(start1)

start1_caps = []
for word in start1:
start1_caps.append(word.capitalize()+"!")
#print(start1_caps)

print(" ".join(start1_caps))
ccutmis iT邦高手 4 級 ‧ 2020-12-02 10:14:45 檢舉
別擔心 剛開始一定是這樣的 看多了你再看到就會講NMB了... 別誤會不是髒話,是"你麻痺"了 我剛開始自學Python的時候也是這樣 多練習拆解 把看似複雜的碼分割簡化
froce iT邦大師 1 級 ‧ 2020-12-02 10:22:54 檢舉
習慣就好。茶
這種寫作習慣在python會很常用,因為寫的code少,習慣的話很好閱讀,而且還比迴圈快,不過建議不要用到2層以上的for,會影響閱讀性。

然後建議在寫 List Comprehension 這種東西的時候要斷行。
像你這句這樣斷一下就很容易看懂。
start1_caps = " ".join(
[word.capitalize() + "!" for word in start1]
)
for ccutmis
不知道什麼時候才可以講NMB XD常常忘東忘西的不停的往前翻前面教的東西...崩潰...

for froce
woo小技巧呢!@@

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-12-02 09:17:06

參考看看

start1 = ["fee" ,"fie" ,"foe"]
print(start1)

start1_caps = []
for word in start1:
   start1_caps.append(word.capitalize()+"!")
print(start1_caps)

print(" ".join(start1_caps))

thing for thing in list-of-thing
W3School python join 第一個範例

這種打法就很清楚的知道那個結果是怎麼出來的了XD
也感謝糾正我發錯邊~抱歉當下沒注意到我發到技術版了(其實也沒注意到這邊有分技術和發問..)QQ

3
hokou
iT邦新手 3 級 ‧ 2020-12-02 09:22:32

我簡單解讀如下,再請補充
跑 for 迴圈

for word in start1

依序得到 start1 的 3 個值

start1 = ["fee" ,"fie" ,"foe"]

fee
fie
foe

字首大寫+!

word.capitalize() + "!"

Fee!
Fie!
Foe!

以空格(" ")組合在一起

" ".join()

Fee! Fie! Foe!

==補充回應的問題
2.但是如果換這種方法(想直接新增到start1)就無法新增驚嘆號到word裡面,應該說在提取word的時候就已經發現他沒有新增"!"了

start1 = ["fee" ,"fie" ,"foe"]

for word in start1:
    word.capitalize() + "!"
    print(word)
    a = word.capitalize() + "!"
    print(a)

主要在於 word 是取 start1,因此 print(word) 會印出

fee
fie
foe

轉化後的 word 值要記得再給一個變數,如下為 a
不然 word 還是 word

a = word.capitalize() + "!"
print(a)

Fee!
Fie!
Foe!

3.這方法更慘,直接無限驚嘆號給你看...

start1 = ["fee" ,"fie" ,"foe"]

for word in start1:
    start1.append(word.capitalize() + "!")
    # print(word)
    # print(" ".join(start1))
    print(start1)

因為 word 是從 start1 來
但你迴圈內卻一直增加內容(append)到 start1
所以愈跑愈長

print(start1)

['fee', 'fie', 'foe', 'Fee!']
['fee', 'fie', 'foe', 'Fee!', 'Fie!']
['fee', 'fie', 'foe', 'Fee!', 'Fie!', 'Foe!']
['fee', 'fie', 'foe', 'Fee!', 'Fie!', 'Foe!', 'Fee!!']
['fee', 'fie', 'foe', 'Fee!', 'Fie!', 'Foe!', 'Fee!!', 'Fie!!']
['fee', 'fie', 'foe', 'Fee!', 'Fie!', 'Foe!', 'Fee!!', 'Fie!!', 'Foe!!']
...
...
看更多先前的回應...收起先前的回應...
ccutmis iT邦高手 4 級 ‧ 2020-12-02 11:27:23 檢舉

/images/emoticon/emoticon12.gif

1.發現(新增進去start1_cap的方法),可以出現驚嘆號
start1 = ["fee" ,"fie" ,"foe"]
start1_cap = []
for word in start1:
start1_cap.append(word.capitalize() + "!")
print(start1_cap)

2.但是如果換這種方法(想直接新增到start1)就無法新增驚嘆號到word裡面,應該說在提取word的時候就已經發現他沒有新增"!"了
start1 = ["fee" ,"fie" ,"foe"]

for word in start1:
word.capitalize() + "!"
print(word)
print(" ".join(start1))

3.這方法更慘,直接無限驚嘆號給你看...
start1 = ["fee" ,"fie" ,"foe"]

for word in start1:
start1.append(word.capitalize() + "!")
print(word)
print(" ".join(start1))

第一個沒什麼問題~

第二個沒有加"!"我能理解,不過為什麼連轉大寫都沒有@@?

第三個無限迴圈透過debug模式已經知道為什麼會無限迴圈了,
start1會回傳到word加驚嘆號,加入後start1 list後面會直接新增驚嘆號的值,word抓不完又一直新增驚嘆號,所以就形成無限迴圈

hokou iT邦新手 3 級 ‧ 2020-12-02 14:33:47 檢舉

a981406015
更新在原本的回覆裡
可以再看看
(已補上

了解了~感謝你的熱心回答,最佳解答絕對獻給你了/images/emoticon/emoticon41.gif
for word in start1:
a = word.capitalize() + "!" #這邊給它一個變數就可以了
print(a)

hokou iT邦新手 3 級 ‧ 2020-12-02 20:30:10 檢舉

/images/emoticon/emoticon08.gif

我要發表回答

立即登入回答