• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【python】函数的位置参数,关键字参数,默认值参数,可变参数,逆向参数收集

一、位置参数

参数的顺序,个数要,在函数调用时,传递进去的参数要和定义的保持一致

def girth(width , height):
    return 2 * (width + height)

#调用函数时,必须传递 2 个参数,否则会引发错误
print(girth(3))

二、关键字参数

函数调用时,对于参数的传递顺序不再强制要求,是参数传递时,写上 形参名=实参

def dis_str(str1,str2):
    print("str1:",str1)
    print("str2:",str2)
#位置参数
dis_str("http://c.biancheng.net/python/","http://c.biancheng.net/shell/")
#关键字参数
dis_str("http://c.biancheng.net/python/",str2="http://c.biancheng.net/shell/")
dis_str(str2="http://c.biancheng.net/python/",str1="http://c.biancheng.net/shell/")

三、默认值参数

Python 定义带有默认值参数的函数,其语法格式如下:
def 函数名(...,形参名,形参名=默认值):
    代码块

注意,在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。

 

四、可变参数(*args,**kwargs)详解

Python 在定义函数时也可以使用可变参数,即允许定义参数个数可变的函数。这样当调用该函数时,可以向其传入任意多个参数。
可变参数,又称不定长参数,即传入函数中的实际参数可以是任意多个。Python 定义可变参数,主要有以下 2 种形式。

1) 可变参数:形参前添加一个 '*'

此种形式的语法格式如下所示:

*args

args 表示创建一个名为 args 的空元组,该元组可接受任意多个外界传入的非关键字实参。

下面程序演示了如何定义一个参数可变的函数:

# 定义了支持参数收集的函数
def dis_str(home, *str) :
    print(home)
    # 输出str元组中的元素
    print("str=",str)
    for s in str :
        print(s)


#可传入任何多个参数
dis_str("http://c.biancheng.net","http://c.biancheng.net/python/","http://c.biancheng.net/shell/")
            


程序执行结果为:
http://c.biancheng.net
str= ('http://c.biancheng.net/python/', 'http://c.biancheng.net/shell/')
http://c.biancheng.net/python/
http://c.biancheng.net/shell/

当然,可变参数并不一定必须为最后一个函数参数,例如修改 dis_str() 函数为:

# 定义了支持参数收集的函数
def dis_str(*str,home) :
    print(home)
    # 输出str元组中的元素
    print("str=",str)
    for s in str :
        print(s)

dis_str("http://c.biancheng.net","http://c.biancheng.net/python/",home="http://c.biancheng.net/shell/")    

可以看到,str 可变参数作为 dis_str() 函数的第一个参数。但需要注意的是,在调用该函数时,必须以关键字参数的形式给普通参数传值,否则 Python 解释器会把所有参数都优先传给可变参数,如果普通参数没有默认值,就会报错。

 

2) 可变参数:形参前添加两个'*'

这种形式的语法格式如下:

**kwargs

**kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。

# 定义了支持参数收集的函数
def dis_str(home,*str,**course) :
    print(home)
    print(str)
    print(course)

#调用函数
dis_str("C语言中文网",\
"http://c.biancheng.net",\
"http://c.biancheng.net/python/",\
shell教程="http://c.biancheng.net/shell/",\
go教程="http://c.biancheng.net/golang/",\
java教程="http://c.biancheng.net/java/")



程序输出结果为:
C语言中文网
('http://c.biancheng.net', 'http://c.biancheng.net/python/')
{'shell教程': 'http://c.biancheng.net/shell/', 'go教程': 'http://c.biancheng.net/golang/', 'java教程': 'http://c.biancheng.net/java/'}

上面程序在调用 dis_str() 函数时,第 1 个参数传递给 home 参数,第 2、3 个非关键字参数传递给 str 元组,最后 2 个关键字参数将由 course 字典接收。

注意,*args 可变参数的值默认是空元组,**kwargs 可变参数的值默认是空字典。因此,在调用具有可变参数的函数时,不一定非要给它们传值。以调用 dis_str(home, *str, **course) 为例,下面的调用方式也是正确的:

dis_str(home="http://c.biancheng.net/shell/")

程序执行结果为:
http://c.biancheng.net/shell/
()
{}

 

五、逆向参数收集详解

Python 还支持逆向参数收集,即直接将列表、元组、字典作为函数参数,Python 会将其进行拆分,把其中存储的元素按照次序分给函数中的各个形参。

举例子:

def dis_str(name,add) :
    print("name:",name)
    print("add",add)
data = ["Python教程","http://c.biancheng.net/python/"]
#使用逆向参数收集方式传值
dis_str(*data)

程序执行结果为:
name: Python教程
add http://c.biancheng.net/python/

再举例子:

def dis_str(name,add) :
    print("name:",name)
    print("add:",add)
data = {'name':"Python教程",'add':"http://c.biancheng.net/python/"}
#使用逆向参数收集方式传值
dis_str(**data)


程序执行结果为:
name: Python教程
add: http://c.biancheng.net/python/

此外,以逆向参数收集的方式,还可以给拥有可变参数的函数传参,例如:

def dis_str(name,*add) :
    print("name:",name)
    print("add:",add)
data = ["http://c.biancheng.net/python/",\
        "http://c.biancheng.net/shell/",\
        "http://c.biancheng.net/golang/"]
#使用逆向参数收集方式传值
dis_str("Python教程",*data)


程序执行结果为:
name: Python教程
add: ('http://c.biancheng.net/python/', 'http://c.biancheng.net/shell/', 'http://c.biancheng.net/golang/')

 

 

posted on 2024-07-29 17:30  无信不立  阅读(148)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3