22

day10:函数的实参&形参

 3 years ago
source link: http://www.cnblogs.com/libolun/p/13335728.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

函数的参数 (参数:配合函数运算的值)

参数:

(1)形参:形式参数,在函数的定义处

(2)实参:实际参数,在函数的调用处

形参: 普通形参(位置) , 默认形参 , 普通收集形参 , 命名关键字 形参 , 关键字收集形参

实参: 普通实参,关键字实参

遵循原则:

形参和实参要一一对应

1.普通形参

# 1.普通形参
# 函数的定义处
"""hang,lie是函数的普通形参"""
def s_star(hang,lie):
    i = 0
    while i < hang:
        j = 0
        while j < lie:
            print("*",end="")
            j+=1
        print()
        i+=1
        
# 函数的调用处
"""10,10 是函数的实际参数"""
s_star(10,10)
s_star(3,8)

2.默认形参

# 2.默认形参
def s_star(hang=10,lie=10):
    i = 0
    while i < hang:
        j = 0
        while j < lie:
            print("*",end="")
            j+=1
        print()
        i+=1
        
# 函数的调用处
"""
在函数调用时:
    如果给予实参,那么直接使用实际参数
    如果没有给予实参,那么使用参数默认自带的值 
"""
s_star() # 10行10列小星星
s_star(3,8) # 3行8列小星星
s_star(4) # 4行10列小星星

3.普通形参+默认形参

默认形参必须跟在普通形参的身后,顺序是一定的

# 3.普通形参 + 默认形参
# 函数的定义处
"""默认形参必须跟在普通形参的身后,顺序是一定的"""
def s_star(hang,lie=10):
    i = 0
    while i < hang:
        j = 0
        while j < lie:
            print("*",end="")
            j+=1
        print()
        i+=1
        
# 函数的调用处
s_star(3,3) # 3行3列
s_star(3) # 3行10列
s_star() # error

4.关键字实参

关键字实参是对具体的某个参数赋值,具体的顺序可以打乱

# 4.关键字实参
"""关键字实参是对具体的某个参数赋值,具体的顺序可以打乱"""
# 函数的定义处
def s_star(hang,a,b,c,d,lie=10):
    i = 0
    while i < hang:
        j = 0
        while j < lie:
            print("*",end="")
            j+=1
        print()
        
        i+=1

# 函数的调用处
s_star(hang=4,a=1,b=2,c=3,d=4,lie=5)
s_star(c=3,d=4,lie=5,hang=4,a=1,b=2) # 关键字实参参数顺序可以打乱

5.普通实参+关键字实参

关键字实参必须跟在普通实参的身后,顺序是一定的

# 5.普通实参 + 关键字实参
def s_star(hang,a,b,c,d,lie=10):
    i = 0
    while i < hang:
        j = 0
        while j < lie:
            print("*",end="")
            j+=1
        print()
        
        i+=1

# 函数的调用处
"""关键字实参必须跟在普通实参的身后,顺序是一定的"""    
s_star(5,6,99,c=7,d=8,lie=9)
s_star(c=7,d=8,lie=9,5,6,99) # error 关键字实参必须跟在普通实参的后面
s_star(5,1,c=2,d=3,lie=10,b=5) # ok
s_star(5,1,c=2,d=3,lie=10,a=5) # error 重复给a赋值,错误

6.要注意区分默认形参和关键字实参

默认参数和关键字实参 在写法上一模一样

默认形参是在函数的定义处

关键字实参是在函数的调用处

7.普通收集参数 *args

"""
1.普通收集参数:    专门用来收集多余的没人要的普通实参
    def func(*args):
        code...
    *args => arguments(参数)
    在args这个参数的前面加上一个*表达普通收集参数,形成一个元组
"""

# 基本使用
def func(a,b,c,*args):
    print(a,b,c) # 1 2 3
    print(args) # (4,5,6,7,8)
    
func(1,2,3,4,5,6,7,8)

# 计算任意个数的累加和
def func(*args):
    total = 0
    for i in args:
        total += i
    print(total)
    
func(1,2,3,4,6,10,11,100)

8.关键字收集参数 **kwargs

"""
2.关键字收集参数 : 专门用来收集多余的没人要的关键字实参
    def func(**kwargs):
        code1...
    **kwargs => keyword arguments
    在kwargs参数的前面加上2个**表达关键字收集参数,形成一个字典
"""

# 基本使用
def func(a=1,b=2,c=3,**kwargs):
    print(a,b,c)
    print(kwargs) # {'f': 1, 'g': 2, 'j': 3}

func(f=1,g=2,j=3,a=15,b=16,c=17)

# 任意个数字符串的拼接
"""
班长:宋云杰
班花:刘彩霞
班草:刘子涛
吃瓜群众:牧树人,晏国彰,刘聪
"""

def func(**kwargs):
    print(kwargs)
    # 定义一个字典,存放每一位同学的身份
    dic = {"monitor":"班长","class_flower":"班花","class_grass":"班草"}
    strvar1 = ""
    strvar2 = ""
    
    # 遍历字典中的键值对
    for k,v in kwargs.items():
        print(k,v) # monitor 宋云杰  class_flower 刘彩霞 class_grass 刘子涛 ....
        # 判断键是否在字典当中,如果在,获取对应的身份,拼装成字符串
        if k in dic:
            strvar1 += dic[k] + ":" + v + "\n" # 班长 + ":" + 宋云杰 + '\n'
        else:
            strvar2 += v + ","
    
    # 去掉右边多余的\n和,形成最后的效果
    print(strvar1.strip())
    print("吃瓜群众:"+ strvar2.rstrip(","))
    


func(monitor="宋云杰",class_flower="刘彩霞",class_grass="刘子涛",eatgua1="牧树人",eatgua2="晏国彰",eatgua3="刘聪")

9.命名关键字参数

# 3.命名关键字参数
"""
定义命名关键字参数的两种方式:
    (1)def func(a,b,*,c) c是命名关键字
    (2)def func(*args,c,**kwargs) c是命名关键字参数
    在函数调用时,必须使用命名关键字参数来进行赋值
"""
# 定义方式一
def func(a,b,*,d,c):
    print(a,b) # 1 2
    print(d) # 3
    print(c) # 10
    
func(1,2,d = 3,c=10)

# 定义方式二
def func(*args, c, **kwargs):
    print(args) # (1, 2, 3, 4, 5, 6)
    print(c) # 100
    print(kwargs) # {'a': 1, 'b': 2, 'd': 6}

func(1, 2, 3, 4, 5, 6, a=1, b=2, d=6, c=100)

10.关于* 和 ** 的使用方法

* 和 ** 在函数的 定义 处,用来做 收集操作,打包

* 和 ** 在函数的 调用

处,用来做

打散操作,解包

# * 解包列表
def func(a,b,*,c,d):
    print(a,b)
    print(c,d)  
lst = [1,2]
# *把列表里面的所有元素拿出来,当成参数一个一个赋值给func进行调用
func(*lst,c=3,d=4)

# ** 解包字典
def func(a,b,*,c,d):
    print(a,b)
    print(c,d)
dic = {"c":3,"d":4}
# **把字典里面的所有元素拿出来,拼装成键=值的参数形式,赋值给func进行调用
func(1,2,**dic,) # func( c=3, d=4 )

# *和**的组合
func(*lst,**dic)
strvar = "abc"
print(*strvar)

11.形参定义的顺序

当所有参数都在一起的时候,按照什么顺序定义呢?

参数定义的顺序: 普通参数 -> 默认参数 -> 普通收集参数 -> 命名关键字参数 -> 关键字收集参数

收集到所有的实参: def func(*args,**kwargs)

12.关于所有参数混合的练习题

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

# 以上两个函数 打印结果

# 第一题
f1(1, 2) # a=1,b=2,c=0,args=(),kw={}
f1(1, 2, c=3) # a=1,b=2,c=3,args=(),kw={}
f1(1, 2, 3, 'a', 'b') # a=1,b=2,c=3,args=(a,b),kw={}
f1(1, 2, 3, 'a', 'b', x=99) # a=1,b=2,c=3,args=(a,b),kw={x:99}
f2(1, 2, d=99, ext=None) # a=1,b=2,c=0,d=99,{ext:None}

# 第二题
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw) # a=1,b=2,c=3,args=(4,),kw={d:99,x:#}

# 第三题
myargs = (1, 2, 3)
mykw = {'d': 88, 'x': '#'}
f2(*myargs, **mykw) #a=1,b=2,c=3,d=88,kw={x:#}

# 第四题
def f1(a, b, c=0, *args,d,**kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
    print(d)
f1(1,2,3, 'a', 'b',d=67, x=99,y=77) #a=1,b=2,c=3,args=(a,b),kw={x:99,y:77}  d:67

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK