找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3439|回复: 7

[求助] 函数重构为什么会从出现类型错误?

26

主题

84

帖子

84

积分

新手

积分
84
银发的index 发表于 2018-5-11 17:55:05 | 显示全部楼层 |阅读模式
一个随机游走的函数正常运行是没问题的。然后把里面的一个函数挪出来了,结果再加就变成了类型错误int和none不能相加了。
'''这是重构后不能调用的'''
class Randomwalk():
    '''一个生成随机漫步数据的类'''
   
    def __init__(self, num_points=5000):
        '''初始化随机漫步属性'''
        
        self.num_points = num_points
        
        #所有的随机漫步都从(0,0)开始
        self.x_values = [0]
        self.y_values = [0]
   
    def fill_walk(self):
        '''计算随机漫步包含的所有点'''
        
        #不断漫步,直到列表到达指定长度
        while len(self.x_values) < self.num_points:
            #决定前进方向和沿着这个方向的前进距离
            x_step = self.get_step()
            y_step = self.get_step()
            
            #拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue
               
            #计算下一个点的x和y值
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step
            self.x_values.append(next_x)
            self.y_values.append(next_y)
   
    def get_step(self):
        x_direction = choice([1,-1])
        x_distance = choice([0,1,2,3,4,5,6,7,8])
        x_step = x_direction * x_distance
        
        y_direction = choice([1,-1])
        y_distance = choice([0,1,2,3,4,5,6,7,8])
        y_step = y_direction * y_distance
        
'''这是重构前没问题的'''

    def fill_walk(self):
        '''计算随机漫步包含的所有点'''
        
        #不断漫步,直到列表到达指定长度
        while len(self.x_values) < self.num_points:
            #决定前进方向和沿着这个方向的前进距离
            x_direction = choice([1,-1])
            x_distance = choice([0,1,2,3,4,5,6,7,8])
            x_step = x_direction * x_distance
            
            y_direction = choice([1,-1])
            y_distance = choice([0,1,2,3,4,5,6,7,8])
            y_step = y_direction * y_distance
            
            #拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue
               
            #计算下一个点的x和y值
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step
            self.x_values.append(next_x)
            self.y_values.append(next_y)

QQ截图20180511175037.png
回复

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2018-5-11 18:51:06 | 显示全部楼层
大兄弟,你这描述的简直了,直接贴两份代码不行嘛,看了半天没看懂,还以为你说前面那个是正确的代码呢,纠结了半天
你重构的这个函数def get_step(self),没有返回值,所以  x_step = self.get_step(),   y_step = self.get_step()这两步执行完后, x_step ,y_step的数据都是None,你这一步self.x_values[-1] + x_step的计算,self.x_values[-1] 是整型int,跟None相加当然会报错咯
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2018-5-11 18:55:23 | 显示全部楼层
本帖最后由 uitb 于 2018-5-11 18:57 编辑
uitb 发表于 2018-5-11 18:51
大兄弟,你这描述的简直了,直接贴两份代码不行嘛,看了半天没看懂,还以为你说前面那个是正确的代码呢,纠 ...

还有你重构的函数跟你这个调用方式,就算你把刚刚我说的返回值搞定了,你不觉得这个还是看着奇怪嘛,还想着他能自己识别你想要哪个数据啊
x_step = self.get_step()
y_step = self.get_step()

  1. def get_step(self):
  2.         x_direction = choice([1,-1])
  3.         x_distance = choice([0,1,2,3,4,5,6,7,8])
  4.         x_step = x_direction * x_distance
  5.         
  6.         y_direction = choice([1,-1])
  7.         y_distance = choice([0,1,2,3,4,5,6,7,8])
  8.         y_step = y_direction * y_distance
  9.         return (x_step,y_step)

  10. #调用方式
  11. x_step,y_step = self.get_step()


  12. #或者
  13. def get_step(self):
  14.         direction = choice([1,-1])
  15.         distance = choice([0,1,2,3,4,5,6,7,8])
  16.         step = direction * distance
  17.         return step
  18. #调用
  19. x_step = self.get_step()
  20. y_step = self.get_step()

  21. #建议第二种,代码重复最少为好
复制代码
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-11 18:58:31 | 显示全部楼层
uitb 发表于 2018-5-11 18:55
还有你重构的函数跟你这个调用方式,就算你把刚刚我说的返回值搞定了,你不觉得这个还是看着奇怪嘛,还想 ...

哦哦,谢谢~那我再想想~
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-11 19:26:14 | 显示全部楼层
uitb 发表于 2018-5-11 18:55
还有你重构的函数跟你这个调用方式,就算你把刚刚我说的返回值搞定了,你不觉得这个还是看着奇怪嘛,还想 ...

为什么有的函数要返回值有的不需要呢?
回复 支持 反对

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-5-11 19:45:58 | 显示全部楼层
本帖最后由 sheeboard 于 2018-5-11 19:54 编辑


回复

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2018-5-12 23:05:33 | 显示全部楼层
银发的index 发表于 2018-5-11 19:26
为什么有的函数要返回值有的不需要呢?

定义一个函数,处理一些事情,如果你只需要处理,不需要处理的结果进行进一步计算分析,就不需要有返回值,或者定义了全局变量,再函数内对全局变量进行操作,比如说结果直接给了全局变量,就不需要返回值;需要返回值得情况是,你需要函数处理结果,进行进一步的计算,比如说你这的x_step,函数生成了一个x_step的值,你调用函数的外层语句需要这个值进行进一步的处理,所以就需要返回值并且把返回值结果赋值给外层变量x_step
举两个例子:
1、不需要返回值:
def fun(x):
    y = x**2
    print y
fun(20)
2、需要返回值:
def fun(x):
    y = x**2
    return y
m = fun(20)
print m
上面两个例子都是要打印一个数的平方,第一个函数,我直接计算了x的平方并且就在函数内就完成了,其他就没什么事需要干了,所以就不需要返回值咯,第二个函数,计算了x的平方,但并没有打印,我要实现前面的功能,进一步处理,在外层打印需要这个计算结果,所以我就需要返回值噻
回复 支持 反对

使用道具 举报

26

主题

84

帖子

84

积分

新手

积分
84
银发的index  楼主| 发表于 2018-5-12 23:47:58 | 显示全部楼层
uitb 发表于 2018-5-12 23:05
定义一个函数,处理一些事情,如果你只需要处理,不需要处理的结果进行进一步计算分析,就不需要有返回值 ...

哦哦,明白了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表