一、编写可接受任意数量参数的函数:*、**

>>> def test(x, *args, y, **kwargs):
... pass
...
>>> test(1, 2, 3, 4 ,5 ,5, y=9, aa=99, bb=88,cc=900)
>>> test(1, 2, 3, 4 ,5 ,5, 9, aa=99, bb=88,cc=900)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: test() missing 1 required keyword-only argument: 'y'

#以*打头的参数只能作为最后一个位置参数出现,以**打头的参数只能作为最后一个参数出现;*args之后仍然可以有其它的参数出现,但只能是关键字参数(keyword_only)

二、编写只接受关键字参数的函数

>>> def test(*, x, y):
... pass
...
>>> test(8, 9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: test() takes 0 positional arguments but 2 were given
>>> test(x=9, y=8)

#星号*之后的参数都是keyword_only参数

三、函数注解

>>> def add(x:int ,y:int) ->int:
... return x + y
...
add.__annotations__
{'x': <class 'int'>, 'return': <class 'int'>, 'y': <class 'int'>}

#函数注解只会保存在函数的__annotations__属性中;因为Python中没有类型声明,函数注解可以用于提示

四、从函数中返回多个值:各返回值之间以逗号“,”分隔,本质上是返回一个tuple,可通过tuple解包实现返回多个值的目的

>>> def myfun():
... return 1, 2, 3
...
>>> x, y, z = myfun()
>>> x
1
>>> y
2
>>> z
3
>>> a = myfun()
>>> a
(1, 2, 3)

五、定义带有默认参数的函数

  默认参数只会在函数定义时被绑定一次

>>> x = 44
>>> def sample(a=x):
... print(a)
...
>>> sample()
44
>>> x = 88
>>> sample()
44

  默认参数的默认值通常应该是不可变对象;若设置可变对象,应参照如下方式:

>>> def test(a, b=None):
... if b is None:
... b = []
... pass
...

六、嵌套函数

>>> def xxx(m):
... def yyy(n):
... return m + n
... return yyy
...
>>> xxx(20) #可对比嵌套列表的逻辑进行理解
<function xxx.<locals>.yyy at 0x7f68c3aef0d0>
>>> xxx(20)(20) #给内嵌的函数参数赋值
40
>>> def test(m):
... return lambda n: m + n #实现原理上,lambda可以理解为嵌套函数
...
>>> test(20)(20)
40

七、让带有N个参数的可调用对象以较少的参数形式调用

  即:给一部分参数预先斌予固定值,相当于转化成一个带有默认值的函数

>>> def sum(a, b, c, d):
... return a + b + c + d
...
>>> sum(1, 2, 3, 4)
10
>>> import functools
>>> test_0 = functools.partial(sum, b=2, c=3, d=4)
>>> test_0(1)
10
>>> test_0(100)
109

  也可使用lambda函数实现

>>> test_1 = lambda a, b=2, c=3, d=4: sum(a, b, c, d)
>>> test_1(1)
10
>>> test_1(100)
109

最新文章

  1. Atitit.研发管理如何避免公司破产倒闭的业务魔咒
  2. PhoneGap 在 Android 上的插件开发方法介绍
  3. laravel中的$request对象构造及请求生命周期
  4. Jquery中使用setInterval和setTimeout
  5. linq按需查询
  6. svn更新
  7. css优先级计算
  8. 【转】Ubuntu命令行下安装、卸载、管理软件包的方法
  9. C#使用Thrift简介,C#客户端和Java服务端相互交互
  10. WeMall商城系统的Android app商城中的wemall-mobile代码
  11. flex词法解析
  12. BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】
  13. 有序列表ol,无序列表ul,定义列表dl
  14. go 调用windows dll 的方法
  15. 总结Sql Server内置函数实现MD5加密
  16. 30秒了解Excel的前世今生
  17. 2018.12.08 codeforces 914D. Bash and a Tough Math Puzzle(线段树)
  18. JAVA 解压压缩包中指定文件或实现压缩文件的预览及下载单个或多个指定的文件
  19. HBase HA的分布式集群部署(适合3、5节点)
  20. HTTP --meta详解

热门文章

  1. json格式化在线工具推荐
  2. Neo4j原生语句cc
  3. Jenkins和Docker
  4. js基本包装类型
  5. 谁说编译器不SB
  6. 字节流read方法返回值为什么是int不是byte
  7. C++与JAVA语言区别
  8. 读书笔记---《Docker 技术入门与实践》---其一
  9. Linux grep return code
  10. Java SE(1)