元組的reference前加個星號是什麼意思?

來源:互聯網
上載者:User
rect = (0, 0, screen.width(), screen.height())  pixbuf = Gdk.pixbuf_get_from_window(rootwin, *rect)#其中*rect是什嗎?

回複內容:

我不會用PyGObject, 純討論 星號參數這個文法.

類似問題(也許對你有協助):
定義函數def func(**kwargs):print kwargs調用函數的時候 一定要func(a=1,b=2,c=3)這樣嗎?dict_t={'a':1,'b':2,'c':3}不能直接傳字典嗎?例如func(dict_t)。有什麼好方法嗎?

Python 參數知識(變數前加星號的意義)



咱們先搞定星號參數的含義以及2個例子:

在參數名之前使用1個星號,就是讓函數接受任意多的位置參數。
2個星號就是接受任意多的關鍵字參數。


位置參數的舉例:
假設你有這麼個需求: 把某函數接收到的除了第一個參數之外的所有參數輸出。



關鍵字參數的舉例:
不管你傳入多少個關鍵字參數, 我都能在kw裡找到.




接著來搞定這個類似於你在問題中的補充資料中的例子:


下面這個例子接受任意多的位置參數, 只輸出第一個
(這裡的 s 的類型是元組)


咱們定義一個新元組,待會扔給mean函數。


2種用法的區別:

可以看出,用了星號之後,就把元組 a 給解包(unpack)了。拆成一個個參數扔進去了。
上面這個例子等價於:




================== 2013-2-26更新 ================


s 是元組, 所以值不可修改。
我這裡企圖把位置參數裡的第1個的值修改成5,然後輸出。


使用元組看看:

我們換成列表看看:
用字串看看:

我們這裡拆了列表,元組,字串變成位置參數再傳進去。
可以看到不論如何。s 都是元組。
儲存位置參數的這個 s 變數的類型 並不取決於傳入的參數的類型。




================= 再隨便多寫一些例子 =================:
普通函數:

文藝函數:





mean 遍曆輸出所有位置參數。s 是元組,別忘了。
咱們拆一下 列表 和 字串。
拆元組:


拆字典:


拆字典它只會把[鍵]傳進去,你是取不到值的。



====== 要接受拆字典的值。函數形參用2個星號就行了。=======

這裡的意思是: 把所有的關鍵字參數都扔給s (不包括位置參數)
用函數時,用函數時,
c前面的2個星號只是代表把 c 拆成關鍵字參數形式。

用的時候我們把字典拆成了關鍵字參數。
而函數接收的也是關鍵字參數。所以這個不會報錯。


等價於這麼用:(沒報錯吧哈哈。)(沒報錯吧哈哈。)



如果你用函數的時候只給了1個星號:

或是不給星號:
都是會報錯的。都是會報錯的。


為什嗎??

放1個星號:
字典前面放個1個星號的確是拆開的意思。
1個星號拆字典會只是傳入[鍵]。之前的一個例子證明過了。

問題是我們的函數mean它只接受關鍵字參數(回顧一下我們前面對mean的定義):s 裡面啥也沒有啊。 輸出啥? 報錯!s 裡面啥也沒有啊。 輸出啥? 報錯!


不放星號:
不放星號就代表你把那個字典直接扔進去了。
問題是函數形參**s只接受關鍵字參數。
s 裡面還是啥也沒有, 報錯!



(所有的舉例所使用到的 函數名 參數名 都是隨便取的, 沒有什麼特殊意義.)
感覺自己舉例的還不是很好,如果哪裡把你弄迷糊了。
歡迎在評論區討論. :)



擴充閱讀環節:

StackOverflow 上解釋星號文法的問題:
syntax - Python: Once and for all. What does the Star operator mean in Python?

引用傳值的問題:
Python: How do I pass a variable by reference? 表示把這個參數展開傳進去。等價於:
pixbuf = Gdk.pixbuf_get_from_window(rootwin, 0, 0, screen.width(), screen.height())
調用(caller)
func(*sequence) Pass all objects in sequence as individual positional arguments
seq = [1,2,3]
func(*seq) -> func(1, 2, 3)

func(**dict) Pass all key/value pairs in dict as individual keyword arguments
dict = {'a' = 1, 'b' = 2}
func(*dict) -> func(a = 1, b = 2)

函數定義的
def func(*name) Matches and collects remaining positional arguments in a tuple
func(1, 2, 3) -> name = [1, 2, 3]

def func(**name) Matches and collects remaining keyword arguments in a dictionary
func(a = 1, b= 2) -> dict = {'a' = 1, 'b' = 2}

可參考 Chapter 18. Argumentspython裡星號有兩種意思
1. 定義函數時
一般情況下,函數的參數接受指定個數的參數,比如
def func(a, b, c):    print a, b, c
推薦一篇post:Understanding '*', '*args', '**' and '**kwargs' >>> def test(*args, **kwargs):
... print args, kwargs

>>>a={"a":1, "b":2}

>>> test(a)
({'a': 1, 'b': 2},) {}
>>> test(*a) #這裡等同於test('a', 'b')
('a', 'b') {}
>>> test(**a) #這裡等同於test(a=1, b=2)
() {'a': 1, 'b': 2}

一個星號就是把一個序列拆解傳入,如果變數本身是字典,會退化成key的序列。
兩個星號就是把key-value拆解傳入。
姑且就當是文法糖吧。搬運工:1.2 解壓可迭代對象賦值給多個變數
這個解壓非常dedicate,具有很多優雅的技巧。
總結如下:
(1)
完全不需要tem中間變數的交換:
a,b =b,a
(2)
有時候,你可能只想解壓一部分,丟棄其他的值。對於這種情況Python並沒有提供特殊的文法。 但是你可以使用任意變數名去佔位,到時候丟掉這些變數就行了。
>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]>>> _, shares, price, _ = data
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.