嘟嘟酱君 发表于 2020-9-12 19:12:04

大神看看结果对不上问题

谁能帮我看看这个课后作业44讲的,求时间差的问题,为什么我这个在向高位借位时,结果不对?

import time

class Ti:
    def __init__(self):
      self.pp = '请先调用开始时间!'
      self.st = 0
      self.sp = 0
      self.tt = []
      self.dw = ['年','月','日','时','分','秒']

    def __str__(self):
      return self.pp
      __repr__ = __str__      

    def start(self):
      self.st = time.localtime()
      print('计时开始。。。')
      for each in range(6):
            print(str(self.st)+self.dw,end='')

    def stop(self):
      self.sp = time.localtime()
      print('计时结束!')
      for each in range(6):
            print(str(self.sp)+self.dw,end='')
      print(' ')
      
      self._cal()
      
         
    def __add__(self,other):
      num = []
      pp = '两个对象总共用时:'
      for each in range(6):
            num.append(self.tt+other.tt)
            if num:
                pp += str(num)+str(self.dw)

      return pp      
   
      

    def _cal(self):
      self.pp = '总共用时:'
      move = ['0','12','31','24','60','60']               
      
      for each in range(6):
            self.tt.append(self.sp - self.st)

            def pd(x):
                if self.tt < 0:
                  self.tt += int(move)
                  self.tt -= 1
                  x -= 1
                  pd(x)

                else:
                  return self.tt

            pd(int(each))
            
                  
            self.pp += str(self.tt)+self.dw

      print(self.pp)

      self.st = 0
      self.sp = 0
      

疾风怪盗 发表于 2020-9-12 19:34:18

    def __str__(self):
      return self.pp
      __repr__ = __str__


return下面的代码不执行了,可以删了吧

def _cal(self):
      self.pp = '总共用时:'
      move = ['0', '12', '31', '24', '60', '60']

      def pd(x):
            if self.tt < 0:
                self.tt += int(move)
                self.tt -= 1
                x -= 1
                pd(x)

            else:
                return self.tt
      for each in range(6):
            self.tt.append(self.sp - self.st)
            pd(int(each))
            self.pp += str(self.tt) + self.dw

      print(self.pp)

      self.st = 0
      self.sp = 0

这个里面又定义了一个函数,应该这样放才对吧,或者干脆再放外一层
a=Ti()
a.start()
time.sleep(65)
a.stop()
运行了一下
计时开始。。。
2020年9月12日19时31分0秒计时结束!
2020年9月12日19时32分5秒
总共用时:0年0月0日0时1分5秒

没什么问题啊,你的问题是什么?

计算时间差,用datetime函数就能很简单的实现了

sunrise085 发表于 2020-9-12 19:44:50

本帖最后由 sunrise085 于 2020-9-12 19:47 编辑

程序的问题帮你指出来并修改了,修改之处写了注释
import time

class Ti:
    def __init__(self):
      self.pp = '请先调用开始时间!'
      self.st = 0
      self.sp = 0
      self.tt = []
      self.dw = ['年','月','日','时','分','秒']

    def __str__(self):
      return self.pp
    __repr__ = __str__      

    def start(self):
      self.st = time.localtime()
      print('计时开始。。。')
      for each in range(6):
            print(str(self.st)+self.dw,end='')

    def stop(self):
      self.sp = time.localtime()
      print('计时结束!')
      for each in range(6):
            print(str(self.sp)+self.dw,end='')
      print(' ')
      
      self._cal()
      
         
    def __add__(self,other):
      num = []
      pp = '两个对象总共用时:'
      for each in range(6):
            num.append(self.tt+other.tt)
            if num:
                pp += str(num)+str(self.dw)

      return pp      
   
      

    def _cal(self):
      self.pp = '总共用时:'
      move = ['0','12','31','24','60','60']               
      
      for each in range(6):
            self.tt.append(self.sp - self.st)

            def pd(x):
                if self.tt < 0:
                  self.tt += int(move)
                  self.tt -= 1
                  x -= 1
                  pd(x)
                #下面这两行没用,删掉即可,另外这个函数pd最好不要放在for循环中,向前提几行,放在for循环外就挺好
                '''else:
                  return self.tt'''

            pd(int(each))
            
            #你在下面这一行已经把当前一位的结果添加到字符串pp中了,后一位来借位后,你并没有修改字符串中相应的内容      
            #self.pp += str(self.tt)+self.dw
      #所以字符串pp应该另写一个for循环,这样才能保证写进字符串的是借位之后的结果
      for each in range(6):
            self.pp += str(self.tt)+self.dw

      print(self.pp)

      self.st = 0
      self.sp = 0      

嘟嘟酱君 发表于 2020-9-12 19:58:03

sunrise085 发表于 2020-9-12 19:44
程序的问题帮你指出来并修改了,修改之处写了注释

哇,大佬,谢谢谢谢,醍醐灌顶{:5_109:},for里面放函数,我当时想着出现负数判断,现在退出来想,反正是出现负的矫正的,根本不用在循环里面直接把结果矫正就可以了,但是大神for里面再定义一个函数会有什么劣势?请指教,谢谢!

sunrise085 发表于 2020-9-12 20:02:55

嘟嘟酱君 发表于 2020-9-12 19:58
哇,大佬,谢谢谢谢,醍醐灌顶,for里面放函数,我当时想着出现负数判断,现在退出来想,反正是 ...

浪费时间,每次for循环都会定义一次函数。

嘟嘟酱君 发表于 2020-9-12 20:09:22

疾风怪盗 发表于 2020-9-12 19:34
return下面的代码不执行了,可以删了吧




哇,谢谢,我刚学,不知道这个函数,知道的知识太少了,课后作业基本都是按照知道那点东西来做的,而且,这个类里面知识点好多,蜂拥而至,短时间有些消化不了还是要多多学习。

嘟嘟酱君 发表于 2020-9-12 20:31:36

sunrise085 发表于 2020-9-12 20:02
浪费时间,每次for循环都会定义一次函数。

对啊,谢谢大神,还想问一下,函数里什么值需要return?为什么有的函数里面不需要返回外面也可以用,有的就要返回?

sunrise085 发表于 2020-9-12 20:41:39

嘟嘟酱君 发表于 2020-9-12 20:31
对啊,谢谢大神,还想问一下,函数里什么值需要return?为什么有的函数里面不需要返回外面也可以用,有的 ...

需要返回值的时候就返回,不需要的时候就不返回呗
当一个函数只是进行一系列操作的时候就不需要返回值;当一个函数是需要得到莫以特定的结果的时候就需要返回值
看下面这个小例子
def show(string):#这个函数只是打印string的内容,所以不需要返回值
    print(string)

def add_str(string1,string2): # 这个函数要将梁国字符串拼接成为新字符串,所以需要返回值将新字符串返回调用的位置
    string3=string1+string2
    return string3

str1="I Love "
str2="FishC"
str3=add_str(str1,str2)
show(str3)

你的这个函数pd不需要返回值,你看看调用pd函数的那一行,有奖pd赋值给某一变量吗?没有吧。所以你的这个pd函数只是进行一些列操作,并不是想得到一个结果

嘟嘟酱君 发表于 2020-9-12 21:40:15

sunrise085 发表于 2020-9-12 20:41
需要返回值的时候就返回,不需要的时候就不返回呗
当一个函数只是进行一系列操作的时候就不需要返回值 ...

那这个程序,如果我用小甲鱼和小鱼的对象属性的xy值来判断小鱼是否被甲鱼吃掉,是不是在类方法中就不需要返回xy的坐标值了?甲鱼的能量值也是直接用的属性,并没有返回值

import random as r

legal_x =
legal_y =

class Turtle:
    def __init__(self):
      # 初始体力
      self.power = 100
      # 初始位置随机
      self.x = r.randint(legal_x, legal_x)
      self.y = r.randint(legal_y, legal_y)

    def move(self):
      # 随机计算方向并移动到新的位置(x, y)
      new_x = self.x + r.choice()
      new_y = self.y + r.choice()
      # 检查移动后是否超出场景x轴边界
      if new_x < legal_x:
            self.x = legal_x - (new_x - legal_x)
      elif new_x > legal_x:
            self.x = legal_x - (new_x - legal_x)
      else:
            self.x = new_x
      # 检查移动后是否超出场景y轴边界
      if new_y < legal_y:
            self.y = legal_y - (new_y - legal_y)
      elif new_y > legal_y:
            self.y = legal_y - (new_y - legal_y)
      else:
            self.y = new_y      
      # 体力消耗
      self.power -= 1
      # 返回移动后的新位置
      return (self.x, self.y)

    def eat(self):
      self.power += 20
      if self.power > 100:
            self.power = 100

class Fish:
    def __init__(self):
      self.x = r.randint(legal_x, legal_x)
      self.y = r.randint(legal_y, legal_y)
      
    def move(self):
      # 随机计算方向并移动到新的位置(x, y)
      new_x = self.x + r.choice()
      new_y = self.y + r.choice()
      # 检查移动后是否超出场景x轴边界
      if new_x < legal_x:
            self.x = legal_x - (new_x - legal_x)
      elif new_x > legal_x:
            self.x = legal_x - (new_x - legal_x)
      else:
            self.x = new_x
      # 检查移动后是否超出场景y轴边界
      if new_y < legal_y:
            self.y = legal_y - (new_y - legal_y)
      elif new_y > legal_y:
            self.y = legal_y - (new_y - legal_y)
      else:
            self.y = new_y
      # 返回移动后的新位置
      return (self.x, self.y)

turtle = Turtle()
fish = []
for i in range(10):
    new_fish = Fish()
    fish.append(new_fish)

while True:
    if not len(fish):
      print("鱼儿都吃完了,游戏结束!")
      break
    if not turtle.power:
      print("乌龟体力耗尽,挂掉了!")
      break

    pos = turtle.move()
    # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
    # 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
    for each_fish in fish[:]:
      if each_fish.move() == pos:
            # 鱼儿被吃掉了
            turtle.eat()
            fish.remove(each_fish)
            print("有一条鱼儿被吃掉了...")

小莫非 发表于 2020-9-13 05:29:29

嘟嘟酱君 发表于 2020-9-12 20:31
对啊,谢谢大神,还想问一下,函数里什么值需要return?为什么有的函数里面不需要返回外面也可以用,有的 ...

return 是需要将函数里面的一个 元素 或者 值 反出时才用的,如果要用return ,必须要一个变量来接收
页: [1]
查看完整版本: 大神看看结果对不上问题