<span class="n">rect</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">screen</span><span class="o">.</span><span class="n">width</span><span class="p">(),</span> <span class="n">screen</span><span class="o">.</span><span class="n">height</span><span class="p">())</span>
<span class="n">pixbuf</span> <span class="o">=</span> <span class="n">Gdk</span><span class="o">.</span><span class="n">pixbuf_get_from_window</span><span class="p">(</span><span class="n">rootwin</span><span class="p">,</span> <span class="o">*</span><span class="n">rect</span><span class="p">)</span><span class="c">#其中*rect是什么?</span>
Copy after login
回复内容:
我不会用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?
表示把这个参数展开传进去。等价于:
<code class="language-text">pixbuf = Gdk.pixbuf_get_from_window(rootwin, 0, 0, screen.width(), screen.height())
</code> Copy after login
调用(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. Arguments
python里星号有两种意思 1. 定义函数时 一般情况下,函数的参数接受指定个数的参数,比如
<code class="language-python"><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">):</span>
<span class="k">print</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span>
</code> Copy after login
推荐一篇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并没有提供特殊的语法。 但是你可以使用任意变量名去占位,到时候丢掉这些变量就行了。
<code class="language-text">>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
>>> _, shares, price, _ = data
</code> Copy after login