python函数细节

本文介绍了Python函数的返回值,包括如何返回单一值、看似返回多个值的实则是返回元组,以及将函数本身作为返回值的闭包概念。同时,讨论了函数的使用范围,区分了public和private函数,强调了封装性的重要性,并通过示例说明了如何利用private函数隐藏内部逻辑,提高代码质量。
摘要由CSDN通过智能技术生成

1. 函数返回值

return语句将值返回到调用函数的出口,函数中一定要有return返回值才是完整的函数。如果我们没有在函数中定义函数返回值,那么程序会自动让函数返回一个结果,该结果是None对象,而None对象表示没有任何值

1.1 将值作为返回值

函数的返回值只有一个,但有时我们会发现有的函数好像有多个返回值,其实这里的“多个”并不是多个返回值。比如函数返回一列表,里面包含很多个元素值。这就类似于,只能从超市带走一个箱子,但是允许我们把一些东西都装到箱子里面看做一个东西带走。

例如:

def f():  
    return 1,'abc','1234'
print(f())  

输出结果:

(1, 'abc', '1234')  

调用f()函数,程序输出为一个元组,所以函数返回值表面上是3个值,其实是返回一个元组,元组里面有三个不同元素(元组语法上不需要一定带上圆括号)。

1.2 将函数作为返回值

我们除了可以将各种类型的值作为返回值外,也可以将函数作为返回值

例如,我们要定义一个函数来求列表中数值元素的和,一般情况下我们是这样定义的:

def plus(*args):  
    s = 0  
    for n in args:  
        s = s + n  
    return s  

但是,如果我们不需要立刻求和,而是在后面的程序中,根据需求再计算,这种情况怎么办呢?这时我们定义的函数可以不返回求和的结果,而是返回计算求和的函数。

所以我们还可以用如下方法定义函数

def lazy_plus(*args):  
    def plus():  
        s = 0  
        for n in args:  
            s = s + n  
        return s  
    return plus  

当我们调用lazy_plus()时,返回的并不是求和结果,而是计算求和的函数

# 定义求和函数,返回的并不是求和结果,而是计算求和的函数  
def lazy_plus(*args):  
    def plus():  
        s = 0  
        for n in args:  
            s = s + n  
        return s  
    return plus
# 调用lazy_plus()时,返回的并不是求和结果,而是求和函数  
f = lazy_plus(1,2,3,4,5)  
print(f)  

输出结果:

<function lazy_plus.<locals>.plus at 0x000001DAC97F9950>  

调用函数f时,才真正计算求和的结果

# 定义求和函数,返回的并不是求和结果,而是计算求和的函数  
def lazy_plus(*args):  
    def plus():  
        s = 0  
        for n in args:  
            s = s + n  
        return s  
    return plus
# 调用函数f时,得到真正求和的结果  
f = lazy_plus(1,2,3,4,5)  
print(f())  

输出结果:

15  

在上述例子中,我们在函数lazy_plus中又定义了函数plus,而且内部函数plus是可以引用外部函数lazy_plus的参数和局部变量的。当函数lazy_plus返回函数plus时,相关参数和变量也将会保存在返回的函数中,这种方式也称为“闭包”(Closure)。

2. 函数使用范围

正常的函数和变量名是公开的public),是可以被直接引用的。比如abs()、abc、dir()等。

  • 类似__xxx__这种格式的变量是特殊变量允许被直接引用,但是会被用作特殊用途。比如__author__、__name__就是属于特殊变量。hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己编程定义的变量一般不会用这种变量名。
  • 类似_xxx和__xxx这种格式的函数和变量就是非公开的private),不应该被直接引用
  • _xxx的函数和变量是protected,我们直接从外部访问不会产生异常。__xxx的函数和变量是private,我们直接从外部访问会报异常,我们要注意前缀符号的区别。

我们要注意用词的区别,我们说的private函数和变量是“不应该”被直接引用,而不是“不能”被直接引用。这是因为在 Python 中并没有一种方法可以真正完全限制访问private函数或变量。但是我们为了养成良好的编程习惯,是不应该引用private函数或变量的。private函数的作用是隐藏函数的内部逻辑,让函数有更好的封装性。

例如:

def _private_1(name):  
    return 'Hello, %s' % name
def _private_2(name):  
    return 'Hi, %s' % name
def greeting(name):  
    if len(name) > 3:  
        return _private_1(name)  
    else:  
        return _private_2(name) 

我们在上述程序块里公开了greeting()函数,greeting()函数需要使用_private_1()_private_2()函数。学习者并不需要知道greeting()函数中的内部实现细节,所以我们可以将内部逻辑用private函数隐藏起来,这是一种十分常用的代码封装的方法。

3. 小结

  • 我们除了可以将函数计算的值作为返回值外,也可以将函数作为返回值。
  • 为了让程序的封装性更好,我们一般都限定函数的使用范围。一般我们把外部需要使用的函数定义为public函数,而把只在内部使用而外部不需要引用的函数定义成private函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小廖同志_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值