之前的那一篇相关文章阐述了None这种情况, 提及函数要是不进行返回值的设置那么就会默认返回None。如此一来问题便产生了, 具体是怎样去设置返回值呢? 而答案仅仅就是一个词汇。不能丢。
但存在着这么一种情况, 有着一个“暴脾气”, 只要它一出现, 函数就会马上终止结束, 后续的代码哪怕一行都不会去执行, 即便写了那也是等于白写, 毫无意义。
一、什么是返回值
在函数执行结束之后, 将执行期间所产生的结果交付给调用该函数的一方, 而这个被交付的结果便是返回值, 先来看一下定义。
其实你早就用过返回值了,只是没注意:
res1 = type("hello") # 返回值是 str res2 = int(15.6) # 返回值是 15 res3 = ord("a") # 返回值是 97 res4 = chr(65) # 返回值是 'a' res5 = bool(300) # 返回值是 True这儿的这些内置函数, 全部都是有着返回值的, 你只要使用变量去接住, 如此这般就能够拿到结果了。那么, 针对于自定义函数来讲?
二、自定义函数不写 → 返回None
来看一个自定义函数,计算两个数的和:
def add(n1, n2): print(f"收到{n1}和{n2},相加结果是{n1 + n2}") result = add(100, 200) print(result) # 运行结果: # 收到100和200,相加结果是300 # None ← result 接收到的是 None!那个函数明明已经打印出了300, 然而呈现出来的结果却是None, 这是为何呢? 原因在于print就只是把对应的信息展示在屏幕之上, 它和返回值之间不存在任何关联。函数要是没有进行明确的编写, 那就没办法知晓究竟该返回什么内容, 如此一来就只能默认返回None。
生活类比:跑腿小哥
你雇了个跑腿小哥(函数),让他去买菜。
一位小哥, 在店门口, 扯着嗓子喊了一句, “东西买到了!”, 你听见了, 然而手上并没有拿着东西。
• = 小哥把东西亲手交到你手上(你真正拿到了结果)
• 没写 = 小哥跑完腿,空着手回来了(None)
print是"喊一嗓子",才是"交到你手上"。两码事。
三、关键字:一句话干两件事
想给函数设置返回值,就得用 关键字。它干两件事:
给add函数加上:
def add(n1, n2): answer = n1 + n2 return answer # 结束函数,把answer的值返回给调用者 result = add(100, 200) print(result) # 运行结果:300这回就是300了,不再是None。
后面不一定要写变量
后面可以写变量、写值,也可以直接写运算表达式:
# 写法一:先算好,再返回变量 answer = n1 + n2 return answer # 写法二:直接返回运算结果(更简洁) return n1 + n2先将运算算出来, 之后把算出来的结果作为返回值交出去, 两种写法的效果是一样的, 要留意和后面的值之间得有一个空格。
四、后的代码:写了也是白写
这属于本文最为关键重要的知识点范畴, 当一旦执行, 函数便马上“下班”, 后续的所有代码都将全然不再执行。
def add(n1, n2): return n1 + n2 print("add函数执行完毕了") # ← 这行永远不会执行! result = add(100, 200) # 运行结果:300 # "add函数执行完毕了" 根本没打印倘若在这一行出现飘红警告, 其内容为: 此代码不可达到, 这所表达的意思是, 这一行代码永远都无法运行到。
️ 铁律
紧接着的下一行不要再去写代码了, 即便去写了那也是白白地写。函数只要执行到那个位置就如同到点“打卡下班”了, 在这之后的事情它是全然不会去管的。
假如, 你真的, 确实, 是想要, 在于函数结束的时候, 去打印出一句话, 那该怎么办呢, 很简单, 把print写在上面即可:
def add(n1, n2): print("add函数执行完毕了") # ← 先打印 return n1 + n2 # ← 再返回并结束 result = add(100, 200) # 运行结果: # add函数执行完毕了 # 300五、的四种写法
返回None的是第三种以及第四种情况。由于返回None跟不写所呈现的效果并无差异, 于是就出现了这样一种情况, 那便是写了None的话, 反倒比不上直接不写, 这无疑是做了多余的事。
一个说法澄清
由于None意味着“空”以及“无意义”, 于是在一个函数返回None之际, 众人习惯于讲“这个函数没有返回值”。然而严格来讲, 它返回了None, 只是None太过“空”了, 差不多等同于没有。
六、print函数有没有返回值
能考倒一片新手的乃是这个问题, print可将内容打印至屏幕之上, 它存有返回值吗。
res = print("hello") print(res) # 运行结果: # hello ← print打印的内容 # None ← print的返回值是Noneprint具备打印东西的功能, 然而它不会返回任何具有意义的值, 它所返回的值是None。
这便证实了先前讲的, print是“喊一嗓子”, 与返回值不存在关联。一个函数可不可以予以打印内容, 跟它有没有返回值, 是两件彼此独立的事情。
七、print和,该用哪个
这取决于你的设计:
场景
做法
只想在屏幕上看结果
只写print,不写
想把结果交给调用者处理
只写,不写print
既要显示又要返回
print和都写
众多新手觉得print完就等同于返回了, 然而调用者获取到的始终是None, 进而使得代码到处出问题报错。要记住: print是用来给屏幕展示的, 是面向调用者的。
八、总结:五条铁律
规则
一句话
不写
函数默认返回None
干两件事
结束函数 + 返回值
后的代码
不执行,写了也是白写
None
等于不写,多此一举
print ≠
print给屏幕看,给调用者
宛若跑腿小哥把某样物品递送到你手中, 递完便离去, 后续之事不再理会。倘若你琢磨着让其在离开之前再帮你去做一件事情, 那么就在“递送物品”之前将此事布置妥当。
上一篇学过了None, 这一篇又学了, 如今你终于弄明白函数为何返回None了, 并非是bug, 而是你忘记写了。