Подтвердить что ты не робот

Как использовать одну и ту же строку кода во всех функциях?

Я новичок в 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())
4b9b3361

Ответ 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