引子:
对于关键字参数,调用时可以传入任意个不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过【函数里定义的关键字参数】检查,例子里就是通过otherinfo检查。
        >>> def person(name,age,**otherinfo):
        ...     print('name:',name,'age:',age,'Other infomations:',otherinfo)
        ...
    例如,我们希望检查是否包含sex和city参数,
       >>> def person(name,age,**other):
        ...     if 'sex' in other:
        ...             pass
        ...     if 'city' in other:
        ...             pass
        ...     print('name:',name,'age:',age,'other:',other)
        ...
        >>> person('kk',12,sex='M',city='BJ')
        name: kk age: 12 other: {'city': 'BJ', 'sex': 'M'}
        >>> person('kk',12,oo='aa')
        name: kk age: 12 other: {'oo': 'aa'}
    可以发现,调用时依然可以传入不受限制的关键字参数oo,如果要限制关键字参数的名字,就可以用命名关键字参数。
 
命名关键字参数正文:
    依然使用这个例子,我们限制关键字参数的名字,只接受sex和city作为关键字参数,定义如下:
        >>> def person(name, age, *, sex, city):    #注意这个星号,下面详细说。
        ...     print('name:',name,'age:',age,city)
        ... 
        >>> person('kk',13,sex='M',city='BJ')
        name: kk age: 13 BJ
       
命名关键字参数的使用:
    说一下这个星号。
        和关键字参数不同,命名关键字参数需要一个特殊分隔符* , *后面的参数都被视为命名关键字参数。调用时必须传入参数名,否则报错,这一点与位置参数有所不同。当不指定参数名时,都会被函数认为成位置参数,但是上面这个函数只有两个位置参数,因此会报错。
        1. *,后面的参数都被视为命名关键字参数。
        2. 如果函数定义中已经有了一个可变参数,那么可变参数后面跟着的命名关键字参数就不再需要特殊分隔符*了。
        3. 命名关键字参数可以有默认值,用来简化调用。具有默认值的命名关键字参数在调用函数时可以不传入这个参数。 命名关键字参数默认值的定义:
            def person(name, age, *, sex='M', city):
            ……
在学习命名关键字时发现的问题:
    回到正文的例子,定义person函数,包含sex、city两个命名关键字参数。
         >>> def person(name, age, *, sex, city):  
        ...     print('name:',name,'age:',age,city)
        ... 
        >>> person('kk',13,sex='M',city='BJ')
        name: kk age: 13 BJ    
    #在这一步,都没有问题。不过关键字参数属于扩展,所以命名关键字参数是不是和关键字参数一样,可以接受0个参数传入呢?
     
        >>> person('kk',13)     #只传入位置参数name和age,别的参数都不传
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: person() missing 2 required keyword-only arguments: 'sex' and 'city'
    #报错了, 再次进行测试,命名关键字参数是不是和关键字参数一样,可以接受任意个参数传入?(是不是只要保证传入了命名关键字参数后,可以任意?)
   
        >>> person('kk',13,sex='M',city='BJ',Phone=110,weight=100)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: person() got an unexpected keyword argument 'Phone'
    #还是报错了。诡异的发现,这样一来,命名关键字参数和位置参数似乎完全没有区别嘛!都是强制输入这几个参数,缺一或者多一都不行。
       
为什么?------学过后面的参数组合就明白了(后注)。
-----------------------------------------------------------      
来自知乎:
既然已经有了位置参数,那么这个命名关键字参数api设计是否是多余的,位置参数是必传,那么功能上完全可以替代命名关键字参数,而且还易懂。除了调用的时候需要写上key之外和书写顺序可以变换意外还有什么其他的吗?难道就是因为这样会使调用者能灵活一点?
-----------------------------------------------------------      
def func1(a,  *q ,  * ,  b ,  **w)
任意形式的函数,都可以用func(*args, **kw)的形式来调用它,无论它的参数是如何定义的。其中args是一个list,kw是一个dict.
如对于函数func1,以下两种调用方式均可:
func1( 1 , *[2,3] , b=1, **{ 'w1':2 , 'w2':3 } )
或:
func1( *[1,2,3] , **{ 'b':1, 'w1':2 , 'w2':3 } )

为什么有了必传的位置参数,还要有必传的命名关键字参数呢?
我的理解是位置参数是list中的一个必要元素,而命名关键字是dict中的一个必要元素。
list和dict的区别就不多说了

作者:焦大婶
链接:https://www.zhihu.com/question/57726430/answer/302836571
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-----------------------------------------------------------  
命名关键字从上面例子来看,和位置参数有着明显的不同。命名关键字参数更加灵活一些。不过现在看起来还是有些晕,在后续的学习中看能不能把命名关键字参数吃透。

Day5 - 06 函数的参数-命名关键字参数的更多相关文章

  1. day09-Python运维开发基础(函数收集参数、命名关键字参数与返回值、函数名的特殊使用及 全局/局部变量详解)

    1. 函数收集参数.命名关键字参数与返回值.函数名的特殊使用 # ### 默认形参 和 关键字实参 # 默认形参和 关键字实参 在写法上是一样 # 函数的定义处 """默 ...

  2. Python——函数的命名关键字参数

    命名关键字参数 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数.至于到底传入了哪些,就需要在函数内部通过kw检查. 仍以person()函数为例,我们希望检查是否有city和job参数: ...

  3. Python函数独立星号(*)分隔的命名关键字参数

    如果需要限制关键字参数的输入名字,就需要使用到命名关键字参数的形式,所谓命名关键字参数就是给关键字参数限定指定的名字,输入其他名字不能识别.命名关键字参数和位置参数之间使用独立的星号(*)分隔,星号后 ...

  4. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  5. Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

    Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...

  6. python函数的参数-可变参数,关键字参数

    # -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...

  7. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  8. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  9. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

随机推荐

  1. 每日理解(一) Spring框架

    每日理解 SpringIOC 控制反转 在Java SE中通过new来创建对象.而在Spring中通过容器来控制对象. 所谓的控制包括:对象的创建.初始化.以及销毁.我们有之前的主动控制对象,变为了S ...

  2. mysql主备切换canal出现的问题解析

    通过配置VIP,在进行主备切换时,出现的报错信息: 1.当主备节点当前binlog文件名称相同时,原主节点的position小于主备切换后的position,出现如下报错: 2020-07-02 15 ...

  3. Nginx下关于缓存控制字段cache-control的配置说明

    HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括: no ...

  4. mysql case when语句的使用

    case具有两种格式.简单case函数和case搜索函数. 简单函数 CASE [col_name] WHEN [value1] THEN [result1]-ELSE [default] END 搜 ...

  5. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  6. idea中运行tomcat不能访问8080主页问题

    问题 初次使用IntelliJ IDEA,但今天在运行项目启动Tomcat后,发现无法访问Tomcat首页,出现404错误:输入http://localhost:8080时无法访问Tomcat首页,但 ...

  7. Go语言实现excel导入无限级菜单结构

    目录 需求 实现 测试 简单例子 复杂例子 需求 最近有一个需求,要实现一个无限级结构的树型菜单,差不多长下面这个样子 我们知道无限级实现思路都是用一个parent_id将各种层级串联起来,顶级的pa ...

  8. 总结MathType安装的一些小技巧

    MathType在编辑数学公式确实很方便,因为它的功能很强大,能够进行多种数学符号编辑.但是在安装时我们多多少少会遇到一些问题,那这些问题该怎么解决呢?下面就让小编来分享公式编辑器安装的一些小技巧吧! ...

  9. 你了解ABBYY FineReader 14么?

    有没有一款是能够同时处理纸质文档和个类型PDF的一站式解决方案?答案是肯定的,ABBYY FineReader 14集合了强大的光学字符识别(OCR)以及 PDF 查看和编辑功能.不仅能够高效识别图片 ...

  10. 教你在CorelDRAW中制作水印

    水印是一种数字保护的手段,在图像上添加水印即能证明本人的版权,还能对版权的保护做出贡献.也就是在图片上打上半透明的标记,因其具有透明和阴影的特性,使之不管在较为阴暗或明亮的图片上都能完美使用,嵌入的水 ...