2013-07-25 64 views
1

我一直在試圖定義將利用其他字母,並採取空間到戶頭例如功能:Python中的字符串中的每一個字母大寫?

print function_name("Hello world")應打印的「Hello World」而非的「Hello World」

我希望這是有道理的。任何幫助表示讚賞。

感謝,奧利

+1

請告訴我你的例子之間的差異? –

+0

對不起,我輸入了錯誤。我現在編輯它。謝謝 – Perceptic

+0

向我們顯示您的代碼 – Stephan

回答

4
def foo(s): 
    ret = "" 
    i = True # capitalize 
    for char in s: 
     if i: 
      ret += char.upper() 
     else: 
      ret += char.lower() 
     if char != ' ': 
      i = not i 
    return ret 

>>> print foo("hello world") 
HeLlO wOrLd' 
+1

謝謝!這很好。感謝其他人的幫助。 – Perceptic

0

這應該做的伎倆:

def function_name(input_string): 
    should_capitalize = True 
    chars = [] 
    for single_char in input_string: 
     if not single_char.isalpha(): 
      chars.append(single_char) 
      continue 

     if should_capitalize: 
      chars.append(single_char.upper()) 
     else: 
      chars.append(single_char.lower()) 

     should_capitalize = not should_capitalize 

    return ''.join(chars) 
3

我覺得這是那些情況下,一個普通for -loop是最好的辦法之一:

>>> def f(s): 
...  r = '' 
...  b = True 
...  for c in s: 
...   r += c.upper() if b else c.lower() 
...   if c.isalpha(): 
...    b = not b 
...  return r 
... 
>>> f('Hello world') 
'HeLlO wOrLd' 
+0

請不要通過重複添加一個字符('+ =')來創建字符串。表現糟糕。例如,嘗試將其應用於[戰爭與和平](http://www.gutenberg.org/files/2600/2600.txt)。 –

+0

@StevenRumbalski你誤解了我答案的目的;它只是爲了顯示OP所要求的一般方式。如果OP使用的代碼性能敏感,以至於這樣的字符串連接不存在問題(確實是非常罕見的情況),那麼他可以查看類似可變字符串的內容。但是,上述方法將保持不變。 – arshajii

3

以下是使用正則表達式的版本:

import re 

def alternate_case(s): 
    cap = [False] 
    def repl(m): 
     cap[0] = not cap[0] 
     return m.group(0).upper() if cap[0] else m.group(0).lower() 
    return re.sub(r'[A-Za-z]', repl, s) 

實施例:

>>> alternate_case('Hello world') 
'HeLlO wOrLd' 
+0

爲什麼'cap'是一個列表? – arshajii

+0

我想這是一個避免'global'或'nonlocal'的列表。 –

+0

如果代碼在Python 3.x上,我會用'nonlocal'代替。它必須是一個列表,因爲'repl()'函數中的'cap = not cap'就會給你一個「在賦值之前引用的局部變量」錯誤,除非首先使用'nonlocal cap'或'global cap'。我不喜歡使用'global',並且'nonlocal'在Python 2.x上不可用。請參閱http://stackoverflow.com/a/8934902/505154 –

0

A(希望優雅)遞歸方法:

def funky_cap(s, use_lower=False): 
    if s == '': 
     return s 
    elif not s[0].isalpha(): 
     return s[0] + funky_cap(s[1:], use_lower) 
    elif use_lower: 
     return s[0].lower() + funky_cap(s[1:], not use_lower) 
    else: # when we need an uppercase letter 
     return s[0].upper() + funky_cap(s[1:], not use_lower) 
相關問題