Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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_Python 3.5 - Fatal编程技术网

Python 错误:字符串索引超出范围,正在定义函数

Python 错误:字符串索引超出范围,正在定义函数,python,python-3.5,Python,Python 3.5,我在codingbat.com上练习编码,因为我是python的完全初学者,下面是其中一个练习: 给定一个字符串,返回一个新字符串,该字符串由以第一个字符开头的每个字符组成,因此“Hello”生成“Hlo” 下面是我定义函数字符串_位(str)的尝试: 运行代码会产生错误。我的代码怎么了?问题是char+=2返回的值大于len(str),因为len(str)-1(范围)+2比字符串长。你可以做: def string_bits(string): if len(string) == 2:

我在codingbat.com上练习编码,因为我是python的完全初学者,下面是其中一个练习:

给定一个字符串,返回一个新字符串,该字符串由以第一个字符开头的每个字符组成,因此“Hello”生成“Hlo”

下面是我定义函数字符串_位(str)的尝试:


运行代码会产生错误。我的代码怎么了?

问题是char+=2返回的值大于len(str),因为len(str)-1(范围)+2比字符串长。你可以做:

def string_bits(string):

    if len(string) == 2:
        return string[0]

    result = ''
    for char in range(0,len(string),2):#range created value sin increments of two
        result += string[char]
    return result
更简洁的方法是:

def string_bits(string):
    return string[::2]

您应该避免使用'str'作为变量名,因为它是Python保留的字

您得到的错误意味着您试图获取少于n个字符的字符串的第n个字母

另一个建议是,字符串是Python中的序列类型,这意味着它们有许多内置功能,可以完成您在这里尝试的操作。有关更多信息,请参见,但要知道序列类型支持切片,即从序列中选择元素

因此,您可以像这样切割字符串:

def string_bits(input_string):
    return input_string[::2]

意思是“将我的输入字符串从开始(:)到结束(:)并选择每秒钟(2)个元素”

一种不同的方法,并附有说明:

如果你需要处理一个包含空格的句子,你可以通过切片来完成。在字符串上,切片的工作方式如下:

[start_of_string:end_of_string:jump_this_many_char_in_string]
因此,您只想每秒钟跳转一个字母,因此您可以:

[::2]
前两个字符是空的,因为您只想每秒钟跨步一个字符

因此,您可以在一行中完成此操作,如下所示:

>>> " ".join(i[::2] for i in "Hello World".split())
'Hlo Wrd'
上面刚刚发生的事情是,我们将字符串,使用
split
将其列为一个列表。默认情况下,拆分将在空间上拆分,因此我们将有:

["Hello", "World"]
然后,我们要做的是使用理解,迭代列表中的每一项,每次给我们一个单词,然后根据
i[::2]
执行所需的字符串操作

理解是:()

最后,我们调用
“”.join
(),它现在将把我们的列表更改回一个字符串,以最终为我们提供输出:

"Hlo Wrd"
查看文档中的切片部分:

好的,对我来说:

  • 您不应该使用str作为变量名,因为它是python内置函数(例如,用my_str替换str)

  • 例如,“Hello”长度为5,因此0…字符串索引超出范围。这并不奇怪,因为您正在迭代到最后一个索引并向其中添加两个。@jonrsharpe我认为当“char”等于倒数第二个索引时(因为我们添加了2),IndexError会被提出。这非常有用,而且解释得很清楚。切片使代码更加简单
    i[::2] for i in "Hello World".split()
    
    "Hlo Wrd"
    
    def string_bits(my_str):
      result = ""
      for char in range(0, len(my_str), 2):
        result += my_str[char]
      return result