我写了一个简单的程序,它将取一个字符串的第一个字母并将其大写。
import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeys)
import System.IO
main = do
xmproc <- spawnPipe "xmobar"
xmonad $ defaultConfig
{ manageHook = manageDocks <+> manageHook defaultConfig
, layoutHook = avoidStruts $ layoutHook defaultConfig
, logHook = dynamicLogWithPP xmobarPP
{ ppOutput = hPutStrLn xmproc
, pptitle = xmobarColor "green" "" . shorten 50
}
, modMask = mod4Mask -- rebind Mod to the windows key
} `additionalKeys`
[ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock; xset dmps force off")
, ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s")
, ((0, xK_Print), spawn "scrot")
]
这将通过使用列表推导给我想要的结果。 但是我不能通过使用如下的典型FOR LOOP来使其工作,它将只给我最后一次迭代:
def initials(text):
words = text.split()
a=[word[0].upper() for word in words]
b = '. '.join(a) + '.'
return b
text = "have a good day sir"
print(initials(text))
任何想法为什么第二个例子不能作为第一个例子?
答案 0 :(得分:2)
b
。所以你只得到最后一个首字母,然后是.
。相当于for
循环中的理解,将是:
def initials(text):
words = text.split()
a = []
for word in words:
a.append(word[0].upper())
b = '.'.join(a) + '.'
return b
答案 1 :(得分:1)
你在每次循环迭代时都要覆盖b。尝试:
def initials(text):
words = text.split()
for word in words:
a = word[0].upper()
b += '.'.join(a) + '.'
return b
text = "have a good day sir"
答案 2 :(得分:0)
问题是str.join()
需要一个可迭代的字符串,但在你的第二个函数中,你传递的是一个字符串。您在循环中调用它的事实不会将其转换为字符列表。
最简单的方法是摆脱str.join()
并使用简单的字符串来累积结果:
def initials(text):
words = text.split()
b = ''
for word in words:
a=word[0].upper()
b += a + '.'
return b
如果您坚持使用str.join()
,则需要一个列表来累积您的姓名首字母:
def initials(text):
words = text.split()
b = []
for word in words:
a=word[0].upper()
b.append(a)
return '.'.join(b) + '.'