python中**是啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中**是啥意思?相关的知识,希望对你有一定的参考价值。
参考技术A** 在python里面表示幂运算
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:``*`` ** 。
调用函数时使用* **
test(*args)* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。
test(**kwargs)** 的作用则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 'a':1,'b':2,'c':3 ,那这个代码就等价于 test(a=1,b=2,c=3) 。
定义函数参数时使用* **
def test(*args):
...定义函数参数时 * 的含义又要有所不同,在这里 *args 表示把传进来的位置参数都装在元组 args 里面。比如说上面这个函数,调用 test(1, 2, 3) 的话, args 的值就是 (1, 2, 3) 。:
def test(**kwargs):
...类似的, ** 就是针对关键字参数和字典的了。 调用 test(a=1,b=2,c=3) 的话, kwargs 的值就是 'a':1,'b':2,'c':3 了。
普通的参数定义和传递方式和 * 们都可以和平共处,不过显然 * 必须放在所有位置参数的最后,而 ** 则必须放在所有关键字参数的最后,否则就要产生歧义了
在 Python 中,'<function at ...>' 是啥意思?
【中文标题】在 Python 中,\'<function at ...>\' 是啥意思?【英文标题】:In Python, what does '<function at ...>' mean?在 Python 中,'<function at ...>' 是什么意思? 【发布时间】:2013-10-20 10:42:38 【问题描述】:<function at 'somewhere'>
是什么意思?示例:
>>> def main():
... pass
...
>>> main
<function main at 0x7f95cf42f320>
也许有一种方法可以使用 0x7f95cf42f320
以某种方式访问它?
【问题讨论】:
【参考方案1】:您正在查看函数对象的默认表示。它为您提供了一个名称和一个唯一的 id,在 CPython 中 恰好 是一个内存地址。
您无法使用该地址访问它;内存地址只是用来帮助你区分函数对象。
换句话说,如果你有两个函数对象,它们最初被命名为main
,你仍然可以看到它们是不同的:
>>> def main(): pass
...
>>> foo = main
>>> def main(): pass
...
>>> foo is main
False
>>> foo
<function main at 0x1004ca500>
>>> main
<function main at 0x1005778c0>
【讨论】:
@Vik2015 不,见http://***.com/q/1396668/395760【参考方案2】:是函数的identity,在CPython实现中是对象在内存中的地址。
【讨论】:
【参考方案3】:每个对象obj都有一个方法obj.__repr__( ) 调用时,此方法返回一个字符串对象,它是对象 obj
的“官方”可打印表示当Python解释器遇到
脚本中的一行print obj
或>>> obj
在命令行中,
对象的方法__repr__( )被调用,返回的代表字符串的值显示在屏幕上。
对象的__repr__( )方法可以具体调用,使用内置函数repr( ),以对象名作为参数,赋值给__repr__( ) 返回的字符串到一个标识符,因此能够对此表示执行操作。 仅在 Python 1 和 Python 2 中,对象名称周围的反引号与在其上调用 repr( ) 具有相同的效果。
比较:
def main():
pass
if '__repr__' in dir(main):
print ('__repr__ is a method of main\n')
else:
print ('main has no method __repr__\n')
print ('main : %s\n'
'type(main) == %s\n'
% (main,type(main)) )
print ('repr(main) : %s\n'
'type(repr(main)) == %s'
%(repr(main),type(repr(main))) )
# Only in Python 1 and Python 2, string conversions with
# reversed quotes produce the same result as repr():
print ('\n`main` : %s\n'
'type(`main`) == %s'
% (`main`,type(`main`)) )
结果
__repr__ is a method of main
main : <function main at 0x00FB2930>
type(main) == <type 'function'>
repr(main) : <function main at 0x00FB2930>
type(repr(main)) == <type 'str'>
.
在<function main at 0x00FB2930>
中,0x00FB2930
部分代表对象(这里是函数)的内存地址,也就是引用该位置的整数 RAM 中的对象。
0x00FB2930
是一个hexinteger,也就是说一个以 16 为基数的表示内存地址值的文字。
这个内存地址由内置函数id()
精确返回,其值被打印为decimalinteger字面量,即以10为底的表示。
print ('repr(main) : %s\n'
'type(repr(main)) == %s\n'
% (repr(main),
type(repr(main))) )
hex_address = repr(main)[18:-1]
print ('hex_address = repr(main)[18:-1] defined\n'
'hex_address : %s\n'
'type(hex_address) == %s\n'
'int(hex_address , 16) : %s\n'
'type(int(hex_address , 16)) : %s\n'
% (hex_address,
type(hex_address),
int(hex_address , 16),
type(int(hex_address , 16))) )
print ('id(main) : %s\n'
'type(id(main)) == %s\n'
'hex(id(main) : %s\n'
'type(hex(id(main)) : %s'
% (id(main),
type(id(main)),
hex(id(main)),
type(hex(id(main)))) )
结果
repr(main) : <function main at 0x00FB2930>
type(repr(main)) == <type 'str'>
hex_address = repr(main)[18:-1] defined
hex_address : 0x00FB2930
type(hex_address) == <type 'str'>
int(hex_address , 16) : 16460080
type(int(hex_address , 16)) : <type 'int'>
id(main) : 16460080
type(id(main)) == <type 'int'>
hex(id(main) : 0xfb2930
type(hex(id(main)) : <type 'str'>
【讨论】:
【参考方案4】:在 CPython 中只是对象在内存中的地址。所有对象都有这个,不仅仅是函数。
【讨论】:
这仅适用于 CPython。 @Livius 改变了它。谢谢。以上是关于python中**是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中,'<function at ...>' 是啥意思?