Как использовать одну и ту же строку кода во всех функциях?
Я новичок в 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())
Ответы
Ответ 1
Общий код в вашем случае
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))
Ответ 2
То, что я делал в прошлом, разбивает код на другую функцию, в вашем примере
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))
Ответ 3
Я бы использовал класс:
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())
Ответ 4
То, что вы делаете по-другому, - это открыть файл, поэтому, если бы я был на вашем месте, я бы написал функцию, которая выполняет другую функцию, которая выполняется после открытия файла.
Обозначим это в примере:
>>> 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
Ответ 5
Я бы рекомендовал декораторов. Это похоже на превращение повторяющейся строки кода в функцию, но поскольку вы все равно будете называть эту функцию на каждом входе, декораторы могут позволить вам просто написать функции, поскольку id f
был входом.
@open_file
является сокращением для word_count=open_file(word_count)
.
здесь - это хорошее место, чтобы больше узнать о декораторах 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())
Ответ 6
Это зависит от того, что вы хотите сделать с результатами ваших трех функций. Каждая функция открывает один и тот же файл. Это происходит 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