有没有一种方法可以将函数参数用作同一函数的另一个参数?

3

我刚开始学习Python和stackoverflow,正在定义一个类似于内置的find()函数的Python函数。该函数需要一个字符串和一个子串作为参数,并且有两个可选参数指定起始和结束索引。

我想通过指定默认参数使后两个参数可选。但是默认情况下,我希望结束索引是第一个参数的长度:

    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

这种方法可以完成任务,但我想知道是否有更高效的方式来做,并且是否有一种将一个参数分配给同一函数的另一个参数的方法。

谢谢提前。

6
你所做的很好,只是你应该使用if end is None而不是==... - Jon Clements
@JonClements 谢谢你让我知道这个。我会编辑帖子。 - Amal K
1
Python 中的默认参数值在函数最初定义时被 计算一次。因此,它们不可能引用其他参数,这些参数直到函数实际调用才存在。 - jasonharper
谢谢!@jasonharper - Amal K
1个回答

1
这里你所采用的方法是一个好的、正确的做法:
(为了更符合传统,稍微调整了一下间距)
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 是什么。


非常感谢您的帮助! - Amal K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接