python返回多個值
『壹』 求幫助,python閉包和返回函數問題
(1)unpack tuple和list, 可以讓函數返回多個值
def count():
return (1, 2, 3) # 或者 return [1, 2, 3]
# 把列表解包,把1 2 3 分別賦值給 a b c
a, b, c = count()
print a, b, c
# 輸出 1, 2, 3
(2)假設你知道Python的dict類型。Python中,在函數中定義一個變數的時候,會在一個隱藏的叫locals的dict裡面插入key-value,其中key是變數名,value是變數值。而引用一個變數的時候,則首先會在這個叫locals的dict裡面,根據變數名作為key,去查對應的值。
var = 1 # 你可以認為這里進行了 locals['var'] = 1 的操作
print var # 在對var變數進行求值的時候,就在locals['var']裡面找var變數對應的值
(3)for循環中,每次循環只是給 `i` 重新綁定值
for i in (1, 2, 3):
print i
print i
# 一次輸入 1 2 3 3
每次`for i in (1, 2, 3)`相當於在`print i`之前,進行了
`locals['i'] = 1`
`locals['i'] = 2`
`locals['i'] = 3`
的操作
所以最後的`print i`再去locals字典裡面找`i`的時候,就變成 3 了。
(4)閉包是 一個函數加上這個函數引用的外部變數
var = 1
def f():
print var
# 這里的閉包是函數 f 和 f 引用的外部變數 var
def count():
var2 = 2
def f():
print var2
# 這里的閉包是函數 f 和 f 引用的外部變數 var2
return f
拿第一個函數 f 來說。在 f 運行的時候,解釋器拿著'var'這個字元串去locals字典裡面找,發現找不到,於是在closure字典裡面找,最後closure字典裡面找,你可以認為就是找closure['var'],然後發現找到對應的值。count裡面的 f 函數同理。
(為了容易理解,我這里說謊了。實際上 f 壓根沒有closure,count裡面的 f 才有。其實closure壓根不是像locals那樣的字典)
(5)函數定義時,函數只是記錄變數的名字。
要區分什麼是名字,什麼是值。
`i = 1`這里 i 只是名字,只是一個字元串 'i' 。這句話運行完,locals['i'] = 1,就說 i 對應的值是1
def count():
fs = []
for i in range(1, 4):
# 定義一個函數,等價於運行了 locals['f'] = 真正生成的函數
# 每次循環,這里都會重新生成一個函數,然後把重新生成的函數賦值給 locals['f']
def f():
return i * i # 引用了'i'這個名字,但並不是引用了'i'對應的值
# 等價於 locals['fs'].append(locals['f'])
# f 不是函數,它只是一個名字'f'。f 引用的東西,也就是locals['f']才是真正的函數
fs.append(f)
# 於是這個for循環生成了三個函數,這三個函數是沒有名字的,這個函數運行完後,它們跟'f'這個名字就毛關系都沒有了(是的我說慌了,但可以先不管)
# 把整個列表返回,這個列表包含了三個函數
return fs
# count()返回三個函數的列表,unpack 列表的語法把列表中的三個函數抽出來,重新給他們命名為 f1, f2, f3
# 也就是說,
# locals['f1'] = 列表中的第1個函數
# locals['f2'] = 列表中的第2個函數
# locals['f3'] = 列表中的第3個函數
# 這三個函數跟'f'這個名字現在毛關系都沒有。(其實是有的,但為了說明需要簡化,現在你可以完全不管括弧裡面說的話)
f1, f2, f3 = count()
print f1(), f2(), f3()
# 好了我們運行它們,輸入都是 9
# def f():
# return i * i
這是因為 f1 現在對應的函數,裡面引用了 'i' 這個字元串,我們根據 'i '這個字元串去找它對應的值,先找到 f 當前的locals字典,發現沒有,因為函數定義的時候沒有定義 i 變數。然後再去closure['i']裡面找,因為Python是通過closure字典實現閉包的(就當它是對的好不好),所以我們可以在closure['i']找到值,這個值就是我們上一次運行的時候count函數裡面殘留的locals['i'],而由於for循環三遍之後,locals['i'] == 3,所以找到 i 的值就是3。所以最後輸出都是9
『貳』 python return同時返回三個值 返回值是什麼數據類型
Python是弱類型需要,我們並不需要知道返回值是什麼數據類型,只需要用多個標識符來接收多個返回值,每個標識符對應的類型為在方法中返回的數據類型。
『叄』 python:返回值問題
python 函數返回值有兩種形式:
1 返回一個值。
2 返回多個值。
現看看返回一個值的吧。
def firstvalue(a,b):
c = a + b
return c
print firstvalue(1,2)結果:3
再看看返回多個值的: 那怎麼可以返回多個值呢,其他的語言一般調用函數的話,只能返回一個值,可能我不太熟悉所有的語言,我知道的語言只能返回一個值,而python可以返回多個值,感覺非常方便,發代碼看下:
def secondvalue(a,b):
c = a + b
return (a,b,c)
x,y,z = secondvalue(1,2)
print 'x:',x,'y:',y,'z:',z
『肆』 python函數如何同時處理返回值以及返回內容
如圖所示,可以做一個參考
『伍』 pythonsocket服務端響應多個返回
創建 socket 對象,監聽地址
while True: serversocket.accept() 不斷接收請求
conn 其實就是 socket 對象,接受到請求之後,conn.recv(1024) 不斷拼配告接出 request,然後解析 request
conn.send(response), conn.close() 響應請求,關掉
能同時棗賣畢響應多個請求是因為把 handler 部分新增線程來處理
在 socket.accept() 之後,把凳芹 handle_connection() 放到線程處理。