【建议收藏】Python基础教程:第七章_函数的进阶

 原创:公众号 数据说话

https://mp.weixin.qq.com/s/Ym1Sii3ZCIfNZaQvl3FJUg

这是一个Python基础系列教程。习惯看视频的同学可以看这个免费教程:

https://www.bilibili.com/video/BV1ZK411Q7uX/?vd_source=704fe2a34559a0ef859c3225a1fb1b42&wxfid=o7omF0RELrnx5_fUSp6D59_9ms3Y

函数多返回值

学习目标

  • 知道函数如何返回多个返回值

接下来,我们思考一个问题:如果在一个函数中,我们写了两个 return,如下所示,我们的程序会如何执行?

问: 如果一个函数如些两个return (如下所示),程序如何执行?

 
 
 
 

def return_num():
return 1
return 2

result = return_num()
print(result) # 1

我们如果调用这个函数,并且拿到它的返回值,那这个返回值一定是1而不会是2。

return表示将函数的结果返回出去,并且执行了return之后,后面的语句将不会再执行 那也就是我们第二个return,压根就不会执行。所以我们的结果是 1。

那么现在我有个问题,就是你不允许我写两个return,但是呢我就想返回两个返回值,或者说返回多个返回值。

那有没有语法可以写出来呢,肯定是可以的,如果一个函数要返回多个返回值,我们的写法可以如图中代码这样:

多个返回值


如果一个函数要有多个返回值,该如何书写代码?

 
 
 
 

def test_return():
return 1,2

x,y = test_return()

print(x) # 结果1
print(y) # 结果2

按照返回值的顺序,写对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据return,那除此以外呢,我们的类型其实也是不受限的,我们并不是说只能全部都返回,同一类型,你可以第一个返回数字类型,第二个返回一个字符串类型,第三个返回一个bool类型,类型是不受限的。

函数的多种传参方式

学习目标

  • 掌握位置参数

  • 掌握关键字参数

  • 掌握不定长参数

  • 掌握缺省参数

函数参数种类

使用方式上的不同, 函数有4中常见参数使用方式:

  • 位置参数

  • 关键字参数

  • 缺省参数

  • 不定长参数

我们在前面所学习的函数呢,是支持传入参数的,同样我们的传入参数在使用上,也有4种不同的方式,他们分别是位置参数,关键字参数,缺省和不定长这4种使用形式,我们一个个来看一下:

位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。

那这个形式,其实就是我们在前面学习函数的时候一直所使用的形式。比如下面的代码传入了3个参数,那么当我们调用的时候呢,就根据参数的位置挨个去写就行了:比如说 TOM 指定的就是 name 这个形参, 20 指定就是 age这个形参,男指的就是gender这个形参,所以这就是位置参数,根据你传入参数的位置来去确定你传入的是哪一个参数。 

 
 
 
 

def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('T0M',20,'男')

注意:传递的参数和定义的参数的顺序及个数必须一致

关键字参数

关键字参数:函数调用时通过“键=值”形式传递参数。

作用:可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

 
 
 
 

def user_info(name,age,gender):
print(f"您的名字是:{name},年龄是:{age},性别是:{gender}")
#关键字传参
user_info(name="小明",age=20,gender="男")
#可以不按照固定顺序
user_info(age=20,gender="男",name="小明")

#可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user_info("小明",age=20,gender="男")

那所以通过这种形式的话,我们的顺序是无所谓的啊,你可以通过具体的形参名去指定,我要把这个数据传给谁就行了,而不是要固定顺序。这就是关键字参数的形式,使用键等于值的形式,也就是我们传参的时候指定一下形式参数的名字,然后通过等号去指向实际参数。也就是说我们把形式粘参数作为key,把实际参数作为value,以这种键值对的形式将它传递进去。

注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

除此之外,我们的关键字参数还可以与位置参数混合使用。你可以看到,我们首先定义了一个名为“小明”的参数。他没有指定键值,也就是没有指定它的形参是谁,这种形式就是位置参数。位置参数表明“小明”肯定是给“name”的,因为我们是按照顺序去匹配的。所以,“小明”是给“name”的。后面,我们又使用了关键字传参,age 等于20,gender等于男 ,所以它们是完全可以混用的。但是一定要注意,当位置参数和关键字参数混用时,我们必须将位置参数放在最前面。如果你把它们放到后面,那就是语法错误。 

缺省参数

缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。

作用: 当调用函数时没有传递参数, 就会使用默认是用缺省参数对应的值。

比如你可以看到我们这个叫 user_info 的函数,它的第三个参数金的性别默认给了个男,那这种写法就表明如果你给gender不传递内容的话,gender的值就是男。但是如果你传递,我就按照你传递的值去使用,这就叫做默认参数,或者说叫做缺省参数。 

 
 
 
 

def user_info(name,age,gender='男'):
print(f'您的名字是{name},年龄是{age},性别是{gender}')

user_info('TOM',20)
user_info('Rose',18,'女')

注意:函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值

输出结果:

 
 
 
 

您的名字是TOM,年龄是20,性别是男
您的名字是Rose,年龄是18,性别是女

不定长参数

不定长参数:不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。

作用: 当调用函数时不确定参数个数时, 可以使用不定长参数

不定长参数的类型:

①位置传递

②关键字传递

位置传递

那么不定长指的就是我们参数的数量,可以是任意数量的,那么位置传递的不定长,它使用了一个叫做星号的关键字,通过它就可以表明我们这个叫 args 的形式参数。它所接收的参数数量是无限的,你可以给 0 个,也可以给 10 个,给多少个都可以。那这个时候可能就会有疑问了,我这个数量都不受限,你如何接收的呢?那这里就需要请出来我们在前面所学习到的数据容器了。

当我们使用不定长传递的时候,这个 args 这个形式参数,它就会默认标记为一个元组类型,我们知道元组是可以存储多份元素,那既然是元组这种类型的数据容器的话,那么就可以说明我们的许多参数统统都会存到元组内部就可以了,那这就是叫位置传递的形式。 

 
 
 
 

def user_info(*args):
print(args)

# ('TOM',)
user_info('TOM')
# (T0M',18)
user_info('TOM',18)

输出结果:

 
 
 
 

('TOM',)
('TOM', 18)

注意:

传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递

关键字传递

除了位置传递的不定长以外,我们还有叫做关键字传递的不定长。它使用的是两个星号,表示同样它的数量是不受限的。同时,它的内容必须满足 k 等于value的这种键值对的形式。也就是说,我们这个叫 kwargs 的形式参数,它就是一个我们在前面所学习过的字典。当我们调用函数的时候,只需要按照字典的形式去传入它就可以。

 
 
 
 

def user_info(**kwargs):
print(kwargs)
# {'name':'T0M','age':18,'id':110}
user_info(name='TOM',age=18,id=110)

输出结果:

 
 
 
 

{'name': 'TOM', 'age': 18, 'id': 110}

我们在不定长的位置传递这一块,默认有个规范,我们给它起名叫kwargs,不是强制要求,这只是一个规范要求。注意:参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典.

函数作为参数传递

学习目标

  • 掌握函数作为参数传递

在前面的函数学习中,我们一直使用的函数,都是接受数据作为参数传入:

  • 数字

  • 字符串

  • 字典、列表、元组等

其实,我们学习的函数本身,也可以作为参数传入另一个函数内。

如下代码:

 
 
 
 

def test_func(compute):
result = compute(1,2)
print(result)
def compute(x,y):
return x + y
test_func(compute) # 结果:3
 

 
 

def test_func(compute):
result = compute(1,2)
print(result)
def compute(x,y):
return x*y
test_func(compute) # 结果:2
 

 
 

def test_func(compute):
result = compute(1,2)
print(result)
def compute(x,y):
return x-y

test_func(compute) # 结果:-1

函数compute,作为参数,传入了test_func函数中使用。

  • test_func需要一个函数作为参数传入,这个函数需要接收2个数字进行计算,计算逻辑由这个被传入函数决定

  • compute函数接收2个数字对其进行计算,compute函数作为参数,传递给了test_func函数使用

  • 最终,在test_func函数内部,由传入的compute函数,完成了对数字的计算操作所以,这是一种计算逻辑的传递,而非数据的传递。

就像上述代码那样,不仅仅是相加,相见、相除、等任何逻辑都可以自行定义并作为函数传入。

lambda匿名函数

学习目标  

  • 掌握lambda匿名函数的语法

我们已经在前面学习了通过def关键字定义函数。这样定义出来的函数是有名称的,例如定义一个名为add的函数,add就是函数的名称,除此之外,还有一种通过lambda关键字定义函数的语法。

使用Lambda关键字可以定义一个无名称的匿名函数。

函数的定义中

  • def关键字,可以定义带有名称的函数

  • lambda关键字,可以定义匿名函数(无名称)

有名称和无名称的函数有什么区别呢?

  • 有名称的函数,可以基于名称重复使用。

  • 无名称的匿名函数,只可临时使用一次。

匿名函数定义语法:

 
 
 
 

lambda 传入参数:函数体(一行代码)

  • lambda 是关键字,表示定义匿名函数

  • 传入参数表示匿名函数的形式参数,如:x, y 表示接收2个形式参数

  • 函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码

如下代码,我们可以:

  • 通过def关键字,定义一个函数,并传入:

 
 
 
 

def test_func(compute):
result = compute(1,2)
print(result)

def compute(x,y):
return x+y

test_func(compute) # 结果:3

  • 也可以通过lambda关键字,传入一个一次性使用的lambda匿名函数

 
 
 
 

def test_func(compute):
result = compute(1,2)
print(result)
test_func(lambda x,y:x +y) # 结果:3

使用lambda是不是非常的简洁呀,这也是lambda的一个具体的应用场景,就是因为写起来非常的简洁,非常的爽哦!

猜你喜欢

转载自blog.csdn.net/Blue92120/article/details/130618193
今日推荐