我是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())
答案 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_file
是word_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