⑴ 在python函數里,不用return,怎麼把值送出來
題主好. 如果不用 return, 我們可以選擇利用傳遞參數的引用來『把值送出來』, 但這樣只能針對不變對象, 如字典, 列表, numpy 數組等等. 例如我們可以用如下代碼修改 numpy 數組:
mat = numpy.zeros((3,3))
compute_matrix( mat )
我們可以定義函數 compute_matrix 來修改參數 mat 的值, 並在這個函數結束後返回, 可以不用 return.
python 參數傳遞 (傳值或傳引用). 這篇博文將 python 中參數傳遞的情況, 什麼時候傳值什麼時候傳引用, 解釋地很清楚, 具體地:
如果函數收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值--相當於通過「傳引用」來傳遞對象。
如果函數收到的是一個不可變對象(比如數字、字元或者元組)的引用,就不能直接修改原始對象--相當於通過「傳值'來傳遞對象。
⑵ Python如何向函數傳遞參數
s=[3,2,5,1]
sorted(s,reverse=True)
默認reverse=False,排序為正序。傳入reverse=True,排序就是倒序
⑶ Python中不定長參數這樣用對嗎def hh(w,**l,pu='d'): 為什麼
題主你好,
一般來說, python函數中有兩種形式的參數: 位置參數, 關鍵字參數.
位置參數: 說白了就是在函數調用時必傳的,你不給它賦值函數就運行不了.如:
按照之前講的,調用person時,age必須要傳值,name可傳可不傳,所以調用形式可以是:
person(18), 也可以是person(18,"李四") //同時把參數名加上進行調用也可以,即person(age=18,"李四"), person(age=18, name="李四"), person(18,name="李四")這都是合法的,當然如果看著亂,記住一種就好.
**.還有一點需要注意函數定義中,位置參數一定要位於關鍵字參數前,也就是說def person(name="張三",age)這么寫是錯誤的(對於這條約定我是這么理解的, 你想啊假如位置參數位於關鍵字參數前是可行的,則我們在調用person時,即使name就是默認值"張三",我們也要傳值, 因為如果你這么寫,person(18),則18會傳給person的第一個參數name,如果你寫person("張三",18)又麻煩了,因為name的默認值就是"張三', 但我覺得使用person(age=18)還可以理解呀,不管怎麼樣吧,記住規矩就是這樣的.).
-----
下面就該引出題主問題中所謂的"不定長參數"了. 我感覺叫"任意數量的參數"更好理解一些,因為重點在於數量,而不在於長度.//至少如果我沒有看到你的實際題目,你說"不定長參數"我會理解為一個參數的值的長度不限, 而非可以有任意多個參數.
為了迎合題主, 下面就稱"不定長參數"吧.
python中一般不定長參數有兩種類型,位置不定長參數和關鍵字不定長參數, 其外在特徵是:
位置不定長參數由一個星號+變數名組成: *var //var是我隨意寫的,可以是*a,*b,*any等
關鍵字不定長參數由兩個星號+變數名組成: **key //同理,key也可以是任意名稱.
-----
不定長參數的出現其實就是為了增加函數的靈活性, 這個靈活性就體現在"可以表示任意多個參數位置參數和或關鍵字參數".
-----
最後再說回題主的問題:
def hh(w,**l,pu='d')
這個用法不對, pu='d'要放在**l前面,我說下原因:
先看一下hh這個函數中的參數類型有兩種, w是位置參數; **l和pu='d'是關鍵字參數.
因此w放在最前面沒毛病(位置參數要位於關鍵字參數前面), 而為什麼pu='d'要放在**l前面呢,因為**l表示所有的關鍵字參數都要傳給l,所以如果pu='d'寫在**l後面,則pu='d'就不起作用了,因此不能這樣寫.
=====
希望可以幫到題主, 歡迎追問.
⑷ Python 不同腳本之間傳值問題
看你的需求,應該是需要顯示def2被執行。只需要print "def2"就可以了。
你可能理解有些誤差,當py2被執行時,py1的模塊是被導入到py2中,所以對於py2來說,它與py1沒有什麼關系。只是把py1的功能拿來用。拿來後就屬於py2了。只在一個進程里執行,就象是py2自己的一樣。這就是PYTHON的特點。
另外順便說一下。如果你這樣循環執行。幾乎1秒鍾,系統的棧就滿了。很可能執行不下去了。
⑸ python 函數裡面 字典復制問題
如果是我,我會在函數裡面聲明b是global的,而不是用似是而非的傳值傳指針,你這樣寫是想說b_hash傳遞的是指針,可惜python里一旦用「=」賦值就已經相當於聲明了一個新的變數,所以你的這個問題兩種解決辦法:
第一個,把你要傳指針的東西放到列表裡:
deftest(aa,bb):
bb[0]=.deep(aa)
a={1:1}
b=[{}]
test(a,b)
printb[0]
這樣保證你可以通過b這個名字找到改變後的指針。
第二個,在函數里聲明你要修改的是全局變數:
deftest(aa):
globalb
b=.deep(aa)
a={1:1}
b={}
test(a)
printb
當然,你還可以用既不是global也不是local的局部作用域,那可以說叫閉包,但有些不好懂就不說了。。。
樓上的方法思想和第一種一樣,但是沒做深層拷貝,一層for循環沒有遞歸實現了.,而不是.deep。。。