亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

詳解Python傳入參數的幾種方法

系統(tǒng) 1778 0

Python傳入參數的方法有:位置參數、默認參數、可變參數、關鍵字參數、和命名關鍵字參數、以及各種參數調用的組合

寫在前面

Python唯一支持的參數傳遞方式是『共享傳參』(call by sharing)

多數面向對象語言都采用這一模式,包括Ruby、Smalltalk和Java(Java的引用類型是這樣,基本類型按值傳遞)

共享傳參是指函數的各個形式參數獲得實參中各個引用的副本;也就是說,函數內部的形參是實參的別名(alias)

這種方案的結果是,函數可能會修改作為參數傳入的可變對象,但是無法修改那些對象的標識(即不能把一個對象替換為另一個對象)

位置參數

位置參數是最簡單的傳入參數的方式,在其它的語言中也常常被使用

演示一:

            
def func(a, b):
  print(a+b)

func(1, 2) #3
          

演示二:

            
def power(x, n):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  return s

power(2, 3) #8
          

默認參數

默認參數就是在調用函數的時候使用一些包含默認值的參數

            
def power(x, n=2):
  s = 1
  while(n > 0):
    n -= 1
    s *= n
  reutrn s

power(3)  #9
power(2, 3) #8
          

定義默認參數要牢記一點:默認參數必須指向不變對象!

            
#以下這個函數如果被多次調用會在默認添加多個END字符串
def add_end(l = []):
  l.append('END')
  return l
          
            
#為了避免這個問題,應該把傳入的默認參數設置為不可變的
def add_end(l = None):
  l = []
  l.append('END')
  return l
          

可變參數

可變參數就是允許在調用參數的時候傳入多個(≥0個)參數(類似于列表、字典)

            
#這才是可變參數,雖然在使用上和列表沒有區(qū)別,但是參數nums接收到的是一個tuple(這些參數在傳入時被自動組組裝為一個元祖)
def calc(*nums):
  sum = 0
  for n in nums:
    sum += n
  return sum

>>> calc(1,2,3)
7

>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7

          

關鍵字參數

可變參數允許傳入0個~多個參數,而關鍵字參數允許在調用時以字典形式傳入0個或多個參數(注意區(qū)別,一個是字典一個是列表);在傳遞參數時用等號(=)連接鍵和值

            
#用兩個星號表示關鍵字參數
def person_info(name, age, **kw):
  print("name", name, "age", age, "other", kw)

>>> person_info("Xiaoming", 12)
name Xiaoming age 12 other{}
>>> person_info("Dahuang", 35, city = "Beijing")
name Dahuang age 35 other {'city':'Beijing'}

          

命名關鍵字參數

命名關鍵字參數在關鍵字參數的基礎上限制傳入的的關鍵字的變量名

和普通關鍵字參數不同,命名關鍵字參數需要一個用來區(qū)分的分隔符*,它后面的參數被認為是命名關鍵字參數

            
#這里星號分割符后面的city、job是命名關鍵字參數
person_info(name, age, *, city, job):
  print(name, age, city, job)

>>> person_info("Alex", 17, city = "Beijing", job = "Engineer")
Alex 17 Beijing Engineer  #看來這里不再被自動組裝為字典

          

不過也有例外,如果參數中已經有一個可變參數的話,前面講的星號分割符就不要寫了(其實星號是寫給Python解釋器看的,如果一個星號也沒有的話就無法區(qū)分命名關鍵字參數和位置參數了,而如果有一個星號即使來自變長參數就可以區(qū)分開來)

            
#args是變長參數,而city和job是命名關鍵字參數
person_info(name, age, *args, city, job):
  print(name, age, args, city)

>>> person_info("Liqiang", 43, "balabala", city = "Wuhan", job = "Coder")
Liqiang 43 balabala Wuhan Coder

          

參數組合

總結一下,在Python中一種可以使用5中傳遞參數的方式(位置參數、默認參數、變長參數、關鍵字參數、命名關鍵字參數)

注意,這些參數在書寫時要遵循一定的順序即:位置參數、默認參數、變長參數、關鍵字參數、命名關鍵字參數(和本文的行文順序一致)

這里簡單舉兩個栗子

            
def f1(a, b, c=0, *args, **kw):
  print("a = ", a, "b = ", b, "args = ", args, "kw = ",kw)
def f2(a, b, c=0, *, d, **kw):
  print("a = ", a, "b = ", b, "c = ", c, "d = ", d, "kw = ", kw)

>>> f1(1, 2)
a = 1 b = 2 c = 0 args =() kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x = 99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x':99}
>>> f2(1, 2, d = 99, ext = None)
a = 1 b =2 c = 0 d = 99 kw = {'ext':None}

          

寫在后面

關于Python參數傳遞,有以下幾點提請注意:

1)參數的傳遞是通過自動將對象賦值給本地變量名來實現(xiàn)的
函數參數在實際中只是Python賦值的另一個實例而已,因為引用可以是以指針的形式來實現(xiàn)的,所有的參數實際上都是通過指針進行傳遞的,作為參數被傳遞的對象從來不自動拷貝

2)在函數內部的參數名的賦值不會影響調用者
在函數運行時,在函數頭部的參數名時一個新的、本地的變量名,這個變量名是在函數的本地作用域內的,函數參數名和調用者作用域中的變量是沒有區(qū)別的

3)改變函數的可變對象參數的值也許會對調用者有影響
換句話說,因為參數是簡單地賦值給傳入的對象,函數就能夠就地改變傳入的可變對象,因此其結果會影響調用者;可變參數對函數來說可以做輸入和輸出的

Python的通過賦值進行傳遞的機制與C++的引用參數選項不完全相同,但是實際中,它與C語言的參數傳遞模型相當類似:

1)不可變參數“通過值”進行傳遞
像整數和字符串這樣的對象是不可變對象,它們通過對象引用而不是拷貝進行傳遞的,但是因為無論如何都不可能在原處改變不可變對象,實際的效果就很像創(chuàng)建了一份拷貝

2)可變對象是通過“指針”進行傳遞的
列表和字典這樣的對象也是通過對象引用進行傳遞的,這一點與C語言使用指針傳遞數組很相似,可變對象能夠在函數內部進行原處的改變,這一點和C數組很像

詳解Python傳入參數的幾種方法_第1張圖片

詳解Python傳入參數的幾種方法_第2張圖片

總而言之,理解Python的變量、函數的關鍵就是理解『綁定』的概念――綁定就是綁定對象,理解了這一點就好辦了

以上所述是小編給大家介紹的Python傳入參數的幾種方法詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人国产精品一级毛片了 | 久久高清精品 | 香蕉视频禁止18 | 欧美成人午夜免费完成 | 欧美一级www片免费观看 | 99久久免费精品高清特色大片 | 9热在线精品视频观看 | ww.久久| 欧美成人全部费免网站 | 视频二区欧美 | 国产精品短篇二区 | 999热成人精品国产免 | 中文字幕中文字幕在线 | 欧美视频a| 91成人在线视频 | 亚洲 欧美 中文字幕 | 欧美香蕉爽爽人人爽观看猫咪 | 一个色的综合 | 久久久无码精品亚洲日韩按摩 | 亚洲日本在线观看 | 欧美亚洲一区二区三区四 | 91婷婷色 | 国产特黄一级一片免费 | 九九365资源稳定资源站 | 天天操天天干天天透 | 国产精品人成人免费国产 | 久久99免费视频 | 亚洲国产成人精彩精品 | 久久www免费人成看国产片 | 最近中文日本字幕免费完整 | 午夜日韩在线 | 久久99国产精品视频 | 国产福利影院在线观看 | 99久久99久久久99精品齐 | 亚洲国产精品一区二区九九 | 日本xxxwww在线观看免费 | 日本在线一卡二卡毛片 | 久青草国产在线视频_久青草免 | 色爱区综合激情五月综合色 | 激情五月婷婷基地 | 中文字幕亚洲一区二区三区 |