Есть ли способ использовать параметр функции в качестве другого параметра той же функции? - PullRequest
3 голосов
/ 05 мая 2019

Я новичок в Python и stackoverflow, и я определяю функцию Python, аналогичную встроенной find(), которая принимает строку и подстроку в качестве аргумента и два необязательных аргумента, определяющих начальный и конечный индексы.Я хочу оставить последние два аргумента необязательными, указав параметры по умолчанию.Но я хочу, чтобы конечный индекс был длиной первого аргумента по умолчанию:

    def search(string, substr, start = 0, end = len(string)):
        lenss = len(substr)
        while start < end:
            if string[start : lenss] == substr:
                return start
            start += 1
            lenss += 1
        return False

Но это дает мне ошибку:

Traceback (most recent call last):
    def search(string, substr, start = 0, end = len(string)):
NameError: name 'string' is not defined

Я пытался установить последнийпараметр к None и добавление опекуна:

def search(string, substr, start = 0, end = None):
    if end is None:
           end  = len(string)
    lenss = len(substr)
    while start < end:
        if string[start : lenss] == substr:
            return start
        start += 1
        lenss += 1
    return False

Это выполнит работу, но я хотел знать, есть ли более эффективный способ сделать это и есть ли способ назначить один параметр длядругой из той же функции.Заранее спасибо.

1 Ответ

1 голос
/ 05 мая 2019

То, как вы делаете это здесь, является хорошим и правильным способом сделать это:
(немного увеличен интервал, чтобы быть более обычным)

def search(string, substr, start=0, end=None):
    if end is None:
        end = len(string)

Другой способ сделать это:

def search(string, substr, start=0, end=None):
    end = len(string) if end is None else end

К сожалению, действительно нет другого хорошего пути; параметр функции не может ссылаться на другой параметр, поскольку значения параметров по умолчанию оцениваются только тогда, когда функция определена. Оценивая их в определении, невозможно оценить end=len(string), поскольку невозможно знать, что такое string, когда оно передается в функцию.

...