24小时热门版块排行榜    

查看: 2259  |  回复: 6

tuburfransth

金虫 (正式写手)

[求助] 这段Python代码中sep是什么类型的参数?

代码如下:
def concat(*args, sep = '/'):
    return sep.join(args)

调用:
concat('earth', 'mars', 'venus')
输出:
‘earth/mars/venus’

请问,函数concat定义中的sep参数是哪种参数,是默认参数还是关键字参数?
我的疑问:如果是关键字参数,但是关键字参数是不能放在可变参数之后的;而如果是关键字参数,为什么函数调用时没有为该参数赋值?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)


jjdg: 金币+1, 感谢参与 2017-02-24 20:29:48
sep应该是字符串类型的参数,在程序中的含义是“分隔符”。
join方法本身是一种字符串方法。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2017-02-24 11:27:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tuburfransth

金虫 (正式写手)

引用回帖:
2楼: Originally posted by 月只蓝 at 2017-02-24 11:27:13
sep应该是字符串类型的参数,在程序中的含义是“分隔符”。
join方法本身是一种字符串方法。

答非所问啊,你说的我知道。但是我问的是sep是哪种参数,默认参数还是关键字参数?
3楼2017-02-24 11:44:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

引用回帖:
3楼: Originally posted by tuburfransth at 2017-02-24 11:44:24
答非所问啊,你说的我知道。但是我问的是sep是哪种参数,默认参数还是关键字参数?...

根据关键字参数的定义,sep是关键字参数无疑。
可变参数应位于参数列表的最末端。你给出的代码中的参数顺序不对,应改成:
def concat( sep = '/',*args):
    return sep.join(args)

这样在调用时:
concat('earth', 'mars', 'venus')
sep使用定义函数的默认值。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
4楼2017-02-24 12:53:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tuburfransth

金虫 (正式写手)

引用回帖:
4楼: Originally posted by 月只蓝 at 2017-02-24 12:53:06
根据关键字参数的定义,sep是关键字参数无疑。
可变参数应位于参数列表的最末端。你给出的代码中的参数顺序不对,应改成:
def concat( sep = '/',*args):
    return sep.join(args)

这样在调用时:
...

感觉你说的不对,如果改成你的代码,那么调用concat('earth', 'mars', 'venus'),sep会被赋值为‘earth’。
另外,原代码是python官方3.5.2教程上面的,运行也正常。
5楼2017-02-24 13:34:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

★ ★
jjdg: 金币+2, 谢谢 2017-02-24 20:30:10
引用回帖:
5楼: Originally posted by tuburfransth at 2017-02-24 13:34:29
感觉你说的不对,如果改成你的代码,那么调用concat('earth', 'mars', 'venus'),sep会被赋值为‘earth’。
另外,原代码是python官方3.5.2教程上面的,运行也正常。...

应该是版本问题。

在python2.5中,你给的代码:
CODE:
def concat(*args, sep = '/'):
    return sep.join(args)

因为关键字不能放在可变参数之后,会报语法错误,需将定义函数时的参数列表改为:(sep = '/',*args),完整定义为:
CODE:
def concat(sep = '/',*args):
         return sep.join(args)

且在调用concat时,需要按类似于以下的方式处理:
concat('/','earth', 'mars', 'venus')
concat('.','earth', 'mars', 'venus')
因为在调用时,关键字参数应当放在默认参数的后面,所以下面的方式是不可行的:
concat(sep='/','earth', 'mars', 'venus') #不可行
以下这种方式也是不可行的:
concat('earth', 'mars', 'venus',sep='/') #不可行
因为这种调用方式,参数sep有歧义。
也就是说,在比例的情况下,在python2.5中,尽管sep被定义为关键字参数,在实际调用时,只能以默认参数的形式调用。

在Python3.5.2中,原代码:
CODE:
def concat(*args, sep = '/'):
    return sep.join(args)

CODE:
def concat(sep = '/',*args):
         return sep.join(args)

都是符合语法的。
对于第一种定义方式,调用
concat('earth', 'mars', 'venus')
concat('earth', 'mars', 'venus',sep='/')
concat('earth', 'mars', 'venus',sep='+')
均是合法的。
对于第二种定义方式,即便是在Python3.5.2中,尽管sep被定义为关键字参数,在实际调用时,还是只能以默认参数的形式调用:
concat('/','earth', 'mars', 'venus')
显然第一种定义方式更为灵活,但Python2.5.2并不支持这种写法。
总之,参数sep属于关键字参数是肯定的。

» 本帖已获得的红花(最新10朵)

MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
6楼2017-02-24 15:55:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tuburfransth

金虫 (正式写手)

送红花一朵
引用回帖:
6楼: Originally posted by 月只蓝 at 2017-02-24 15:55:31
应该是版本问题。

在python2.5中,你给的代码:

def concat(*args, sep = '/'):
    return sep.join(args)


因为关键字不能放在可变参数之后,会报语法错误,需将定义函数时的参数列表改为:(sep ...

谢谢解答,我使用的是3.0以上的版本,所以不熟悉2.0的语法,还好有你的验证。
7楼2017-02-24 18:13:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 tuburfransth 的主题更新
信息提示
请填处理意见