理解列表与循环

时间:2017-05-20 21:09:55

标签: python for-loop

我写了一个简单的程序,它将取一个字符串的第一个字母并将其大写。

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))

任何想法为什么第二个例子不能作为第一个例子?

3 个答案:

答案 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) + '.'