阿撩 发表于 2017-11-19 21:14:02

关于函数修饰符的疑惑

import time

def timeslong(func):
    start = time.clock()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.clock()
    return "It's used : %s ." % (end - start)

求问这里的func()是什么意思啊?

还有一个问题:
class Stack:
    def __init__(self, start=[]):
      self.stack = []
      for x in start:
            self.push(x)

    def isEmpty(self):
      return not self.stack
   
    def push(self, obj):
      self.stack.append(obj)

    def pop(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack.pop()

    def top(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack[-1]

    def bottom(self):
      if not self.stack:
            print('警告:栈为空!')
      else:
            return self.stack


在初始化__init__方法里,for x in start:
            self.push(x)的作用是什么?因为后面有个push方法,不要这个,运行出来结果也是一样的,那这段代码的意义是啥?

BngThea 发表于 2017-11-19 21:22:54

1 形参是一个函数,func()表示这个函数用做的事,因为timeslong是一个用来计时的函数,应该写的具有通用性

2 初始化的时候将已有对象进行入栈,如果简单初始化一个空Stack对象这里当然可有可无,但是如果用其他的栈或栈元素表等进行初始化就需要进行数据的拷贝,比如
a = Stack()#因为创建了一个空栈,所以无所谓
。。。# 对a进行的一系列操作后,栈不为空

b = Stack(a)#利用a新建一个新栈,那么就需要对数据进行拷贝

阿撩 发表于 2017-11-21 09:33:39

BngThea 发表于 2017-11-19 21:22
1 形参是一个函数,func()表示这个函数用做的事,因为timeslong是一个用来计时的函数,应该写的具有通用性
...

嗯嗯。比如下面一段代码:
import time

def timeslong(func):
    def call():
      start = time.clock()
      print("It's time starting ! ")
      func()
      print("It's time ending ! ")
      end = time.clock()
      return "It's used : %s ." % (end - start)
    return call

@timeslong
def f():
    y = 0
    for i in range(10):
      y = y + i + 1
      print(y)
    return y

print(f())

我的理解是f函数作为timeslong的参数传入。相当于timeslone(f),对么?
但是在对于类这里我就不理解了
import time
class timeslong(object):
    def __init__(self,func):
      self.f = func
    def __call__(self):
      start = time.clock()
      print("It's time starting ! ")
      self.f()
      print("It's time ending ! ")
      end = time.clock()
      return "It's used : %s ." % (end - start)

@timeslong
def f():
    y = 0
    for i in range(10):
      y = y + i + 1
      print(y)
    return y

print(f())

此时的object是传入的f么?如果是的话是什么意思,还有下面func又代表什么?这里我没懂

ooxx7788 发表于 2017-11-21 09:38:46

阿撩 发表于 2017-11-21 09:33
嗯嗯。比如下面一段代码:

我的理解是f函数作为timeslong的参数传入。相当于timeslone(f),对么?


print(f())的时候,我们去掉print看,实际上执行的是
timeslong(f)()
而这里的f就是在timeslong定义中的func
那么下面的self.f = func   实际上就是self.f=f
在__call__方法中,self.f()则是执行了f()

要点在于分清楚形式参数和实际参数。

zongkang 发表于 2020-8-23 17:10:48

阿撩 发表于 2017-11-21 09:33
嗯嗯。比如下面一段代码:

我的理解是f函数作为timeslong的参数传入。相当于timeslone(f),对么?


object是基类的意思,定义timeslong类是继承于基类,真正的是f传入def __init__(self,func)替代func
页: [1]
查看完整版本: 关于函数修饰符的疑惑