V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Newyorkcity
V2EX  ›  Python

请问为何关键字参数接收时要用赋值?

  •  1
     
  •   Newyorkcity · 2016-08-02 11:33:20 +08:00 · 1641 次点击
    这是一个创建于 2831 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ef person(name,age,**other):
    print('name:',name,'age:',age,'other:',other)

    person('Syx', 18, city = 'Chengdu', hometown = 'Hangzhou')
    这是一个能通过编译的有意义的操作
    person('Syx', 18, 'city' : 'Chengdu', 'hometown' : 'Hangzhou')
    这却是一个不能通过编译的代码.
    我不理解,对于**other (关键字参数)输入进来的数据都会被处理成 dict 对吧?
    如果我自己建立一个 dict,应该是这么写:
    extra = {'city' : 'Beijing', 'hometown' : 'Hangzhou'}
    也就是说第二行代码中的〈'city' : 'Chengdu', 'hometown' : 'Hangzhou'〉才是真正的 dict 格式啊.为什么第二行代码是错误的,但第一行是正确的?
    我也无法理解这里这个赋值的操作.
    在第一行代码的下一行我紧接着写了
    print(city)
    可是被告知
    city is not defined
    那 city = 'Chengdu'到底是个什么东西?

    谢谢
    8 条回复    2016-08-02 14:46:28 +08:00
    mgna17
        1
    mgna17  
       2016-08-02 12:08:44 +08:00
    关键字参数传入函数之后的确就变成一个字典了,你可以试一下 print(type(other))
    函数上的**other 接收了所有键值对,并封装成了一个叫做 other 的字典
    你要的 city 应该是 other.get('city')
    iEverX
        2
    iEverX  
       2016-08-02 13:18:02 +08:00
    这里不是赋值操作,只是语法规定而已
    Newyorkcity
        3
    Newyorkcity  
    OP
       2016-08-02 13:44:11 +08:00
    @mgna17
    谢谢你的解答,但还有几个问题..
    传入函数之后形成的字典可以被调用么?
    from myfunction_2 import person
    person('Syx', 18, city = 'Beijing', hometown = 'Hangzhou')
    print(other[0])
    第三行代码被报错,是 other 没有被定义.所以「 print(type(other))」和「 other.get('city')」应该怎么用呢?
    Newyorkcity
        4
    Newyorkcity  
    OP
       2016-08-02 13:45:37 +08:00
    @iEverX
    谢谢..那这样的话请问这里的 city 是一个变量还是一个字符串?
    只是因为在规定上禁止了 'city' : 'Beijing' 这种写法并规定了只接受 city = 'Beijing'这种写法么?
    iEverX
        5
    iEverX  
       2016-08-02 13:53:38 +08:00   ❤️ 2
    你从函数里得到的参数,是有函数的声明来确定的

    def person(name, age, **other):

    这一行说明这个函数接收三个参数, name , age , other

    person('Syx', 18, city = 'Chengdu', hometown = 'Hangzhou')
    这种调用实际上是相当于 other = {'city': 'Chengdu', 'hometown': 'Hangzhou'},你在函数内部,只能使用 1 楼的方法去获得这个参数
    mgna17
        6
    mgna17  
       2016-08-02 14:07:54 +08:00   ❤️ 1
    @Newyorkcity 我说的那 2 小段代码是放在你定义的那个函数里面的 -_-

    至于你问的 “传入函数之后形成的字典可以被调用么? ”,这 2 段不就是在调用那个 other 参数么?
    Newyorkcity
        7
    Newyorkcity  
    OP
       2016-08-02 14:46:22 +08:00
    @iEverX 谢谢
    Newyorkcity
        8
    Newyorkcity  
    OP
       2016-08-02 14:46:28 +08:00
    @mgna17 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2238 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:41 · PVG 13:41 · LAX 22:41 · JFK 01:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.