一、函数的动态参数 *args,**kwargs, 形参的顺序
1、你的函数,为了拓展,对于传入的实参数量应该是不固定,
所以就需要用到万能参数,动态参数,*args, **kwargs

1,*args 将所有实参的位置参数聚合到一个元组,并将这个元组赋值给args
(起作用的是* 并不是args,但是约定俗成动态接收实参的所有位置参数就用args)

def sum1(*args):
print(args)
sum1(1,2,['hello']) #是一个元组(1, 2, ['hello'])

2,**kwargs 将所有实参的关键字参数聚合到一个字典,并将这个字典赋值给kwargs
(起作用的是** 并不是kwargs,但是约定俗成动态接收实参的所有关键字参数就用kwargs)

def fun(*args,**kwargs):
print(args)
print(kwargs)
fun(1,2,['a','b'],name='xiaobai',age=18)
# 结果:
# (1, 2, ['a', 'b']) #位置参数,元组
# {'name': 'xiaobai', 'age': 18} #关键字参数,字典

2、*的用法
在函数的定义时,*位置参数,**关键字参数--->聚合。
在函数的调用(执行)时,*位置参数,**关键字参数--->打散。

实参--->*位置参数--->把位置参数打散成最小的元素,然后一个个添加到args里组成一个元组

l1 = [1,2,3]
l2 = [111,22,33,'xiaobai']
#如果要将l1,l2通过函数整合到一起
# 方法一(实参不用*):
def func1(*args):
return args[0] + args[1]
print(func1(l1,l2)) #[1, 2, 3, 111, 22, 33, 'xiaobai'] # 方法二(实参用*):
def func1(*args):
return args
print(func1(*l1,*l2)) #(1, 2, 3, 111, 22, 33, 'xiaobai')

实参--->**关键字参数--->把关键字参数打散成最小的元素,然后一个个添加到kwargs里组成一个字典

def func1(**kwargs):
print(kwargs) #func1(name='xiaobai',age=18,job=None,hobby='girl')
func1(**{'name':'xiaobai','age':18},**{'job':None,'hobby':'girl'}) # 结果:
# {'name': 'xiaobai', 'age': 18, 'job': None, 'hobby': 'girl'}

3、形参的顺序(a--->b,代表的顺序是写参数时,要先写a再写b)
位置参数--->默认参数

def func(a,b,sex='男'):
print(sex)
func(100,200)

位置参数--->*args--->默认参数

def func(a,b,*args,sex='男'):
print(a,b)
print(args)
print(sex)
func(100,200,1,2,34,5,'女',6)
# 结果:
# 100 200 #a,b
# (1, 2, 34, 5,'女',6) #args
# 男 #默认参数

位置参数--->*args--->默认参数--->**kwargs

def func(a,b,*args,sex='男',**kwargs):
print(a,b)
print(args)
print(sex)
print(kwargs)
func(100,200,1,2,34,5,6,sex='女',name='xiaobai',age=1000)
func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女')
# 两个的结果都是:
# 100 200 #a,b
# (1, 2, 34, 5, 6) #args
# 女 #默认参数修改后的值
# {'name': 'xiaobai', 'age': 1000} #kwargs # 若是形参这样写:
def func(a,b,*args,**kwargs,sex='男'):
print(a,b)
print(args)
print(sex)
print(kwargs)
func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女')
# 结果:会报错,默认参数一定要写在kwargs前面

最新文章

  1. 【初探Spring】------Spring IOC(一)
  2. linux 下 systemd-udevd 服务解析
  3. Intellij IDEA +MAVEN+Jetty实现Mybatis的HelloWorld
  4. AngularJS特性
  5. [经典算法] 字符串搜索Boyer-Moore
  6. python autopy
  7. iphone绘图的几个基本概念CGPoint、CGSize、CGRect、CGRectMake、window(窗口)、视图(view)
  8. 14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
  9. PHP根据设备类型自动跳转相应网址页面,这个现在实用
  10. Spring框架中ModelAndView、Model、ModelMap区别
  11. 43个优秀的Swift开源项目推荐
  12. Linux环境安装配置JDK
  13. Swagger插件netcore配置
  14. 数据t转换
  15. GZip使用
  16. 读书笔记——《You Don't Know JS》
  17. FIDDLER的使用方法及技巧总结(连载三)FIDDLER使用技巧及方法
  18. Oracle 高级查询
  19. NSPredicate用法总结(Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取)
  20. window.open()/剪切板ZeroClipboard

热门文章

  1. python学习之图形界面编程:
  2. H5存储
  3. Java编程基础-方法
  4. JS基础1 — 代码要注意的一些问题
  5. Android 如何利用Activity的Dialog风格完成弹出框设计
  6. 导入maven的java web项目运行报错找不到Spring监听器
  7. uvm_driver——老司机带带我
  8. 非常实用的Linux 系统监控工具
  9. (九)maven之聚合多模块
  10. python读取.mat文件