除了乘法和求幂,星号在 Python 中还有啥作用? [复制]

Posted

技术标签:

【中文标题】除了乘法和求幂,星号在 Python 中还有啥作用? [复制]【英文标题】:What does the asterisk do in Python other than multiplication and exponentiation? [duplicate]除了乘法和求幂,星号在 Python 中还有什么作用? [复制] 【发布时间】:2013-05-07 02:19:27 【问题描述】:

在 Peter Norvig 用 Python (http://norvig.com/lispy.html) 编写的 Lisp 解释器中,他将 Lisp 的 eval 定义如下:

def eval(x, env=global_env):
    "Evaluate an expression in an environment."
    if isa(x, Symbol):             # variable reference
        return env.find(x)[x]
    elif not isa(x, list):         # constant literal
        return x                
    elif x[0] == 'quote':          # (quote exp)
        (_, exp) = x
        return exp
    elif x[0] == 'if':             # (if test conseq alt)
        (_, test, conseq, alt) = x
        return eval((conseq if eval(test, env) else alt), env)
    elif x[0] == 'set!':           # (set! var exp)
        (_, var, exp) = x
        env.find(var)[var] = eval(exp, env)
    elif x[0] == 'define':         # (define var exp)
        (_, var, exp) = x
        env[var] = eval(exp, env)
    elif x[0] == 'lambda':         # (lambda (var*) exp)
        (_, vars, exp) = x
        return lambda *args: eval(exp, Env(vars, args, env))
    elif x[0] == 'begin':          # (begin exp*)
        for exp in x[1:]:
            val = eval(exp, env)
        return val
    else:                          # (proc exp*)
        exps = [eval(exp, env) for exp in x]
        proc = exps.pop(0)
        return proc(*exps)

isa = isinstance

Symbol = str

这句话让我特别感兴趣:

return proc(*exps)

exps 中的星号是什么意思?

【问题讨论】:

***.com/questions/2322355/… 为什么是重复的?这个问操作员做什么,另一个问叫什么。 【参考方案1】:

它解包参数

function(1,2,3)  ==  function(*[1,2,3])

它使使用变量传递给函数变得容易

args = [1,2,3]
func(*args) #much nicer than func(args[0],args[1],args[2],...)

【讨论】:

【参考方案2】:

在可序列对象解包之前添加一个星号,就像 Joran 展示的那样:

In [1]: def f(*args): return args

In [2]: f(1,2,3)
Out[2]: (1, 2, 3)

In [3]: f(*[1,2,3,4])
Out[3]: (1, 2, 3, 4)

(注意* 的第三个应用程序:在函数定义中,星号表示可变长度的参数列表,所有参数都被打包到一个列表中,argsIn [1]

另外值得注意的是,双星号 (**) 会进行字典解包:

In [5]: def g(foo=None, bar=42): return foo,bar

In [6]: g()
Out[6]: (None, 42)

In [7]: g(*[1,2])
Out[7]: (1, 2)

In [8]: g(**'foo': 'FOO', 'bar': 'BAR')
Out[8]: ('FOO', 'BAR')

【讨论】:

以上是关于除了乘法和求幂,星号在 Python 中还有啥作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python中 单星号(*)与双星号(**)的使用

[Python]-11-星号变量的特殊用法

python学习:python的星号(*)和双星号(**)用法

log是啥函数,在数学中有啥作用?

python中np.multiply()np.dot()和星号(*)三种乘法运算的区别

c语言中的星号“*” 都有啥作用,含代码提问 求帮忙读一行程序