如何在所有函数中使用相同的代码行?

时间:2015-09-02 07:36:09

标签: python

我是Python的新手。 我想知道所有函数是否可能继承相同的代码行?

with open(filename, 'r') as f:因为这行代码在所有三个函数中都是相同的。是否可以在不使用类的情况下继承代码?

我试图在stackoverflow和python文档中找到答案,但没有运气。

def word_count(filename):
    with open(filename, 'r') as f:
        return len(f.read().split())


def line_count(filename):
    with open(filename, 'r') as f:
        return len(f.read().splitlines())


def character_count(filename):
    with open(filename, 'r') as f:
        return len(f.read())

6 个答案:

答案 0 :(得分:45)

您的案例中的常用代码是

with open(filename, 'r') as f:
    contents = f.read()

所以只需将其移动到自己的功能:

def get_file_contents(filename):
    with open(filename, 'r') as f:
        return f.read()

def word_count(filename):
    return len(get_file_contents(filename).split())

def line_count(filename):        
    return len(get_file_contents(filename).splitlines())

def character_count(filename):
    return len(get_file_contents(filename))

答案 1 :(得分:15)

我过去所做的是将代码拆分为另一个函数,在您的示例中

with open(filename, 'r') as f:
         f.read()

在你的所有方法中都很常见,所以我会像这样重写它。

def read_file(filename):
    with open(filename, 'r') as f:
         return f.read()

def word_count(filename):
    return len(read_file(filename).split())

def line_count(filename):
    return len(read_file(filename).splitlines())

def character_count(filename):
    return len(read_file(filename))

答案 2 :(得分:6)

我会使用一个类:

class Count:
    """ Object holds everything count-related """
    def __init__(self, filename):
        """ specify filename in class instance """
        with open(filename, 'r') as f:
            self.content = f.read()

    def word_count(self):
        return len(self.content.split())

    def line_count(self):
        return len(self.content.splitlines())

    def character_count(self):
        return len(self.content)

file = Count("whatever.txt")
print(file.word_count())
print(file.line_count())
print(file.character_count())

答案 3 :(得分:3)

你做的不同之处在于你打开文件后,所以如果我在你的鞋子里,我会写一个函数,它接受另一个在文件打开后执行的函数。

让我们在一个例子中说明这一点:

>>> def operate_file(filename, func):
...     with open(filename, 'r') as f:
...         return func(f)

>>> def line_count(f):
...     return len(f.read().splitlines())

>>> def word_count(f):
...     return len(f.read().split())

>>> def character_count(f):
...     return len(f.read())

>>> print operate_file('/tmp/file.txt', line_count)
1200

>>> print operate_file('/tmp/file.txt', word_count)
2800

>>> print operate_file('/tmp/file.txt', character_count)
29750

答案 4 :(得分:3)

我会推荐装饰师。这有点像将重复的代码行转换为函数,但由于你要在每个输入上调用该函数,装饰器可以让你只需编写函数,因为id f是输入。

@open_fileword_count=open_file(word_count)的缩写。

here是阅读有关python装饰器的更多信息的好地方。

def open_file(func):
    def wrapped_func(filename):
        with open(filename, 'r') as f:
            return func(f)
    return wrapped_func

@open_file
def word_count(f):
    return len(f.read().split())

@open_file
def line_count(f):
    return len(f.read().splitlines())

@open_file
def character_count(f):
    return len(f.read())

答案 5 :(得分:2)

这取决于你想要对3个功能的结果做什么。每个函数都打开同一个文件。这种情况只发生了3次,以获得3种不同的属性。 一个好的解决方案就是上课。但另一种方法是将你的功能重新安排到一个。这可能会返回一个字典或带有结果的元组。

它看起来像这样:

def file_count(filename):
    with open(filename, 'r') as f:
        content = f.read()
        properties = {}
        properties['words'] = len(content.split())
        properties['lines'] = len(content.splitlines())
        properties['chars'] = len(content)
        return properties