码迷,mamicode.com
首页 > 其他好文 > 详细

函数3 参数

时间:2019-01-11 17:15:22      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:形参   spl   pass   结束   col   参数   语法   %s   扩展   

1 形参与实参

  形参即形式参数,就是定义函数时括号中指定的参数,本质变量名

  实参即实际参数,就是在调用函数时传入的参数(括号里的参数),是一个实际的值

在调用函数时就会自动把形参(变量名)和实参(值)进行绑定

在函数调用结束之后绑定关系就会接触

技术分享图片
def func1(a,b): # a,b就是形参 a = 1,b = 2
    print(a)
    print(b)

func1(1,2) # 1,2就是实参
View Code

 

2 位置参数

根据调用阶段 参数分为两类 形参和实参
所以对应的 位置参数也有两种:
位置形参

位置实参
位置,其实指的是顺序,从左往右来定义的参数就是位置(顺序)参数
需要注意的是:
只要是定义了的位置形参都必须被传值
位置形参的数量与位置实参的数量必须一致,不能多传,也不能少传
实参会按照传入的位置依次赋值给形参
技术分享图片
def func(a,b,c):# abc都是位置形参
    print(a,b,c)

func(2,1,3) # 1,2,3都是位置实参

def register(name,passwod,sex):
    print("my name is %s pwd:%s sex:%s" % (name,passwod,sex))

register("123","rose","woman")
View Code

 

3 关键字参数
关键字实参
在调用函数时,指名道姓的为形参赋值就称之为关键字参数
其优点是:
可以打破传入参数的顺序 可以不与形参顺序相同
注意:
1.不管以什么样的方式传值,每一个形参都必须被传值
2.关键字参数必须位于位置参数的后面
3.不能为同一个参数传多次值
4.使用关键字传参时,实参的名字必须与形参的名字匹配

到底是位置参数还是关键字参数 由实参决定
技术分享图片
# def func(a,b,c):
#     print(a)
#     print(b)
#     print(c)
#
# # func(1,2,c = 3) # 与位置参数没区别
# # func(1,2,a = 10) # 重复为a传值了两次
# # func(c = 3,1,2) # 语法错误 关键字参数出现在了位置参数的前面
# func(a = 1,c = 3,b = 2) # 可以打破位置参数的顺序限制
def register(name,pwd):
    print("name is",name)
    print("password is",pwd)
# register(pwd="123",name="bgon")
register("jack",pwd="321")

# 可以不用完全按照顺序来传值
# open("今日内容","r",encoding="utf-8")
View Code

4 默认形参

     在定义时,就已经为形参指定了一个值,那这个形参就称之为默认形参
特点:
在调用时可以不用为默认形参传值,使用这个参数时就是默认值
当然也可以传值,这样的话内部使用就是你传入的值
场景:
当函数中的某一形参经常出现重复的值时,就可以将其定义为默认形参,
可以简化调用代码
需要注意
1.默认形参必须放在非默认形参的后面
2.默认形参的值在定义时就已经固定了
3.默认形参的默认值设置为一个不可变类型,
会导致 每次函数调用都共用同一个默认参数,我们应该将函数设计为独立的功能 每次调用互不干扰
只能是 int float str tuple
技术分享图片
# def reg(name,age,sex="woman"):
#     print(name,age,sex)
#
# reg("rose",18)
# reg("kairy",20)
# reg("maria",39)
# reg("lili",78)
# reg("egon",38,"man")


# def reg1(name,sex,hobby,li=()):
#     print(name,sex)
#     print(li)
#
# reg1("bgon","man","music")
# reg1("cgon","man","play")

# def reg1(name,sex,hobby):
#     print(name,sex)
#     print(hobby)
#
# reg1("bgon","man",["music","play"])

# def fun(b,c,a=10):
#     pass
# 2.
# 默认形参的值在定义时就已经固定了
# x = 1
# def func2(a,b=x):
#     print(a,b)
#
# x = 100
# 在定义时,已经把x值1赋给b了,所以后面在对x做处理不会改变b的默认值
# func2(20)
View Code
可变长参数指的是,可以传任意个数的实参
传入实参是为了给形参来使用,那就意味,必须让形参也具备可以接受任意个数的实参的能力
也就是*和**

*的使用
带*的形参
带*的形参表示可以接受任意个数的实参,接收到的实参会被打包成元组类型
形参的名字可以随意,但是建议用args 是arguments的缩写

带*的实参
在实参前面加*,会自动将*后的值,打散("abc" 打散 成了 "a","b","c")

带*的形参不能接收关键字实参

可变长形参与位置形参混合使用
1.当可变长形参出现在了位置形参的前面时,那么后面的位置形参必须以关键字实参来传入
2.当可变长形参出现在位置形参后面,会先按照顺序给前面位置形参赋值最后剩余的就赋值给可变长args

**的使用
形参中如果带有**,会把关键字实参打包成字典类型传入
只能接收多出来的关键字实参

实参中带**,会把**后的字典(也必须是字典类型)打散,成关键字实参(**{"a":1} 打散为 a = 1)

* 和 **可以为函数预留扩展空间,后期可以根据需求增加参数,而且旧的函数调用方式也不会出现问题
简单地说就是提高函数的扩展性
技术分享图片
# def func(*args):
#     print(args)
#     pass
#
# func(1)
# func(1,2)
# func(1,2,3)

# def func(a,b,c,d,e):
#     print(a,b,c,d,e)
#
# func(1,2,*[0,9,8]) # func(1,2,a,b,c)

# iterable 可迭代的  只要是可以被for in 循环使用的都是可迭代 字符串 列表 元组  字典 集合



#
# func(a=1)
# func(a=1,b=2)
# func(a=1,b=2,c=3)


# 位置形参与 可变长形参混合使用
# 当可变长形参出现在了位置形参的前面时,那么后面的位置形参必须以关键字实参来传入
# def func(*args,a,b):
#     print(a,b,args)
#
# func(1,2,3,4,b=5)
# 当可变长形参出现在位置形参后面,会先按照顺序给前面位置形参赋值最后剩余的就赋值给可变长args
#
# def func(a,b,*args):
#     print(a,b,args)
#
# func(1,2,3,4,5,)
#
# **不能接收位置实参
# def func(**b):
#     print(b)
#
# func(a = 100,c = "abc")

# 先为前面的形参赋值,后续的多余的关键字参数赋值给**
# def func(a,c,**b):
#     print(a,c)
#     print(b)
#
# func(1,s = 100,c = "abc")
# def func(c,a=1,**b):
#     print(a,c)
#     print(b)
#
# func(1,2)


# def func(a=1,b=2,**kwargs):
#     print(a,b,kwargs)
#
# func(a = -1,b=-2,s = 10)


# 实参中带**
# def func(a,b,c):
#     print(a,b,c)
#
# func(**{"a":"rose","b":"woman","c":18}) # func(name="rose",sex="woman")
#
#
#
# print(**{"name":"rose"}) # print(name="rose")


# 写一个带有可变长的位置形参函数
# def func(name,pwd,**kwargs):
#     if name == "bgon" and pwd == "123":
#         if "phone" in kwargs:
#             if kwargs["phone"] == "110":
#                 print("登录成功!")
#         else:
#             print("请传入手机号验证!")
#     else:
#         print("登录失败!")
#
# func("bgon","123")
# func("bgon","123",phone = "110")

# 该方式可以接受任意个数的位置实参和关键字实参,
# 但要注意顺序,位置实参必须在关键字之前

def inner(name,sex,age):
    print(name,sex,age)

def outer(*args,**kwargs):
    print(args)
    print(kwargs)
    inner(*args,**kwargs) # inner(1,2,3,a=10,b=20)

outer(1,2,3,100,a=10,b=20)

# 上述写法 可以将outer接收到的所有参数 原模原样的传给inner函数
View Code

 




函数3 参数

标签:形参   spl   pass   结束   col   参数   语法   %s   扩展   

原文地址:https://www.cnblogs.com/Hale-wang/p/10255740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!