python3 函数

Posted YanYan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 函数相关的知识,希望对你有一定的参考价值。

‘‘‘
函数:对代码块和功能的封装和定义。
def 函数名():
    函数体
‘‘‘
def func():
    print("hello world")
func()


‘‘‘
函数的返回值:
1、遇到return,函数结束,函数后面的代码将不会再执行。
2、return 返回值
1).如果不写return,那么返回的就是None。
2).如果return后面写了一个值,则调用者可以接收一个结果。
3).如果return后面写了多个结果,则调用者可以接收一个tuple,调用者可以直接结构成多个变量。

def func(形参):
    函数体

func(实参)

实参:位置参数和关键字参数
形参:位置形参和默认值参数

1、位置参数。
练习:编写函数,给函数传递两个参数a,b。比较a,b的大小,返回a,b中最大的那个数。
‘‘‘
def my_max(a, b):
    return a if a > b else b  # 三元运算符


ret = my_max(5, 8)
print(ret)  # 8

‘‘‘
2、关键字参数
‘‘‘
def my_max(a, b):
    return a if a > b else b


ret = my_max(b=4, a=8)
print(ret)  # 8

‘‘‘
3、混合参数
注意:在使用混合参数的时候,关键字参数必须在位置参数后面。
‘‘‘
def my_max(a, b):
    return a if a > b else b


ret = my_max(9, b=8)
print(ret)
# ret = my_max(b=8, 9)  # 报错,最开始使用了关键字参数,那么后面的位置就串

‘‘‘
总结:在实参的角度来看,分为三种:
    1、位置参数。
    2、关键字参数。
    3、混合参数,位置参数必须在关键字参数前面。
‘‘‘


‘‘‘
在形参角度看
1、位置参数
‘‘‘
def my_max(a, b):
    return a if a > b else b


ret = my_max(4, 6)
print(ret)  # 6

‘‘‘
2、默认值参数
注意:必须先声明位置参数,才能声明默认值参数。
‘‘‘
def my_max(a, b=10):
    return a if a > b else b


ret = my_max(3)
print(ret)  # 10


‘‘‘
动态传参
动态接收位置参数,在形参位置编写*表示接收任意内容。
‘‘‘
def func(*args):  # 多个参数传递进去,收到的内容是元组tuple
    print(args)  # (‘aa‘, ‘bb‘)


func("aa", "bb")


‘‘‘
动态接收参数的时候要注意:动态参数必须在位置参数后面
‘‘‘
def func(*args, a, b):
    print(args)


# func("aa", "bb", "cc", "dd") # 报错:TypeError: func() missing 2 required keyword-only arguments: ‘a‘ and ‘b‘
‘‘‘
这时程序运行会报错,因为前面传递进去的所有位置参数都被*args接收了,a和b永远接收不到参数。
修改为:
‘‘‘
func("aa", "bb", a="cc", b="dd")   # (‘aa‘, ‘bb‘)
‘‘‘
这个时候a和b就有值了,但是这样写,位置参数就不能用了,所以,我们要先写位置参数,然后再用动态参数。
‘‘‘
def func(a, b, *args):
    print(args)


func("aa", "bb", "cc", "dd")  # (‘cc‘, ‘dd‘)

‘‘‘
位置参数、动态参数、默认值参数
‘‘‘
def func(a, b, c="abc", *args):
    print(a, b, c, args)


func("a1", "a2", "a3", "a4", "a5")  # a1 a2 a3 (‘a4‘, ‘a5‘)
‘‘‘
我们发现默认值参数写在动态参数的前面,默认值没有生效,除非,动态参数和默认值参数都不进行传参。
修改上面的代码:
‘‘‘
def func(a, b, *args, c="abc"):
    print(a, b, args, c)


func("a1", "a2", "a3", "a4", "a5")  # a1 a2 (‘a3‘, ‘a4‘, ‘a5‘) abc

‘‘‘
这时候我们发现默认值生效了。如果不给关键字传参,默认值是永远都生效的。
顺序:位置参数,动态参数*,默认值参数

在python中,动态接收位置参数使用*args,args是一个tuple。
动态接收关键字参数使用**kwagrs,kwargs是一个dict。
下面看动态接收关键字参数
‘‘‘
def func(**kwargs):
    print(kwargs)

func(a=1, b=2, c=3)  # {‘a‘: 1, ‘b‘: 2, ‘c‘: 3}
func(a=1, b=2)  # {‘a‘: 1, ‘b‘: 2}

‘‘‘
顺序的问题,在函数调用的时候,如果先给出关键字参数,则整个参数列表会报错
‘‘‘
def func(a, b, c, d):
    print(a, b, c, d)


# func(1, 2, c=3, 4)  # 报错: SyntaxError: positional argument follows keyword argument
‘‘‘
所以,实参的顺序,关键字参数必须在位置参数后面。形参接收的时候也是这个顺序,位置参数必须在关键字参数前面。
‘‘‘
def func(a, b, *args, d=8, **kwargs):
    print(a, b, args, d, kwargs)


func(1, 2, 3, 4, 5, 6, name="lily", age=18)  # 1 2 (3, 4, 5, 6) 8 {‘name‘: ‘lily‘, ‘age‘: 18}
func(1, 2, 3, 4, 5, 6, d=6, name="lily", age=18)  # 1 2 (3, 4, 5, 6) 6 {‘name‘: ‘lily‘, ‘age‘: 18}
func(1, 2, 3, 4, 5, 6, name="lily", age=18, d=6)  # 1 2 (3, 4, 5, 6) 6 {‘name‘: ‘lily‘, ‘age‘: 18}
‘‘‘
最终形参的顺序:位置参数 > *args > 默认值参数 > **kwargs
形参里的*的作用,*表示聚合成tuple,**表示聚合成dict。
实参里的*的作用,*表示打散成具体的元素,**表示打散成关键字传参的形式
‘‘‘
def func(*args):
    print(args)

str1 = "abc"
lst = ["apple", "orange"]
func(*str1, *lst)  # (‘a‘, ‘b‘, ‘c‘, ‘apple‘, ‘orange‘)


‘‘‘
形参里的*的作用,*表示聚合成tuple,**表示聚合成dict。
实参里的*的作用,*表示打散成具体的元素,**表示打散成关键字传参的形式
‘‘‘
def func(**kwargs):
    print(kwargs)


dic = {"name": "lily", "age": 18}
func(**dic)  # {‘name‘: ‘lily‘, ‘age‘: 18}

 

以上是关于python3 函数的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

python常用代码片段总结

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销