iT邦幫忙

0

Python 初心者詢問 -

  • 分享至 

  • xImage

非常感謝IT邦可以讓我PO文詢問 , 最近成為python的初心者 ,

正在自學 , 有一點疑問...

簡單python LEGB 邏輯求助... 請問各位大大知道 為什麼圖中:

def len(in_var):
print("called my len() function: ", end="")
l = 0
for i in in_var:
l += 1
return l
裡面都沒有呼叫到a , 卻會算出14這個字數麻?

a = 'global'

def outer():

    def len(in_var):
        print('called my len() function: ', end="")
        l = 0
        for i in in_var:
            l += 1
        return l

    a = 'local'

    def inner():
        global len
        nonlocal a
        a += ' variable'
    inner()
    print('a is', a)
    print(len(a))


outer()

print(len(a))
print('a is', a)

https://ithelp.ithome.com.tw/upload/images/20221003/201534753gWoO5Ojw8.png

感謝各位大大回答!

tryit iT邦研究生 4 級 ‧ 2022-10-03 23:41:24 檢舉
已回應,參考看看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
hokou
iT邦好手 1 級 ‧ 2022-10-04 11:16:04
最佳解答

以 "裡面都沒有呼叫到a , 卻會算出14這個字數麻?" 來看

14 是從 outer() 內的 print(len(a)) 而來
len(a) 就是 len(in_var),裡面的變數 in_vara 帶入
因此是有把 a 帶入的

a 在更前面的 inner() 已經變成 local variable
因此會是 14

感謝大大的回答! 理解了~~

0
熊熊工程師
iT邦研究生 2 級 ‧ 2022-10-03 22:39:09

len() 是 python 內部自帶取得 list 長度的函式,不可以用來單做自己命名的函式名稱及變數名稱

另外發問請善用程式碼區塊 (上方編輯選項 "</>" 字樣),會比較有人願意回復

好的 感謝你的回覆

0
tryit
iT邦研究生 4 級 ‧ 2022-10-03 23:09:42

你這個疑問你有以下幾個方向的知識必須熟悉,你可以由上往下進行Google或者提問或者看Python的官方文件
https://docs.python.org/zh-tw/3/

  1. len(data)函式:python的內建函式,可以回傳data的資料長度或者說是元素個數。但數字過大會引發Error必須注意

  2. 函式的定義以及使用方式:def 了一個函式之後該如何正確地去使用他,例如你現在在def裡面又def了一個函式之後要怎麼樣正確地調用他,老實說這個寫法對於不熟悉的人坑很大。你先熟用一層def的用法。

def a(cc):
	def len(cc):
		print(cc)	
	len(cc)
a(123)#會輸出123
print(len("12345"))#會輸出5

↑你先理解這是怎麼發生的再這樣寫

  1. 全域變數與區域變數:何為global?何為local?何為nonlocal?詳細文件裡面可以看得到,你可以實作看看

  2. 網路上滿多初級的教學,建議可以先多看看

以上先這樣,有問題可以再提問~

看更多先前的回應...收起先前的回應...

感謝您的回應. 關於您貼出來的程式碼 , 我已經理解 LEGB 的調用邏輯. 不過問題還是我貼的這個... 為何這串def 裡面沒有調用到"a" 這個name, 卻可以算出字數?

def len(in_var):
print("called my len() function: ", end="")
l = 0
for i in in_var:
l += 1
return l

提醒: 問題的重點是調用, 不是字數~~

tryit iT邦研究生 4 級 ‧ 2022-10-03 23:39:34 檢舉

這個問題在於你調用了outer()之後程式執行的流程:
因為12行,a變成"localAAAX"
執行了inner(),因為有執行nonlocal a,要不然你在執行a+=那一串東西時就會報錯
所以a變成"local@#$E%SSD"的
接下來執行print("a is",a)所以幫你把a那串東西進行輸出
重點
你執行了print(len(a))
這個len是你自訂的len,而你的len()裡面有print()所以輸出了call......function:
而你的end=''導致句子還沒進行換行
注意這邊還沒有19,你的19不是這邊來的
接下來計算你的len裡的for迴圈迭代了19次,所以你的l會被加到19,被return回去print(「len(a)」)(注意中文括弧裡的東西)
所以變成print(19),所以輸出19,最後才變成
call......function: 19

tryit iT邦研究生 4 級 ‧ 2022-10-03 23:40:04 檢舉

我個人比較好奇,為啥會寫出這個神奇的玩意兒....

這只是一個LEGB 的線上教學課題 , 可是我很好奇她裡面len的計算是怎麼被調用出來而已... 但是我有疑問, 為何for 迴圈裡面的l 會知道要加19次?

tryit iT邦研究生 4 級 ‧ 2022-10-04 00:15:59 檢舉
a = "abcde"#a是個字串or其他可以迭代物件
total = 0#計算用
for i in a:#i會把a的abcde從頭都代過一遍
    total += 1#for每跑一次就加一
    print(i)#給你驗證會跑出什麼東西用
print(total)#會輸出5

以上試試看

感謝你讓我理解裡面的呼叫邏輯!

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-10-04 09:45:54

參考下圖
或許較有幫助了解
https://ithelp.ithome.com.tw/upload/images/20221004/20001787f0qR7PuSGy.png

a = 'global'

def outer():

    def len(in_var):
        print('called len() function where [in_var={x}]'.format(x=in_var))
        l = 0
        for i in in_var:
            l += 1
        return l

    a = 'local'

    def inner():
        global len
        nonlocal a
        a += ' variable'

    inner()
    print('[a in class outer] after [inner()] is [{x}]'.format(x=a))
    print('so the length is',len(a))


outer()

print('[a in main process] is [{x}]'.format(x=a))
print('so the length is',len(a))

我要發表回答

立即登入回答