Python字符串_调试_术语列表
一,调试
使用索引来遍历一个序列中的值的时候,弄清楚遍历的开头和结尾很不容易。下面这个函数用来对比两个单词,如果一个是另一个的倒序就返回真,但这个函数代码中有两处错误:
$ cat c.py
#!/bin/python
def is_reverse(word1, word2):
if len(word1) != len(word2):
return False
i = 0
j = len(word2)
while j > 0:
if word1[i] != word2[j]:
return False
i = i + 1
j = j - 1
return True
print(is_reverse('pots', 'stop'))
第一个 if 语句是检查两个词的长度是否一样。如果不一样长,当场就返回假。对函数其余部分,我们假设两个单词一样长,这里用到了守卫模式。
i 和 j 都是索引: i从头到尾遍历单词 word1,而j逆向遍历单词word2,如果我们发现两个字母不匹配,就可以立即返回假。如果经过整个循环,所有字母都匹配,就返回真。
如果我们用这个函数来处理单词『pots』和『stop』,打印结果,希望函数返回真,但得到的却是索引超出范围的错误:
$ python3 c.py
Traceback (most recent call last):
File "c.py", line 13, in <module>
print(is_reverse('pots', 'stop'))
File "c.py", line 8, in is_reverse
if word1[i] != word2[j]:
IndexError: string index out of range
为了改正这个错误,第一步就是在出错的那行之前先输出索引的值:
$ cat c.py
#!/bin/python
def is_reverse(word1, word2):
if len(word1) != len(word2):
return False
i = 0
j = len(word2)
while j > 0:
print(i, j) #增加这一行,打印索引值
if word1[i] != word2[j]:
return False
i = i + 1
j = j - 1
return True
print(is_reverse('pots', 'stop'))
然后我再次运行函数:
$ python3 c.py
0 4
。。。。。。
IndexError: string index out of range
索引值打印出来了,是0和4,但程序仍然报错索引值超出范围。
第一次循环完毕的时候,j 的值是4,这超出了『pots』这个字符串的范围了(索引值是0-3)。最后一个索引应该是3,但现在打印出的索引值是4,所以报错。而j的初始值应该是 len(word2)-1才对。
$ cat c.py
#!/bin/python
def is_reverse(word1, word2):
if len(word1) != len(word2):
return False
i = 0
j = len(word2)-1 #增加-1
while j > 0:
print(i, j)
if word1[i] != word2[j]:
return False
i = i + 1
j = j - 1
return True
print(is_reverse('pots', 'stop'))
打印:
$ python3 c.py
0 3
1 2
2 1
True
二,术语列表
对象: 一个值能够指代的东西。目前为止,你可以把对象和值暂且作为一码事来理解。
序列: 一系列值的有序排列,每一个值都有一个唯一的整数序号。
元素: 一列数值序列当中的一个值。
索引: 一个整数值,用来指代一个序列中的特定一个元素,比如在字符串里面就指代一个字符。在 Python 里面索引从0开始计数。
切片: 字符串的一部分,通过一个索引区间来取得。
空字符串: 没有字符的字符串,长度为0,用两个单引号表示。
不可更改: 一个序列中所有元素不能被改变的性质。
遍历: 在一个序列中依次对每一个元素进行某种相似运算的过程。
搜索: 一种遍历的模式,找到要找的内容的时候就停止。
计数: 一种用来统计某种东西数量的变量,一般初始化为0,然后逐次递增。也可以使用len函数统计字符串长度作为初始值,而后递减。
方法调用: 调用方法的语句。
可选参数: 一个函数或者方法中有一些参数是可选的,非必需的。
结束。