2015-11-06 29 views
0

我的代码假设将一个字符串转换为一个函数,然后将其中每个字符的大写字母从h切换到H和E,但是我在某种程度上遇到了错误 为什么?为什么我在python上得到这个错误,我该如何解决它? (循环和字符串)

这是错误messege:

chr = str[i] 

类型错误:字符串索引必须是整数,而不是str的

我的代码是:

def CapsChanger(str): 

    i = str[0] 
    for i in str : 
     chr = str[i] 

     if((ord(chr) > 46) and (ord(chr) < 91)): 
      str[i].upper() 

     if((ord(chr) > 96) and (ord(chr) < 126)): 
      str[i].lower() 
    print str  

str = raw_input() 

CapsChanger(str) 

input() 
+1

'for i in str'迭代实际的字符,无指示。不需要'chr = str [i]'。 –

+0

这是什么意思? – TotalyNotUbisoft

回答

3

当你for i in str,在每次迭代i表示实际字符,而不是索引。所以你不需要做chr = str[i] - i已经是那个角色了。

+0

顺便说一句,Python没有“字符”的概念:一切都是一个字符串;)。 – 3442

+1

关于错误本身的解释也可能有帮助。在这种情况下'str [i]'相当于'str ['0']'这会混淆评估者​​。 '字符串索引必须是整数'正在抱怨接收不是整数的索引。 –

+0

好的谢谢! 这也是一个很好的事实,即时通讯新的这种语言,所以我有我的这里落在这里 – TotalyNotUbisoft

0

istring而不是index。如果您需要index使用enumerate

ord(chr)使用 string代表的一封信
for idx, i in str: 
    print idx, i 

insted的。

如果条件使用Chained Comparisons,则缺少两个条件。

def CapsChanger(str): 
    out = [] 

    for idx,chr in enumerate(str): 
     if 'Z' >= chr >= 'A': 
      out.append(chr.lower()) 

     elif 'z' >= chr >= 'a': 
      out.append(chr.upper()) 
    print(''.join(out)) 
+0

我试过这样做,但它并没有真正改变字符串内的帽子.update()有一部分在这? – TotalyNotUbisoft

+0

@TotalyNotUbisoft'str [i] .upper()'将返回'str [i]'的大写版本,但它本身不会改变'str [i]'。而且,Python中的字符串是不可变的,所以你必须从原始的字符串中建立一个新的字符串;您将无法在原地进行更改。 - 编辑 - 忍者。:P –

1
import string 

def invertCase(text): 
    ## Creating a list where results will be stored 
    results = list() 
    ## This will contain the abc in upper and lowercase: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 
    abc = string.lowercase + string.uppercase 

    ## Looping each letter of the received text 
    for letter in text: 
     ## If the current letter of the loop exists in our abc variable contents, it means it's a letter and not a symbol or space 
     ## So we can apply upper() or lower() to the letter. 
     if letter in abc: 
      ## If the letter is currently uppercase, then we turn it into lowercase 
      if letter.isupper(): 
       results.append(letter.lower()) 
      ## If the letter is currently lowercase, then we turn it into uppercase 
      else: 
       results.append(letter.upper()) 
     ## The current letter of the loop is not in our abc variable so it could be anything but a letter 
     ## So we just append it to our results list 
     else: 
      results.append(letter) 

    ## Once the loop finishes we just join every item in the list to make the final string and return it 
    return ''.join(results) 

print invertCase('SoMeOnE Is hAvING fUN') 

输出:

sOmEoNe iS HaVing Fun 
+0

你能解释一下吗? – TotalyNotUbisoft

+0

当然!让我添加评论并更新我的答案 –

+0

@TotalyNotUbisoft完成! –

0

变量i是已经1个字符串因为for循环过程弦乐器这种方式。另外,当你调用str [i] .upper()时,它需要被分配给某个东西,或者打印出来,否则该字符不会实际改变。 .lower()和.upper()也有一个行为,它已经为你检查了范围,并返回相同的字符。例如。如果它已经是大写或数字,那么upper()将返回相同的字符。

你的函数可以如下简化:

import sys 
def CapsChanger(str): 
    for i in str: 
     sys.stdout.write (i.lower() if (i.upper() == i) else i.upper()) 
    print 

str = raw_input() 
CapsChanger(str) 

sys.stdout.write用来避免打印出多余的空格。三元运算符用于一次性切换案例:

<value1> if <condition> else <value2> 
相关问题