Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能';我不能完全理解这两个函数_Python - Fatal编程技术网

Python 我能';我不能完全理解这两个函数

Python 我能';我不能完全理解这两个函数,python,Python,这两个函数都在我的Python编程书中,我只是不太明白它们为什么要这么做。我真的很想理解,所以任何解释都很好 def example(aString, index): if index == len(aString): return "" else: return aString[index] + example(aString, index + 1) 而且 def example(aString, index): if index &l

这两个函数都在我的Python编程书中,我只是不太明白它们为什么要这么做。我真的很想理解,所以任何解释都很好

def example(aString, index):
    if index == len(aString):
        return ""
    else:
        return aString[index] + example(aString, index + 1)
而且

def example(aString, index):
    if index < len(aString):
        example(aString, index +1)
        print(aString[index], end="")
def示例(aString,index):
如果指数
第一个示例按原样返回字符串

def example(aString, index):
    if index == len(aString):
        return ""
    else:
        return aString[index] + example(aString, index + 1)
比方说,这个函数是这样调用的

example("abc", 0)
"a" + example("abc", 1)
"a" + ("b" + example("abc", 2))
"a" + ("b" + ("c" + example("abc", 3)))
"a" + ("b" + ("c" + ""))
example("abc", 0)
第一个if条件检查索引是否超过字符串的长度。如果是这种情况,它只返回一个空字符串。否则,它将在位置
index
处拾取当前字符,并调用与下一个索引
index+1
相同的函数。这称为递归。所以它将被这样评估

example("abc", 0)
"a" + example("abc", 1)
"a" + ("b" + example("abc", 2))
"a" + ("b" + ("c" + example("abc", 3)))
"a" + ("b" + ("c" + ""))
example("abc", 0)
因此,实际输出是abc

但是比如说,

example("abc", 1)
将返回
bc
。这种行为称为切片。感谢小次郎指出这一点

第二个示例,只需逐个字符打印反向字符串

def example(aString, index):
    if index < len(aString):
        example(aString, index +1)
        print(aString[index], end="")
if
检查确保我们没有超出字符串的长度。如果条件的计算结果为Truthy值,那么我们将立即使用下一个索引调用相同的函数(递归)。这将一直持续到我们到达字符串的末尾。当我们到达字符串的末尾时,我们将从函数返回调用的函数。当我们到达调用的函数时,索引将是
2
。因此,它将打印
c
,我们从那里返回调用它的函数,它将有索引1,因此它将打印
b
。这样它就反转了字符串

与第一个示例相同,我们只能得到字符串的最后几个字符,与第二个示例类似

example("Welcome", 3)
将打印

emoc

示例一相当于调用slice操作并将start指定为给定索引

例如:

>>> 'abcde'[2:] == example('abcde', 2)
True
要了解这一点,请注意函数是如何工作的。它首先根据字符串的长度检查索引是否有效。然后,如果索引有效,它将返回该索引处的字符,前缀为递归调用的返回值。递归调用与原始调用相同,但它将索引增加1。这种情况一直发生,直到函数达到基本大小写,此时,它将停止进行递归调用,只返回其基本值,即空字符串

注意,通过示例1,您仍然可以很容易地获得索引器……您所要做的就是为它提供一个负索引或一个大于字符串长度的索引


第二个示例按与给定索引相反的顺序打印字符串中的字符。请注意,为
index+1
元素调用它的递归调用被强制在当前调用之前返回。这意味着递归调用的print语句将在当前调用的print语句之前执行

也许一个例子可以帮助您可视化递归

假设您的字符串是
'abcde'
您进行了调用
示例('abcde',3)

由于3小于字符串的长度,它将进行递归调用:
example('abcde',4)

由于4小于字符串的长度,它将进行另一个递归调用:
example('abcde',5)
。但是,对于这个调用,您的索引将不小于字符串的长度(字符串的长度为5),因此函数将只返回而不打印任何内容。现在函数已经返回,我们回到调用:
example('abcde',4)
。现在它可以打印索引4处的字符,即“e”。然后该函数将返回,我们将返回调用
示例('abcde',3)
。它将打印索引3处的字符,即“d”


最后,您对函数的原始调用将在打印“ed”后返回。

顺便说一句,它们没有做错任何事情,我只是想了解它们是如何工作的。请正确缩进它们。您是否尝试过运行它们,或更改它们,或需要分析代码的任何操作?第一个示例不只是按原样返回字符串。它还可以进行超昂贵的切片。