亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

r = f(i) ,得到的r 是1*1,還是j*j?

def?count():
????fs?=?[]
????for?i?in?range(1,?4):
????????def?f(j):
????????????def?g():
????????????????return?j*j
????????????return?g????????????????????
????????r?=?f(i)??????????#這里r返回的是一個函數,函數內容是什么?【即:返回函數時,如何如何查看函數內容】?????
????????fs.append(r)????????????????????
????return?fs???????????????????????????
f1,?f2,?f3?=?count()
print?f1(),?f2(),?f3()


正在回答

5 回答

首先在循環中的i作為的是f的實參,而f里面的g()使用的是f的形參j來定義函數,即這里的代碼實現的是從變動的實參過渡到不變的形參來定義內層函數。

0 回復 有任何疑惑可以回復我~
參考這個函數:
def?count():
????fs?=?[]
????for?i?in?range(1,?4):
????????def?f():
?????????????return?i*i
????????fs.append(f)
????return?fs

f1,?f2,?f3?=?count()
print?f1,?f2,?f3

該函數最終會返回9,?9?,9,為什么?

在這個函數中i是count函數的局部變量

當i= 1時,i指向了1,結果返回了函數的地址放在了fs的第一個位置。

當i = 2時,又將i 指向了2,函數地址返回到了fs的第二個位置上。

當i = 3 時,i 指向了3,然后返回了函數地址在fs的第三個位置。

所以當調用函數顯示的時候,i 已經是3,所以得到的結果是一樣的。


0 回復 有任何疑惑可以回復我~

這里count()方法返回一個list——fs,列表fs中放著3個函數,這些函數已經在count函數循環過程中動態生成,此時調用這些函數,其函數返回值都不會發生改變。

0 回復 有任何疑惑可以回復我~
#1

hzCN

在這里,r得到的時函數g,并不是1*1,在程序的流程下,調用f(1), f(2), f(3),得到1,4,9
2019-12-13 回復 有任何疑惑可以回復我~

得到的是1*1吧,這里用的閉包.我理解是這樣

0 回復 有任何疑惑可以回復我~
#1

慕碼人0165219 提問者

1*1也是一個函數式function嗎?
2019-12-12 回復 有任何疑惑可以回復我~

f(i)的返回值哦,你看f(i)的定義,在def fi 中,最后,返回的是一個g,g是什么呢,g就是一個返回來的函數對象,函數對象,就是一個函數的對象。函數對象并沒有被計算,所以不出結果,所以,返回的g(1),我這里只說了for循環的第一次,然后下一次就返回一個函數對象:g(2),再下一次for循環,返回一個g(3)。

如果我哪里理解錯了,請指正。新手。。。。

0 回復 有任何疑惑可以回復我~
#1

赴約南城

至于g函數的內容,你可以去看g函數的定義,但是由于返回來的是函數,函數定義就沒那么重要了,你就當返回來的是個箱子,箱子上邊貼著個標簽,寫著1,至于箱子里怎么運算的你不用管。
2019-12-11 回復 有任何疑惑可以回復我~
#2

慕碼人0165219 提問者

我知道返回的是g函數,但是我想知道返回來的函數內容是以變量的形式(j*j)存在,還是一個有具體值的計算式(1*1),因為如果是變量的話,我就比較疑惑那這種閉包為什么就能防止內部函數調用外部參數,因為這樣不應該是j=i嗎,最后結果也很容易就是 9 9 9
2019-12-12 回復 有任何疑惑可以回復我~
#3

戰神A

r = f(i) 中將i的值賦值給了f的參數j, g引用的是g的外部函數f的變量j,g是一個閉包
2019-12-17 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
python進階
  • 參與學習       255563    人
  • 解答問題       3038    個

學習函數式、模塊和面向對象編程,掌握Python高級程序設計

進入課程

r = f(i) ,得到的r 是1*1,還是j*j?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號