Re: [問題] 函數有無返回值?
※ 引述《sagwow (不是我)》之銘言:
: 菜鳥我在學Python時,有個最大的疑惑就是:
: "為什麼有些函數需要有東西去接,有些不用?"
: 另外,在學這些函數時有方法知道到底要不要用=嗎?
: 還是只能看範例照做,或是看說明文件了?
推
12/28 07:55,
12/28 07:55
→
12/28 07:56,
12/28 07:56
→
12/28 07:58,
12/28 07:58
→
12/28 07:59,
12/28 07:59
→
12/28 08:01,
12/28 08:01
→
12/28 08:02,
12/28 08:02
→
12/28 08:03,
12/28 08:03
推
12/29 09:04,
12/29 09:04
推
12/29 15:09,
12/29 15:09
→
12/29 15:13,
12/29 15:13
→
12/29 15:13,
12/29 15:13
→
12/29 15:16,
12/29 15:16
→
12/29 15:18,
12/29 15:18
→
12/29 15:21,
12/29 15:21
推
12/29 15:35,
12/29 15:35
先說結論, 以 Python 內建函式而言, 其實哪個要怎麼用很有邏輯, 只是看不看得出來
英文母語使用者應該會覺得這非常直覺, 英文不好的話也有幾個簡單識別方法
首先你要考慮這個函式的結果和函式附著的東西是不是類似
這邊類似的意思是有點直覺上的意義
舉例而言
>>> s = 'foo bar rex'
>>> s.split(' ')
這個 split 的目的是把一個 str 分成很多個
Split 附著在 str 上, 但是輸出是很多個 str (實際上是 list), 這就叫不類似
所以 split 會回傳一個新東西, 和 s 無關
>>> a = ['Apple', 'Banana']
>>> a.append('Citron')
這裡 append 是把東西塞到 a 的最後面
被附著的是 a, 輸出...就是原本那個 a, 只是最後多了一個東西, 這就是類似
所以 append 不會回傳任何東西, 因為你用本來那個 a 就好
接下來是全域函式
全域函式因為沒有被附著在任何東西上, 所以都得回傳東西
所以 len 永遠都會回傳, sorted 也是同樣的道理
因為理解上不同, 全域函式的名字也會和附著在東西上面的有點不一樣
len # 名詞, length 的縮寫, len(s) 可以理解成 s 的 length
sorted # 形容詞, sorted(a) 理解成 a 的 sorted (的變化)
s.split # 動詞, 理解成去 split s 這個東西
a.sort # 動詞, 理解成去 sort s 這個東西
其他可以自己類推
所以只要記得那個動作的對應英文詞, 就可以猜函式名稱
再根據函式名稱與動作的意義, 去推得那個函式的使用方法
最後一個問題是, 為什麼 append 是附著在 list 上, 但是 len 卻是全域
這就牽涉到這個動作到底廣不廣泛
Append 基本上只對 list 有用, 把它放在全域太浪費了, 所以附在 list 上面
另一方面長度這個概念很多東西都有, 在每個類型上實作太麻煩, 所以直接全域[1]
[1]: 這有點算 Python 的特例, 很多現代語言是把 len 用繼承的放在類型上
但是 Python 剛開始發展的時候並沒有現代的繼承概念, 沒辦法這麼做
全域名稱用掉就沒有了, 所以 Python 也會盡量避免新增, 盡量找其他合理方案
只有像 len sorted 這些沒有更好寫法的才會這樣用
所以有 list.append(), 但是卻沒有這種函式
>>> a = ['Apple', 'Banana']
>>> appended(a, 'Citron') # Does not work.
因為可以用加法取代, 反正這個運算符在 list 上也沒什麼其他好用法
>>> b = a + ['Citron']
>>> b
['Apple', 'Banana', 'Citron']
>>> a
['Apple', 'Banana']
其實學語言一開始都是這樣, 你都不知道為什麼要這樣命名, 感覺就只能背
但是學了一陣之後如果你有認真思考, 就會開始發現後面的邏輯
接下來就能真的開始學會這個語言
學程式的時候重點不是背, 而是想辦法知道背後的道理
只有當你懂了道理, 才能開始在面對之前沒看過的問題時, 該怎麼處理
當然這不是永遠行得通, 有些語言或者函式庫本身就是沒什麼道理
但幸好 Python 至少在內建函式上還是很有道理的, 所以才說很適合程式初學者
當你學會了 Python 的道理, 也就學會了找道理的方法, 就更容易學其他程設能力
也才能分辨什麼東西其實沒有道理, 不會傻傻的想搞懂它
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.19.12
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1514546205.A.FEE.html
→
12/29 21:18,
7年前
, 1F
12/29 21:18, 1F
→
12/29 21:20,
7年前
, 2F
12/29 21:20, 2F
→
12/29 21:21,
7年前
, 3F
12/29 21:21, 3F
→
12/29 21:22,
7年前
, 4F
12/29 21:22, 4F
推
12/29 21:37,
7年前
, 5F
12/29 21:37, 5F
→
12/29 21:37,
7年前
, 6F
12/29 21:37, 6F
→
12/29 22:31,
7年前
, 7F
12/29 22:31, 7F
→
12/29 22:35,
7年前
, 8F
12/29 22:35, 8F
→
12/29 22:35,
7年前
, 9F
12/29 22:35, 9F
→
12/29 22:38,
7年前
, 10F
12/29 22:38, 10F
推
12/30 00:17,
7年前
, 11F
12/30 00:17, 11F
推
12/30 08:21,
7年前
, 12F
12/30 08:21, 12F
推
01/02 21:06,
8年前
, 13F
01/02 21:06, 13F
討論串 (同標題文章)