Python函数中的参数类型(位置参数、关键字参数、默认值参数、不定长参数)


函数入门
函数的作用:减少代码的重复性,增强代码的可读性。
例1:没有采用任何参数,且无返回值

def my_function(): # my_function为函数名,而且仅使用小写字母,并使用下划线分隔单词
    print("Hello From My Function!")

my_function() # 调用函数:my_function
pass # 占位符
my_function() # 再调用函数:my_function



例2:没有采用任何参数,且有返回值

def my_func():
    a = 0
    for i in range(1, 11):
        a = a + i
    return a

res = my_func()
print(res)



例3(错误案例):函数定义应始终存在于函数调用之前。否则,我们将得到一个错误# 函数调用

greet('Paul')

# 定义函数
def greet(name):
    print("Hello, " + name + ". Good morning!")

# Erro: name 'greet' is not defined



一、形参和实参

def myFunction(a,b,c): # a,b,c 为形参
    pass

myFunction(x,y,z) # x,y,z 为实参,其中x - a,y - b,z - c 一对一传参



形参:形参被调用时,才分配内存单元,调用结束,就释放内存;形参只在函数内部才有效。
实参:可以是常量、变量、表达式、函数。

二、参数类型
1、位置参数/必需参数,可用在实参和形参中;
2、关键字参数,只用在实参中;
3、默认参数,只用在形参中;
4、可变长度参数/动态参数/不定长参数,只用在形参中。

形参列表中参数顺序:位置参数、不定长参数(*args)、不定长参数(**args)、默认参数

三、从实参的角度看
1.位置参数(必需参数)
按照与函数定义中的参数对应的顺序传递参数。

1.1 无返回值
例1:

# a,b为形参,11,22为实参
def sumpro(a,b):
    print(a+b) # 函数体,尽可能不要出现print,这里方便学习才print打印

# 调用函数,实参必须是确定的值
sumpro(11,22)


例2:日常打招呼案例

def greet(name):
    print("Hello, " + name + ". Good morning!")

greet('Paul') # Hello, Paul. Good morning!


 

def greet(name, msg):
    """This function greets to the person with the provided message"""
    print("Hello", name + ', ' + msg)

greet("Monica", "Good morning!") # Hello Monica, Good morning!



1.2 有返回值

def plus(a, b):
    return a + b
sum = plus(10,15)
print(sum)


2.关键字参数
以任意顺序传递参数并按名称指定每个参数,同时参数的数量都必须与函数定义中的参数数量相匹配。
例1:

def student(firstname, lastname):
     print(firstname, lastname)
     
# 关键字参数
student(firstname ='Geeks', lastname ='Practice')
student(lastname ='Practice', firstname ='Geeks')


例2:
以下调用函数时,参数的顺序可以改变,结果一样。

greet(name = “Bruce”,msg = “How do you do?”)
greet(msg = “How do you do?”,name = “Bruce”)
greet(“Bruce”, msg = “How do you do?”)


def greet(name, msg="Good morning!"):
    """
    这个函数用所提供的信息向对方问好。msg参数,如果没有提供值,则默认为"Good morning!"
    """
    print("Hello", name + ', ' + msg)

greet("Kate")



3.混合参数(位置参数+关键字参数)

def greet(name, msg="Good morning!"):
    """
    这个函数用所提供的信息向对方问好。msg参数,如果没有提供值,则默认为"Good morning!"
    """
    print("Hello", name + ', ' + msg)

greet("Bruce", msg = "How do you do?")


四、从形参的角度看
1.位置参数
1.1 无返回值

# a,b为形参,11,22为实参
def plus(a,b):
    print(a+b) # 函数体,尽可能不要出现print,这里方便学习才print打印

# 调用函数,实参必须是确定的值
plus(11,22)


1.2 有返回值

def plus(a,b):
    print(a+b)

sum = plus(11,22)
print(sum)



2.默认值参数(缺省参数)
如果在函数调用中,没有提供实参值给该参数,则使用默认值参数的值。

def myFun(x, y = 50): 
    print("x: ", x) 
    print("y: ", y) 

myFun(10) # ('x: ', 10)
          # ('y: ', 50)


3.动态参数(*args,**kwargs)
动态参数(或不定长参数)有两种定义方式:

1.元组:在形参前加一个*,接收不定数量、不定名字实参;
2.字典:在形参前加两个*,用于接受关键参数。

3.1 *args:元组
例1:

def greet(*names):
    """这个函数向名字元组中的所有人物问好。"""
    # names是一个带有参数的元组
    for name in names:
        print("Hello", name)

greet("Monica", "Luke", "Steve", "John")



程序运行结果:

Hello Monica
Hello Luke
Hello Steve
Hello John


例2:

def adder(*num):
    sum = 0
    for n in num:
        sum = sum + n
    print("Sum:",sum)
    
adder(3,5)
adder(4,5,6,7)
adder(1,2,3,5,6)


例3:

def plus(*args):
    total = 0
    for i in args:
        total += i
    return total

sum = plus(20, 30, 40, 50)
print(sum)  # 140



例4:位置参数+动态参数(元组)

def mysum(a=0, b=0, *args):
    print("传入的参数:", a, b, args)
    sum = a + b
    for n in args:  # 遍历动态参数(元组)
        sum += n
    return sum


调用函数:

print(mysum(1, 2)) # 传入的参数: 1 2 ()

print(mysum(1, 2, 3)) # 传入的参数: 1 2 (3,)

print(mysum(1, 2, 3, 4)) # 传入的参数: 1 2 (3, 4)



3.2 ** kwargs:字典
例1:创建一个可以接受任意数量关键字参数的函数:

def myFunction(**kwargs):
    for kw in kwargs:
        print(kw, '-', kwargs[kw])

if __name__ == "__main__":
    myFunction(a = 24, b = 87, c = 3, d = 46)
    """程序运行结果:
    a - 24
    b - 87
    c - 3
    d - 46
    """


例2:电脑售价的案例:

def myFunction(**computers):
    for kw in computers:
        print(kw, '-', computers[kw])

if __name__ == "__main__":
    myFunction(dell = 1299.50, asus = 1870.00, hp = 1990.50)
    """程序运行结果:
    dell - 1299.5
    asus - 1870.0
    hp - 1990.5
    """



例3:

def myFunction(x, y, **kwargs):
    print(x)
    print(y)
    for key, value in kwargs.items():
        print(key, '-', value)

if __name__ == "__main__":
    myFunction("ABC", "MNO", a = 24, b = 87, c = 3, d = 46)
    """程序运行结果:
    ABC
    MNO
    a - 24
    b - 87
    c - 3
    d - 46
    """



例4:实发工资=基本工资-缴纳个税金额-缴纳社保费用

def pay(basic, **kvargs):
    # 分别获取tax个人税与social社保费
    tax = kvargs.get('tax')
    social = kvargs.get('social')
    # 实发工资=基本工资-缴纳个税金额-缴纳社保费用
    pay = basic - tax - social
    return pay

print('实发工资是{}'.format(pay(8000, tax=500, social=1500))) # 实发工资是6000



3.3 args,*args,**kwargs 的顺序
技巧:当有位置参数、*args、**kwargs、关键参数时,先看两侧(位置参数与**kwargs/关键参数)再考虑中间。

def myFunction(name,age,*args, **kwargs):
    print(name,age)
    print(args)
    print(kwargs)

if __name__ == "__main__":
    myFunction("Bruce",28,"hello", "mars", a = 24, b = 87, c = 3, d = 46)
    """
    Bruce 28
    ('hello', 'mars')
    {'a': 24, 'b': 87, 'c': 3, 'd': 46}
    """

你可能感兴趣的:(python基础使用,大数据)