python - 使用和不使用全局变量的 Python 递归
问题描述
到目前为止我的代码:
import statistics
def nested_median(nest, templist=[]):
if not nest:
pass
elif isinstance (nest[0], list):
nested_median(nest[0]), nested_median(nest[1:])
elif isinstance (nest[0], int):
templist.append(nest[0])
nested_median(nest[1:])
return statistics.median(templist)
else:
nested_median(nest[1:])
我正在尝试编写一个程序,该程序将任意嵌套的列表作为输入,并返回列表和/或子列表中所有整数的中位数,同时忽略所有其他元素。例如:
nested_median([3,2,"Hello",[1,5],("Hello", "world"),5,9.3]) == 3
我已经提出了一个使用全局变量的解决方案,但这仅适用于一个函数调用,因为 templist 没有被清除。我有两个问题:
我将如何在函数调用之间清除我的全局变量?
我将如何在不使用全局变量的情况下实现这一点?
解决方案
您描述为“变量未清除”的问题是“可变默认参数”问题。许多博客和教程都是关于它的。在这里,请参阅:“Least Astonishment”和 Mutable Default Argument。
下面是一个递归生成器,用于展平任意嵌套列表,稍作修改以仅返回整数。
def ifl(x):
if isinstance(x, list): # to flatten tuples as well: isinstance(x, (list, tuple))
for item in x:
yield from ifl(item)
elif isinstance(x, int):
yield x
# else: ignore x
test = [3,2,"Hello",[1,5],("Hello", "world"),5,9.3]
ints = list(ifl(test)) # [3, 2, 1, 5, 5]
# ... compute median
推荐阅读
- javascript - 如何处理 MongoDB/mongoose 中的转换错误
- apache-kafka - 在尝试开始使用休息代理时出现错误“未找到消费者实例”,即使提供了正确的消费者实例 ID
- java - 想立即将数据保存到数据库中的表中
- java - 如何在 JUnit 5 Java 中模拟 JsonWebToken 库
- c# - 从特定日期时间从 db 获取所有记录
- idris - Idris:是否可以通过接口限制函数输出?
- sql - 基本 SQL 查询协助
- python - 如何使用间隔索引向熊猫数据框添加一行
- javascript - 从 Form 创建一个对象数组
- c++ - 声明期间的 C++ 赋值运算符