诡异的python类的实例方法,返回值为什么是None??

popwbob 2016-12-30 07:50:30
今天遇到的python类实例方法返回值为None的问题,同样写了个简单类来验证,可是问题不能找到原因。

#参照类,工作正常,返回值如预期
class test:
def __init__(self, a, b):
self.a = a
self.b = b
self.s = None
def ser(self, c):
self.s = [self.a ,self.b , c]
try:
123 + '123'
except:
return self.s

#下面类的实例方法为什么返回值为None?????????
#测试用数据
#(城市ID,上级城市ID,城市序号,城市名称
departments = [(2, 1, 1, '北京'),(3, 1, 2, '上海'),(4, 1, 3, '广州'),(5, 1, 4, '湖南'),(6, 5, 1, '长沙'),(7, 1, 5, '河北')]
#(用户ID,用户所在城市ID,用户序号,用户姓名)
users = [(1, 2, 1, 'qq'),(2, 3, 2, 'aa'),(3, 4, 3, 'zz'),(4, 5, 4, 'ww'),(5, 6, 5, 'ss'),(6, 7, 6, 'xx')]
#通信录的根节点
root=(1,None,1,'中国')

class StructureTree:
def __init__(self, deps, users):
self.deps = deps
self.users = users
self.node_order = []
self.stack = []
def select_in_tuple(self, list, value,index):
ck = []
for node in list:
if node[index] == value:
ck.append(node)
ck.sort(key=lambda node: node[2])
return ck
def pile_tree(self, node):
users=self.select_in_tuple(self.users, node[0],1)
self.node_order.extend(users)
children = self.select_in_tuple(self.deps, node[0],1)
if len(children) == 0:
try:
next_node=self.stack.pop()
self.node_order.append(next_node)
self.pile_tree(next_node)
except:
print('return self.node_order->',self.node_order) #返回前打印值为正常,返回后却成了None
return self.node_order
elif len(children)==1:
self.node_order.append(children[0])
self.pile_tree(children[0])
else:
self.stack.extend(children[:0:-1])
self.node_order.append(children[0])
self.pile_tree(children[0])

a = test(1, 2)
print(a.ser(3))

st=StructureTree(departments,users)
print(st.pile_tree(root))

输出::

>>>[1, 2, 3]
>>>return self.node_order-> [(2, 1, 1, '北京'), (1, 2, 1, 'qq'), (3, 1, 2, '上海'), (2, 3, 2, 'aa'), (4, 1, 3, '广州'), (3, 4, 3, 'zz'), (5, 1, 4, '湖南'), (4, 5, 4, 'ww'), (6, 5, 1, '长沙'), (5, 6, 5, 'ss'), (7, 1, 5, '河北'), (6, 7, 6, 'xx')]
>>>None
...全文
1472 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
混沌鳄鱼 2016-12-30
  • 打赏
  • 举报
回复 1
这个多出来的None是你的外层print(st.pile_tree(root)) 打印出来的。 这个是你定义方法 def pile_tree(self, node): users=self.select_in_tuple(self.users, node[0],1) self.node_order.extend(users) children = self.select_in_tuple(self.deps, node[0],1) if len(children) == 0: try: next_node=self.stack.pop() self.node_order.append(next_node) self.pile_tree(next_node) except: print('return self.node_order->',self.node_order) #返回前打印值为正常,返回后却成了None return self.node_order elif len(children)==1: self.node_order.append(children[0]) self.pile_tree(children[0]) else: self.stack.extend(children[:0:-1]) self.node_order.append(children[0]) self.pile_tree(children[0]) 你这个方法(函数)没有写显示的return语句, 在python中会隐式地返回一个None return_value = st.pile_tree(root) print(return_value ) 这样肯定会多打印出一个None的 你调用的实例方法的时候既然已经在方法里面打印输出了,就直接调用吧。 或者在在方法中return要打印的值,在外层打印。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

37,739

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧