??斗地主捕鱼电竞提现秒到 广告位招租 - 15元/月全站展示
??支付宝搜索579087183领大额红包 ??伍彩集团官网直营彩票
??好待遇→招代理 ??伍彩集团官网直营彩票
??络茄网 广告位招租 - 15元/月全站展示
python函数——形参中的:位置参数,关键字参数,默认参数,*args 和 **kwargs的关系

转载   异客丶   2018-11-15   浏览量:14


位置参数:按照参数位置依次赋值

 彩票开奖查询 www.kbyp.net def foo(a,b,c):
    print("a:" + a)
    print("b:" + b)
    print("c:" + c)

foo("aaa","bbb","ccc")

运行结果:

a:aaa
b:bbb
c:ccc

关键字参数:用于函数调用,通过“键-值”形式加以指定??梢匀煤忧逦?、容易使用,同时也清除了参数的顺序需求。

#关键字参数传入时位置可以不一一对应,也可以与位置参数混合使用
#注意,关键字参数必须在位置参数之后,否则产生二义性,编译不通过
def foo(a,b,c):
    print("a:" + a)
    print("b:" + b)
    print("c:" + c)

foo("aaa",c="is c",b="is b")

运行结果:

a:aaa
b:is b
c:is c

如下编译不通过,会报错:

def foo(a,b,c):
    print("a:"+a)
    print("b:"+b)
    print("c:"+c)
#错误示范,这样调用编译不通过
foo("is c",a="is a",b="is b")

提示报错:foo()的参数a有多个值

TypeError: foo() got multiple values for argument 'a'

默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)

def foo(a,b,c="hello C"):
    print("a:"+a)
    print("b:"+b)
    print("c:"+c)

foo("hello A","hello B")
'''运行结果为:
a:hello A
b:hello B
c:hello C'''

foo("hello a",b="hello b",c="hello c")
'''运行结果为:
a:hello a
b:hello b
c:hello c'''

foo("a","b","c")
'''运行结果为:
a:a
b:b
c:c'''

多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现

*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)

def foo(x,*args):
    print(x)
    print(args)
foo(1,2,3,4,5)#其中的2,3,4,5都给了args

运行结果:

1
(2, 3, 4, 5)

当args与位置参数和默认参数混用的情况下:(注意三者的顺序)

示例一、(三者顺序是:位置参数、默认参数、*args)

def foo(x,y=1,*args):
    print(x)
    print(y)
    print(args)

foo(1,2,3,4,5)#其中的x为1,y=1的值被2重置了,3,4,5都给了args

执行结果是:

1
2
(3, 4, 5)

 示例二、(三者顺序是:位置参数、*args、默认参数)

def foo(x,*args,y=999):
    print(x)
    print(args)
    print(y)

foo(1,2,3,4,5)#其中的x为1,2,3,4,5都给了args,y按照默认参数依旧为1

执行结果是:

1
(2, 3, 4, 5)
999

其中关于*,可以从2个角度来看(需要拆分来看):

1、从形参的角度来看:

示例:

def foo(*args):#其实这一操作相当于def foo(a,b,c,d,e):
    print(args)
foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置传值分别传给了a,b,c,d,e

执行结果是:

(1, 2, 3, 4, 5)

2、从实参的角度来看:

示例:

def foo(x,y,z):
    print(x)
    print(y)
    print(z)
foo(*(1,2,3))#其中的*(1,2,3)拆开来看就是:foo(1,2,3),都按照位置传值分别传给了x,y,z

执行结果是:

1
2
3

**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)

示例:

def foo(x,**kwargs):
    print(x)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4)#将y=1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

1
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

关于*kwargs与位置参数、args、默认参数混着用的问题:(注意顺序)

位置参数、args、*kwargs三者的顺序必须是位置参数、args、**kwargs,不然就会报错:

示例:

def foo(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
foo(1,2,3,4,y=1,a=2,b=3,c=4)
#释义:将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

错误示例:(由于顺序错误)

def foo(x,**kwargs,*args):
    print(x)
    print(args)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4,2,3,4)

执行结果就会报错:

SyntaxError: invalid syntax

* 位置参数、默认参数、kwargs三者的顺序必须是位置参数、默认参数、kwargs,不然就会报错:

示例:

def foo(x,y=1,**kwargs):
    print(x)
    print(y)
    print(kwargs)
foo(1,a=2,b=3,c=4)#将1按照位置传值给x,y按照默认参数为1,a=2,b=3,c=4以字典的方式给了kwargs

执行结果是:

1
1
{'a': 2, 'b': 3, 'c': 4}

  

其中关于**,可以从2个角度来看(需要拆分来看):

1、从形参的角度来看:

示例:

def foo(**kwargs):#其实就是相当于def foo(y,a,b,c)
    print(kwargs)
foo(y=1,a=2,b=3,c=4)

执行结果是:

{'y': 1, 'a': 2, 'b': 3, 'c': 4}

2、从实参的角度来看:

示例一:

def foo(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)
foo(**{"a":2,"b":3,"c":4,"d":5})
#释义:**{"a":2,"b":3,"c":4,"d":5}是将字典里的每个值按照关键字传值的方式传给a,b,c,d

执行结果是:

2
3
4
5

示例二:

def foo(a,b,c,d=1):
    print(a)
    print(b)
    print(c)
    print(d)
foo(**{"a":2,"b":3,"c":4})
#释义:**{"a":2,"b":3,"c":4}是将字典里的每个值按照关键字传值的方式传给a,b,c;d依旧按照默认参数

执行结果是:

2
3
4
1

上文中关于*args和**kwargs的例子是引用下面这位兄弟的,原文链接在下面
https://www.cnblogs.com/xuyuanyuan123/p/6674645.html

转载自://blog.51cto.com/13993319/2317427

招聘 不方便扫码就复制添加关注:程序员招聘谷,微信号:jobs1024



常用数据库操作语句(1)
建库CREATEDATABASEIFNOTEXISTSgloryroadDEFAULTCHARSETutf8COLLATEutf8_general_ci;建表createtablestudentInfo(IDintnotnullauto_incrementcomment"不为空的自增长的主键ID",student_idvarchar(20)notnull,namevarchar
Python打开文件
Python打开文件
处理任意格式的文本文件
#内存--硬盘内容序列话#手动挡#f=open('文件名或类似文件的东西','文件打卡模式')#f是文件对象或指针,用来进行读写操作#f.close()#三种模式:#w.write写#rread读#aappend追加内容importos%pwd'C:\\study\\jupyter'f=open('coop.txt','w')#用w的方式打开文件,不存在则创建f.write('coop'*7)#向
python3异步编程-实例
Python3异步编程实例篇本篇主要内容:启动一个线程启动多线程获取线程名字让线程按顺序执行给线程加上日志线程类的实现线程锁多线程使用全局变量下锁的重要性锁嵌套的问题使用队列来存储线程数据取得线程中的线果多线程与非多线程性能对比多线程与非多线程I/O操作线程池的使用一、用threading启动一个线程示例代码:#!/usr/bin/python3importtimefromthreadingimp
django自定义sql返回元组的处理
1.views.pydefscheduling(request):cursor=connection.cursor()cursor.execute("selectstaff_namefromalarm_platform.TBL_STAFFwherestaff_number=any(selectduty_staff_number1fromalarm_platform.TBL_DUTY);",None
Python Day22
CBV视图类
python 在Centos6下部署Mongodb数据库
注:Cenots7的系统不需要部署glibc,可以直接安装启动Mongodb数据库脚本如下catmongodbInstall.py#!/usr/bin/envpython#coding:utf-8importosimportzipfileimporttarfileimportshutilline=os.linesepscript_path=os.getcwd()glibc_package='gli
python伪代码之爬取完美志愿全国历年文理分数线运行代码持续更新
最近好多小伙伴说想搞个项目实战类的,我就花了一点时间做了一个爬虫项目(在代码复制的时候可能会有点问题,缩格一下就没有问题了)想要获取更多源码或者答疑或者或者交流学习可以加群:725479218#-*-coding:utf-8-*-fromfunction.data_toolimportclean_dataimporthashlibimportfurl.furlfromcrawlers.downlo
Python基础--字典(dictionary)
1.字典的定义,键唯一,值随意dic={key0:value0,key1:value1}2.输出print(dic[key0])>>:value03.遍历字典3.1keys()遍历字典中的keydic={'name':'zhangsan','age':20}forkindic.keys():print(k)>>:nameage3.2values()遍历字典中的valuedi
Python基础--元组(tuple)
1.元组的定义,元组与列表不同之处在于元组中的元素不能修改:tup1=('张三','李四',123)2.读取元组数据,和列表相同print(tup1[0])>>:张三3.index()方法,返回元素在元组中得位置,不存在则报错print(tup1.index('张三'))>>:04.count()计算元素在元组中出现的次数print(tup1.count(123))>