参考:函数参数

Note

A.关键字参数:

1.关键字参数:**kw

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

2.支持只传入必选参数;也可以传入任意数目的可选参数,如下例。

eg.

#!/usr/bin/env python3

def my_func(name, age, **kw) :
print('name:', name, 'age:', age, 'else:', kw)

test

>>> from function3 import my_func

>>> my_func('Chen', 20)
name: Chen age: 20 else: {} >>> my_func('Chen', 20, prof='Student')
name: Chen age: 20 else: {'prof': 'Student'} >>> my_func('Chen', 20, prof='Student', city='FuZhou')
name: Chen age: 20 else: {'prof': 'Student', 'city': 'FuZhou'}

3.关键字参数的作用:”试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。“

4.当然,也可以选择在传入参数的时候直接传入一个dict的内容。这里容易出错,我就翻车了。

eg.

>>> dic = {'prof' : 'Student', 'city' : 'FuZhou'}
>>> my_func('Chen', 20, dic['prof'], dic['city'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func() takes 2 positional arguments but 4 were given >>> my_func('Chen', 20, dic)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func() takes 2 positional arguments but 3 were given

第一句错误的原因,是因为传入dic['prof']相当于传入'Student',即一个字符串,这很明显与函数定义的参数不符;第二句同上,只不过由传入字符串变成了传入一个dict。

正确的方法应该是value_name=dict[key]

eg.

>>> my_func('Chen', 20, prof=dic['prof'])
name: Chen age: 20 else: {'prof': 'Student'} >>> my_func('Chen', 20, prof=dic['prof'], city=dic['city'])
name: Chen age: 20 else: {'prof': 'Student', 'city': 'FuZhou'}

5.如果想直接传入dict,方法也很简单,加上两个星号*

刚才的错误:

>>> my_func('Chen', 20, dic)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func() takes 2 positional arguments but 3 were given

修正:

>>> my_func('Chen', 20, **dic)
name: Chen age: 20 else: {'prof': 'Student', 'city': 'FuZhou'}

**dic表示把dic这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是dic的一份拷贝,对kw的改动不会影响到函数外的dic。

B.命名关键字参数

1.定义了关键字参数的函数允许用户传入多个关键字key-value值,如果我们想要在函数里面查看一个key是否在传入的dict中,可以通过if···in···的方法查看。

eg.

#!/usr/bin/env python3

def my_func(name, age, **kw) :

	if 'prof' in kw :            # Hint: 'prof' => ''
print('prof in') if 'city' in kw :
print('city in') print('name:', name, 'age:', age, 'else:', kw)

output

>>> from function3 import my_func
>>> dic = {'prof' : 'Student', 'city' : 'FuZhou'}
>>> my_func('Chen', 20, **dic)
prof in
city in
name: Chen age: 20 else: {'city': 'FuZhou', 'prof': 'Student'}
>>>

2.如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和prof作为关键字参数。

方法:

my_func(name, age, *, prof, city)

*作为分隔符,指定传入的关键字参数key必须是prof和city。

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数。

eg.

def my_func2(name, age, *, prof, city) :

	print(name, age, prof, city)

output

>>> from function3 import my_func2
>>> my_func2('Chen', 20, prof='Student', city='FuZhou')
Chen 20 Student FuZhou

注意:指定了关键字参数的key之后,传入的关键字参数数目必须匹配,并且必须是 key=value 的形式。

命名关键字参数必须传入参数名。

eg.

>>> my_func2('Chen', 20, prof='Student')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func2() missing 1 required keyword-only argument: 'city' >>> my_func2('Chen', 20)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func2() missing 2 required keyword-only arguments: 'prof' and 'city'
>>> my_func2('Chen', 20, 'Student', 'FuZhou')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_func2() takes 2 positional arguments but 4 were given

3.命名关键字支持默认参数,在调用时,可以不传入默认参数的值。

C.参数组合

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数(*[···] or *list_name)、命名关键字参数和关键字参数(**{···} or **dict_name)。

eg.

def my_func3(a, b, c=0, *d, **e) :
print(a, b, c, d, e)

output

>>> my_func3('Chen', 20)
Chen 20 0 () {} >>> my_func3('Chen', 20, 100)
Chen 20 100 () {} >>> my_func3('Chen', 20, 100, *['Li', 'Wang'], **{'Li' : 'num1', 'Wang' : 'num2'})
Chen 20 100 ('Li', 'Wang') {'Wang': 'num2', 'Li': 'num1'} >>>

在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

也就出现了原文传入一个tuple和一个dict,解释器也正常输出的情况:

>>> t1 = ('Li', 100, 99, 'Wang')

>>> d1 = {'Wang' : 'num2', 'Li' : 'num1'}

>>> my_func3(*t1, **d1)
Li 100 99 ('Wang',) {'Wang': 'num2', 'Li': 'num1'} >>> t2 = ('Li', 100, 'Wang') >>> my_func3(*t2, **d1)
Li 100 Wang () {'Wang': 'num2', 'Li': 'num1'} # 按位置解释 >>> t3 = ['Li', 100, 'Wang'] >>> my_func3(*t3, **d1)
Li 100 Wang () {'Wang': 'num2', 'Li': 'num1'} # 传入一个list和一个tuple也可以 >>>

2017/1/31

Python学习札记(十三) Function3 函数参数二的更多相关文章

  1. Python学习总结18:函数 参数篇

    1. 判断函数是否可调用 >>> import math >>> x = 1 >>> y = math.sqrt >>> cal ...

  2. Python学习札记(十一) Function2 函数定义

    参考:定义函数 Note: 先看一段代码实例(Barefoot topo.py): def read_topo(): nb_hosts = 0 nb_switches = 0 links = [] w ...

  3. python学习三十三天函数匿名函数lambda用法

    python函数匿名函数lambda用法,是在多行语句转换一行语句,有点像三元运算符,只可以表示一些简单运算的,lambda做一些复杂的运算不太可能.分别对比普通函数和匿名函数的区别 1,普通的函数用 ...

  4. Python学习第十三篇——函数的深层次运用

    def make_pizza(size,*toppings): print("\nmaking a "+str(size)+" size pizza with follo ...

  5. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  6. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  7. python通过装饰器检查函数参数的数据类型的代码

    把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...

  8. Python学习札记(十二) Function3 函数参数一

    参考:函数参数 Note 1.Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以 ...

  9. python学习笔记12(函数三): 参数类型、递归、lambda函数

    一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...

随机推荐

  1. LRU算法的Python实现

    http://flychao88.iteye.com/blog/1977653文章中介绍了常见的几种缓存淘汰策略 LRU:least recently used,最近最少使用算法.其实就是按使用时间倒 ...

  2. 移动支付--银联,支付宝,微信(android)

    在这个移动互联网快速发展的时代,手机已经成为人们生活或者出行之中必不可少的设备了,如今非常多城市的商户都能够採用支付宝,微信支付了.人们出门仅仅须要随身携带带手机.不用带大量现金就能够放心购物了.如今 ...

  3. Mysql索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  4. django 模板语言之 filter 自定义模板

    可以自己写python函数放在模板语言里用 这种方法是django里面的 filter {{ item.event_start|date:"Y-m-d H:i:s"}} {{ bi ...

  5. Java 语言中 Enum 类型的使用介绍【转载】

    简介:本文主要介绍了 Java 语言中枚举类型,以及如何定制 Enum 类型的定义,如何正确使用 Enum 类型. From:http://www.ibm.com/developerworks/cn/ ...

  6. MySQL高可用架构之MHA(转)

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  7. python全栈开发从入门到放弃之函数进阶

    1.三元运算 a= 1 b=2 max = (a if a>b else b ) #条件成立的结果 if 条件 else 条件不成立的结果 print(max) 2.先上一首python之禅 i ...

  8. ModelForm组件

    ModelForm组件 Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用: ...

  9. Ajax 报错 500 (Internal Server Error)

    ==========error======={"readyState":4,"responseText":"<html><head& ...

  10. BZOJ 2599: [IOI2011]Race

    点分治,定权值,求另一关键字最小 不满足前缀加减性 可以按序遍历,用一数组$t[] 来维护路径为i的最小边数$ 再对于一个直系儿子对应的子树,先算距离求答案再更新$t数组,这样就不会重复$ #incl ...