写了个函数,跑也跑了,结果用变量一接,怎么就是个None?
这问题新手基本都踩过,根子就在`return`的理解上。
许多人把`return`和`print`搞混。
`print`是给屏幕看的,是给人的表演。
`return`是函数干完活,递出来的成果,是给另一段代码接着用的。
代码之间的数据传递,靠的就是它。
一个函数,要是没写`return`,或者就一个光秃秃的`return`,它默认就交回一个`None`。
这是Python的规矩,告知你“这儿没东西给你”。
所以你拿到的变量自然是`None`。
`return`也是个“终止符”。
代码里一碰到它,函数立刻结束,后面的代码碰都不碰。
这招在检查输入参数时特别好用,发现除数是0?
直接`return`一个错误提示,省得程序崩溃。
这叫“卫语句”,能让代码逻辑清爽不少,避免一层套一层的if-else。
想一次返回好几个值?
直接用逗号隔开就行,列如 `return name, age`。
Python在背后会帮你打包成一个元组(tuple)。

编辑
接的时候也能直接拆开:`n, a = get_info()`,特别方便。
有个坑要注意。
如果你`return`一个列表或者字典这种可变对象,外面拿到的是“本体”的引用,不是复印件。
外面代码把它改了,函数内部的那个可能也跟着变了。
返回数字、字符串这种不可变对象就没这烦恼。
`return`还有个兄弟叫`yield`。
`return`是交卷走人,一次性给完所有结果。
`yield`是“暂停”,一次给一个,下次还能接着从暂停的地方继续。
处理海量数据时,用`yield`能省下巨额内存,由于它不用一次把所有结果都算出来存着。
这就是生成器的核心。
再来个硬核知识点:如果在`try…finally`结构里,`try`和`finally`块里都有`return`,那`finally`里的说了算。
不管`try`里`return`了啥,最后出去的都是`finally`里的那个。
面试时可能会问到。
返回的值多了,用元组解包就容易乱。
`a, b, c, d, e = func()`,谁记得住哪个是哪个?
这时候不如返回一个字典或者数据类(dataclass),`user['name']`比`user[0]`清楚多了,代码可读性暴增。
所以,`return`不只是个关键字,它是函数和外界沟通的唯一官方渠道。一个函数设计得好不好,看它的`return`就知道一半。它定义了函数的“出口”和“承诺”。




