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