zoukankan      html  css  js  c++  java
  • python——函数的形参和实参、参数

    python的参数分类

    python参数可以分为两类:1.定义时的参数——形参(形式参数)、2.调用时的参数——实参(实际参数,传参)

    实参的规则

    实参就是在函数调用的时候,通过函数后面的括号传递给函数,让函数处理的值,如下:

    def factorial(x, y):   # 定义一个factorial函数,设置两个形参
    	"""
    	This is a function that can calculate the product of the two parameter that you send.
    	"""  # 这称为函数的文档,对函数作说明的,可写可不写,可参考本人博客
    	return x * y
    
    factorial(3, 5) # 调用传参,正确
    factorial(2, y=5) # 调用传参,正确
    factorial(x=7, y=5)  # 调用传参,正确
    factorial(y=4, x=6) # 调用传参,正确
    factorial(x=1, 5) # 错误
    

    仔细观察上面代码中的传参方式,这时候我们发现,传递的参数只有两种:

    1. factorial(3, 5),这里的3和5称为普通位置参数(positional),
    2. factorial(2, y=5),这里的2是普通位置参数,y=5称为关键字参数(keyword)

    实参传参的参数类型只有这两种,但是有一些规则:

    1. 普通位置参数要在关键字参数之前,比如上面的factorial(2, y=5)是正确的;factorial(x=1, 6)是错误的
    2. 如果都是普通位置参数,只能按照顺序传参,如上面的factorial(3, 5),x对应着3,y对应着5 , 但是如果都是关键字传参,则顺序可以不同,如上面的factorial(y=4 , x=6)
    形参的各种规则

    形参(即函数在定义时用来占位置的参数)可以分为1、不带缺省值的参数、2、带缺省值的参数、3、可变位置参数、4、可变关键字参数、5、key-word only参数

    1、不带缺省值的参数
    在上面我们定义的factorial中的两个参数称为不带缺省值的参数,下面代码也是:

    def hello(x, y): # x和y都是不带缺省值的参数,调用时必须传参,不然报错
    	print('这是', x, y)
    

    2、带缺省值的参数

    def ex(w=5): # 这是一个带缺省的参数w,如果传参了就是用传入的参数,如果没传参就使用缺省值5
    	print("如果没传参就用缺省值噢", w)
    

    3、可变位置参数
    有缺省值的形参和没有缺省值的形参,我们都可以通过位置传参传入,也可以通过关键字传参传入(上面讲的两种传参方式都可以),如果通过位置传参传入的参数过多,多余的会被收集到args中,并且在args中生成一个元组tuple,*args可以接收0个或多个位置参数,可变位置参数的定义是前面加一个 *
    在函数定义时,没有缺省值的形式参数一定要放在有缺省值的形参之前,不然会报错

    def f1(x, y=4, *args):#这里args就是一个可变位置参数
    	print([x, y, args])
    
    f1(3, 5, 2, 7) # 3给x, 5给y,2、7都给args
    

    4、可变关键字参数

    有缺省值的形参和没有缺省值的形参,我们都可以通过位置传参传入,也可以通过关键字传参传入(上面讲的两种传参方式都可以),如果通过关键字传参传入的参数过多,多余的会被收集到kwargs中,并且在kwargs中生成一个元组字典,**kwargs可以接收0个或多个关键字参数,可变关键字参数的定义是前面加两个 *
    **kwargs只能放在形式参数的最后

    def f2(x, y=3, *args, **kwargs)# 一般函数形参的格式
    	print(x, y, args, kwargs)
    	
    f2(4,3,2,5,z=6,g=3)# 4给了x, 3给了y, 2,5给了args, z=6,g=3给了kwargs
    

    5、key-word only参数
    从名字就可以看出,传参时只能接收keyword(关键字传参),放在*args和**kwargs中间:
    在前面讲到说,没有缺省值的一定要放到有缺省值的后面,但是在key-word only参数中,则无所谓顺序,因为都必须通过关键字传参

    def test(x, y, *args, z=4, s, **kwargs):# z 和 s 是key-word only形式参数
    	print(x,y,args, z, s, kwargs)
    test(3, 2, 5, z=5, s=4, y=7) # 3给了x,2给了y, 5给了args,z=5和s=4给了z和s,y=7给了kwargs
    

    因为key-word only参数只能放在*args后面,如果我们定义时,不想设置可变位置参数,但是需要key-word only参数,只需要在key-word only参数之前加一个 *

    def a(x, *, w): # w是key-word only参数
    	print(x,w)
    
    a(6, w =3) # w只能使用keyword传参方式
    

    总结:

    def func(x, y, *args, z=4, e, **kwargs):
    

    我们把这个定义的形式记住即可,即函数定义时,形式参数有五种,传参时两种,多写代码测试就能记住灵活使用了。

  • 相关阅读:
    Evensgn 的债务
    Passward
    拯救莫莉斯
    文艺平衡树
    Fliptile 翻格子游戏
    Making the Grade (bzoj1592)
    紧急疏散evacuate
    Password
    [NOIP2015]斗地主
    运输问题1
  • 原文地址:https://www.cnblogs.com/duanming/p/11830288.html
Copyright © 2011-2022 走看看