return 语句是函数和方法的关键组成部分。可以使函数将 Python对象发送回调用者代码,这些对象被称为函数的返回值。

使用它们在程序中执行进一步的计算或者程序的执行。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

文章目录

  • Python 函数入门
  • return 语句
  • return 与 print 的差异
  • 返回多个值
  • return 语句应用
  • 返回函数:闭包
  • 装饰器获取和返回函数
  • 返回定义的对象
  • try…finally 在return中使用
  • return 在生成器函数中使用

Python 函数入门

官方文档定义的函数是将不同类型的代码块返回给调用者的。一系列向调用者返回一些值的语句。它也可以传递零个或多个参数,这些参数可用于执行主体。

函数固定的规则。

def function_name(arg1, arg2,, argN):# 函数方法执行代码pass

调用函数的固定格式。

function_name(arg1, arg2, , argN)

以上在之前的章节 Python基础必掌握的定义Python函数方法详解 中有明确的讲解。

让函数返回一个值需要使用 return 语句。

return 语句

return 语句由 return 关键字和一个可选的返回值组成。返回值可以是:

  • 数值( int、、float和complex值 )

  • 对象的集合和序列(list、tuple、dictionary)

  • set定义(对象、类、函数)

  • 模块或包

    返回值都是 None 的两种情况:

  • 省略函数的返回值并使用return没有返回值的裸函数。

  • 省略整个 return 语句。

显式返回语句,即立即终止函数执行并将返回值发送回调用者代码,return 后跟可选的返回值。

# 显式返回语句
def return_1():return 1
return_1()
1# 可以在任何表达式中使用该返回值
return_42() * 2
2

隐式返回语句,没有使用显式使用返回值则返回一个固定默认为 None 的值。

# 隐式返回语句
def add_one(x):result = x + 1value = add_one(5)
valueprint(value)
None

return 与 print 的差异

# print
def print_():print("真·三國無雙")print_()
真·三國無雙# return
def return_():return "真·三國無雙"return_()
'真·三國無雙'def add(a, b):result = a + breturn result
add(1, 1)
2

返回多个值

使用 return 语句从函数返回多个值的时候需要用逗号( ,)分隔的返回值。

使用统计模块进行计算返回多个值。

import statistics as stdef describe(sample):return st.mean(sample), st.median(sample), st.mode(sample)sample = [10, 2, 4, 7, 9, 3, 9, 8, 6, 7]
mean, median, mode = describe(sample)mean
6.5median
7.0mode
7desc = describe(sample)
desc
(6.5, 7.0, 7)type(desc)
<class 'tuple'>

return 语句应用

None显式三种处理返回方法

省略该return语句并依赖于返回的默认行为None。

def _return():# 代码逻辑pass
print(_return())
None

使用return不带返回值的也返回None。

def _return():# 代码逻辑return
print(bare_return())
None

明确返回None。

def _return():# 代码逻辑return None
print(_return())
None

记住返回值

# 某些计算场景需要初始值计算
def template_func(args):result = 0  # 初始化返回值# 你的业务逻辑return result  # 显式返回结果

避免复杂的表达式

# 尽量简化 return 返回的对象,是逻辑清晰
def variance(data, ddof=0):mean = sum(data) / len(data)return sum((x - mean) ** 2 for x in data) / (len(data) - ddof)def variance(data, ddof=0):mean = sum(data) / len(data)v = sum((x - mean) ** 2 for x in data) / (len(data) - ddof)return vdef variance(data, ddof=0):n = len(data)mean = sum(data) / ntotal_square_dev = sum((x - mean) ** 2 for x in data)return total_square_dev / (n - ddof)variance([3, 4, 7, 5, 6, 2, 9, 4, 1, 3])
5.24

返回值与修改全局变量

全局变量不建议修改,修正全局变量使用 global 方法。

counter = 0def increment():global countercounter += 1increment()
counter
1

如果修改外部的全局变量建议重新赋值。

counter = 0def increment(var):return var + 1increment(counter)
1counter
0# 显式地为 counter 分配一个新值
counter = increment(counter)
counter
1

return 条件触发

return 根据评估某些条件的结果执行不同的命令。

def my_abs(number):if number > 0:return numberelif number < 0:return -numbermy_abs(-15)
15my_abs(15)
15

返回 True 或 False

与 if 语句组合的另一个常见用例 return 布尔值函数时,返回 True 或者 False。

def is_divisible(a, b):if not a % b:return Truereturn Falseis_divisible(4, 2)
Trueis_divisible(7, 4)
False

谓词函数返回 True 或者 False。

# 方法1
def both_true(a, b):return a and bboth_true(1, 2)
2# 方法2
def both_true(a, b):if a and b:return Truereturn False
both_true(1, 2)
True# 方法3
def both_true(a, b):return True if a and b else False
both_true(1, 2)
True
both_true(1, 0)
False# 方法4
def both_true(a, b):return bool(a and b)
both_true(1, 2)
True
both_true(1, 0)
False

短路评估

中断循环执行并使函数立即返回。

def my_any(iterable):for item in iterable:if item:return Truereturn Falsemy_any([0, 0, 1, 0, 0])
True
my_any([0, 0, 0, 0, 0])
False

识别死代码

终止而不执行任何后续代码。

def dead_code():return 42# 死代码,不会再执行print("Hello, World")dead_code()
42

在 if 条件外就不会认为是死代码。

def no_dead_code(condition):if condition:return 42print("Hello, World")no_dead_code(True)
42
no_dead_code(False)
Hello, World

返回多个命名对象

return 语句中返回多个值的函数时可以使用collections.namedtuple 对象增加的函数的可读性。

import statistics as st
from collections import namedtupledef describe(sample):Desc = namedtuple("Desc", ["mean", "median", "mode"])return Desc(st.mean(sample),st.median(sample),st.mode(sample),)sample = [10, 2, 4, 7, 9, 3, 9, 8, 6, 7]
stat_desc = describe(sample)stat_desc
Desc(mean=5.7, median=6.0, mode=6)# 通过属性名称获取平均值
stat_desc.mean
5.7# 通过其索引获取中位数
stat_desc[1]
6.0# 将值解压缩为三个变量
mean, median, mode = describe(sample)mean
5.7
mode
6
median
6.0

返回函数:闭包

将函数作为参数、返回函数作为结果或两者兼有的函数是高阶函数。这种函数接受一些参数并返回一个内部函数,内部函数通常称为闭包。

# 一个简单的乘法函数
def by_factor(factor, number):return factor * number

factor 在应用程序很少更改,会发现在每个函数调用中提供相同的因素非常繁琐。因此需要一种方法来保留调用之间的状态或值,by_factor() 并仅在需要时更改它。要保留调用之间的当前值factor,可以使用闭包。

def by_factor(factor):def multiply(number):return factor * numberreturn multiplydouble = by_factor(2)
double(3)
6triple = by_factor(3)
triple(3)
9

使用 lambda 函数来创建闭包。

# lambda函数的使用提供了一种快速简洁的编码方式
def by_factor(factor):return lambda number: factor * numberdouble = by_factor(2)
double(3)
6

装饰器获取和返回函数

装饰器函数将函数对象作为参数并返回一个函数对象。装饰器以某种方式处理被装饰的函数并将其返回或用另一个函数或可调用对象替换它。

# 计算python程序执行时间的装饰器
import timedef my_timer(func):def _timer(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"耗时: {end - start}")return resultreturn _timer@my_timer
def delayed_mean(sample): # 等价于表达式 my_timer(delayed_mean)time.sleep(1)return sum(sample) / len(sample)delayed_mean([10, 2, 4, 7, 9, 3, 9, 8, 6, 7])
耗时: 1.0063526630401611
6.5

返回定义的对象

可以使用自己的自定义对象作为函数的返回值。

常见用例是定义了一个接口,用于动态创建对象以响应在编写程序时无法预测的条件。可以使用一个函数来实现用户定义对象,该函数接受一些初始化参数并根据具体输入返回不同的对象。

# 一个绘画程序
# 动态创建不同的形状
class Circle:def __init__(self, radius):self.radius = radiusclass Square:def __init__(self, side):self.side = side

可以使用参数列表 ( *args) 和关键字参数 ( **kwargs ) 动态创建一个形状定义一个函数。

def shape_factory(shape_name, *args, **kwargs):shapes = {"circle": Circle, "square": Square}return shapes[shape_name](*args, **kwargs)

此函数创建具体形状的实例并将其返回给调用者。

circle = shape_factory("circle", radius=20)
type(circle)
<class '__main__.Circle'>
circle.radius
20square = shape_factory("square", side=10)
type(square)
<class '__main__.Square'>
square.side
10

try…finally 在return中使用

finally 子句始终在 return 语句之前执行。

def func(value):try:return float(value)except ValueError:return str(value)finally:print("在 return 之前运行")func(9)
在 return 之前运行
9.0func("one")
在 return 之前运行
'one'

return 在生成器函数中使用

代码主体中带有 yield 语句的 Python 函数是生成器函数。当调用生成器函数时,会返回生成器迭代器。

# 一个生成器,1按需2生成,然后返回3 停止
def gen():yield 1yield 2return 3g = gen()
g
<generator object gen at 0x7f4ff4853c10>next(g)
1
next(g)
2next(g) # 生成器耗尽,得到一个StopIteration
Traceback (most recent call last):File "<input>", line 1, in <module>next(g)
StopIteration: 3

Python基础必掌握的return语句用法和实践详解相关推荐

  1. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  2. Python面试必看!53个经典面试题详解

    本文列出53个Python面试问题,并且提供了答案,供数科学家和软件工程师们参考. 不久前,我作为"数据科学家"开始担任一个新的角色,实际上就是一位"Python工程师& ...

  3. Python基础(六) | 面向对象类定义及特性详解

    ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力 ...

  4. Python基础必掌握的条件语句详解

    Python 中的条件语句根据特定布尔约束的计算结果为真或假,执行不同的计算或操作.条件语句由 Python 中的 IF 语句处理. 到目前为止演示的代码都是由顺序执行组成的.但是实际情况是通常程序需 ...

  5. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  6. php switch case 判断语句,PHP的switch判断语句的“高级”用法详解,switch详解_PHP教程...

    PHP的switch判断语句的"高级"用法详解,switch详解 只所以称为"高级"用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实 ...

  7. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)

    以下笔记是我在 xue.cn 学习群之数据分析小组所整理分享的心得.相关背景是:我选择中文词频统计案例作为考察大家python基础功掌握程度. 以小见大,下面是2个小技能的具体实战: 如何灵活地处理文 ...

  8. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  9. python post json参数,Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

最新文章

  1. Groovy 和 Gradle
  2. doctype的种类
  3. c语言口令验证模块加强版,[C语言学习第3章口令验证模块的开发.ppt
  4. 如何使 React 中的 useEffect、useLayoutEffect 只调用一次
  5. 前端学习(1986)vue之电商管理系统电商系统之建立新分支
  6. 关系型数据库性能优化总结(转)
  7. android 自动化测试_Android自动化测试探索之代码覆盖率统计
  8. 1015. 德才论 (25)-PAT乙级真题
  9. 第三步_安装jdk环境
  10. galgame安卓_史上最强教程!教你如何在安卓和ios上运行GALgame!
  11. PAT 1038 贪心
  12. 贪吃蛇小游戏制作(3)
  13. 006 研究生学信网的电子注册备案表在哪里弄
  14. 移动端天气系统--【下雨】效果之【雨滴】的实现和分析
  15. php 半角 全角 转换,PHP半角/全角转换函数
  16. LeetCode——缺失数字(C语言)
  17. power_supply子系统
  18. 浅层砂过滤器的工作原理
  19. python采集银行信息_Python:将银行扣费信息整理成账单
  20. 如何利用群控做流量,手机群控引流方法有哪些

热门文章

  1. 一、需求测试-需求规格说明书规范
  2. codevs 5462 HYY迎亲I
  3. Android游戏接入——华为篇
  4. 你敢信?开发一个管理系统我只用了两天时间
  5. 没涂准考证号电脑能识别吗
  6. rocketmq存储消息mysql_再说rocketmq消息存储
  7. 初识Blob和Filereader
  8. mac nw.js 打包桌面应用程序
  9. C223 生产版本BAPI
  10. Render/RayMarchine/Base 1- 利用Frag Shader绘制图形