Crossin的编程教室

标题: 【Python 第28课】 字符串的分割 [打印本页]

作者: crossin先生    时间: 2014-4-24 18:34
标题: 【Python 第28课】 字符串的分割
字符串和list之间有很多不得不说的事。比如有同学想要用python去自动抓取某个网页上的下载链接,那就需要对网页的代码进行处理。处理的过程中,免不了要在字符串和list之间进行很多操作。

我们先从最基本的开始。假设你现在拿到了一个英语句子,需要把这个句子中的每一个单词拿出来单独处理。

sentence = 'I am an Englist sentence'

这时就需要对字符串进行分割。

sentence.split()

split()会把字符串按照其中的空格进行分割,分割后的每一段都是一个新的字符串,最终返回这些字符串组成一个list。于是得到

['I', 'am', 'an', 'Englist', 'sentence']

原来字符串中的空格不再存在。

除了空格外,split()同时也会按照换行符\n,制表符\t进行分割。所以应该说,split默认是按照空白字符进行分割。

之所以说默认,是因为split还可以指定分割的符号。比如你有一个很长的字符串

section = 'Hi. I am the one. Bye.'

通过指定分割符号为'.',可以把每句话分开

section.split('.')

得到

['Hi', ' I am the one', ' Bye', '']

这时候,'.'作为分割符被去掉了,而空格仍然保留在它的位置上。

注意最后那个空字符串。每个'.'都会被作为分割符,即使它的后面没有其他字符,也会有一个空串被分割出来。例如

'aaa'.split('a')

将会得到['', '', '', ''],由四个空串组成的list。

28-1.jpeg

既然有把字符串分割成list,那也相应就有把list连接成字符串,这个明天说。

#==== 点球小游戏 ====#

在昨天代码的基础上,我们加上胜负判断,如果5轮结束之后是平分,就继续踢。

所以我们把一轮的过程单独拿出来作为一个函数kick,在5次循环之后再加上一个while循环。

另外,这里把之前的score_you和score_com合并成了一个score数组。这里的原因是,要让kick函数里用到外部定义的变量,需要使用全局变量的概念。暂时想避免说这个,而用list不存在这个问题。

from random import choice

score = [0, 0]
direction = ['left', 'center', 'right']

def kick():
   print '==== You Kick! ===='
   print 'Choose one side to shoot:'
   print 'left, center, right'
   you = raw_input()
   print 'You kicked ' + you
   com = choice(direction)
   print 'Computer saved ' + com
   if you != com:
       print 'Goal!'
       score[0] += 1
   else:
       print 'Oops...'
   print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

   print '==== You Save! ===='
   print 'Choose one side to save:'
   print 'left, center, right'
   you = raw_input()
   print 'You saved ' + you
   com = choice(direction)
   print 'Computer kicked ' + com
   if you == com:
       print 'Saved!'
   else:
       print 'Oops...'
       score[1] += 1
   print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

for i in range(5):
   print '==== Round %d ====' % (i+1)
   kick()

while(score[0] == score[1]):
   i += 1
   print '==== Round %d ====' % (i+1)
   kick()

if score[0] > score[1]:
   print 'You Win!'
else:
   print 'You Lose.'

28-2.jpeg


作者: 痴槑尛孩    时间: 2014-12-21 15:06
太震惊了...
作者: cross    时间: 2015-4-22 16:17
  1. from random import choice

  2. s = [0,0]
  3. direction = ['left','center','right']

  4. def kick():
  5.     print '===You Kick!==='
  6.     print 'choose one side to shoot:'
  7.     print 'left,center,right'
  8.     you = raw_input()
  9.     print 'You kicked' + you
  10.     com = choice(direction)
  11.     print 'computer saved' + com
  12.     if you != com:
  13.         print 'Goal!'
  14.         s[0] += 1
  15.     else:
  16.         print 'Oops...'
  17.     print 'score: %d(you) - %d(com)\n' % (s[0],s[1])

  18.     print '===You Save!==='
  19.     print'choose one side you save:'
  20.     print'left,center,right'
  21.     you = raw_input()
  22.     print 'you saved' + you
  23.     com = choice(direction)
  24.     print 'computer kicked' + com
  25.     if you == com:
  26.         print 'saved'
  27.     else:
  28.         print'Oop...'
  29.         s[1] += 1
  30.     print 'score: %d(you) - %d(com)\n' % (s[0],s[1])

  31. for i in range(1):
  32.     print '===Round %d ===' %(i+1)
  33.     kick()

  34. while (s[0] ==s[1]):
  35.     i +=1
  36.     print '===Round %d ===' % (i+1)
  37.     kick()

  38. if s[0] > s[1]:
  39.     print 'You Win!'
  40. else:
  41.     print 'You Lose.'
复制代码

作者: lovia    时间: 2015-5-27 23:21
  1. from random import choice

  2. score = [0, 0]
  3. direction = ['left', 'center', 'right']

  4. def kick():
  5.    print '==== You Kick! ===='
  6.    print 'Choose one side to shoot:'
  7.    print 'left, center, right'
  8.    you = raw_input()
  9.    print 'You kicked ' + you
  10.    com = choice(direction)
  11.    print 'Computer saved ' + com
  12.    if you != com:
  13.        print 'Goal!'
  14.        score[0] += 1
  15.    else:
  16.        print 'Oops...'
  17.    print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

  18.    print '==== You Save! ===='
  19.    print 'Choose one side to save:'
  20.    print 'left, center, right'
  21.    you = raw_input()
  22.    print 'You saved ' + you
  23.    com = choice(direction)
  24.    print 'Computer kicked ' + com
  25.    if you == com:
  26.        print 'Saved!'
  27.    else:
  28.        print 'Oops...'
  29.        score[1] += 1
  30.    print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

  31. for i in range(5):
  32.    print '==== Round %d ====' % (i+1)
  33.    kick()

  34. while(score[0] == score[1]):
  35.    i += 1
  36.    print '==== Round %d ====' % (i+1)
  37.    kick()

  38. if score[0] > score[1]:
  39.    print 'You Win!'
  40. else:
  41.    print 'You Lose.'
复制代码

作者: 460883323    时间: 2015-12-7 22:58
一路看下来虽然大概知道是怎么一回事,但是要自己写的话感觉还是无从下手。。。。。
作者: crossin先生    时间: 2015-12-8 17:52
460883323 发表于 2015-12-7 22:58
一路看下来虽然大概知道是怎么一回事,但是要自己写的话感觉还是无从下手。。。。。 ...

先写点短的
作者: weiliu    时间: 2015-12-30 10:40
本帖最后由 weiliu 于 2015-12-30 18:59 编辑
  1. from random import choice

  2. score = [0, 0]
  3. direction = ['left', 'center', 'right']

  4. def kick():
  5.     print '==== You Kick! ===='
  6.     print 'Choose one side to shoot:'
  7.     print 'left, center, right'
  8.     you = raw_input()
  9.     print 'You kicked ' + you
  10.     com = choice(direction)
  11.     print 'Computer saved ' + com
  12.     if you != com:
  13.         print 'Goal!'
  14.         score[0] += 1
  15.     else:
  16.         print 'Oops...'
  17.     print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

  18.     print '==== You Save! ===='
  19.     print 'Choose one side to save:'
  20.     print 'left, center, right'
  21.     you = raw_input()
  22.     print 'You saved ' + you
  23.     com = choice(direction)
  24.     print 'Computer kicked ' + com
  25.     if you == com:
  26.         print 'Saved!'
  27.     else:
  28.         print 'Oops...'
  29.         score[1] += 1
  30.     print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

  31. for i in range(5):
  32.     print '==== Round %d ====' % (i+1)
  33.     kick()
  34.     if score[0] - score[1] ==3:
  35.         print 'you win'
  36.         break
  37.     if score[1] - score[0] ==3:
  38.         print 'computer win'
  39.         break
  40.     if score[0] - score[1] ==2 and i==3:
  41.         print 'you win'
  42.         break
  43.     if score[1] - score[0] ==2 and i==3:
  44.         print 'computer win'
  45.         break


  46. while(score[0] == score[1]):
  47.    i += 1
  48.    print '==== Round %d ====' % (i+1)
  49.    kick()

  50. if score[0] > score[1]:
  51.    print 'You Win!'
  52. else:
  53.    print 'You Lose.'
复制代码

作者: 那夏日    时间: 2016-1-19 09:37
本帖最后由 那夏日 于 2016-1-19 10:12 编辑


  1. l='i am an englist sentence'
  2. l.split()
  3. print l[3]

复制代码
为什么不是输出 englist,而是m.空格还存在

啊,我看了下一节就明白了..
要这样
  1. li=l.split()
  2. print li[3]
复制代码

作者: 追风    时间: 2016-5-3 10:35
妙哉
作者: Joshtu    时间: 2016-7-5 16:18
460883323 发表于 2015-12-7 22:58
一路看下来虽然大概知道是怎么一回事,但是要自己写的话感觉还是无从下手。。。。。 ...

同感!!!
作者: 呆雷子    时间: 2016-10-25 16:05
460883323 发表于 2015-12-7 22:58
一路看下来虽然大概知道是怎么一回事,但是要自己写的话感觉还是无从下手。。。。。 ...

不知道怎么下手的话先去看看软件工程的前两三章内容。
貌似要做计划,画流程图巴拉巴拉的
作者: l0ve1o24    时间: 2016-12-9 13:28
  1. from random import choice
  2. bifen = [0, 0]
  3. fangxiang = ['left','middle','right']
  4. def guocheng():
  5.     print ' ==== now you kick ==== '
  6.     print ' please choose one side to shoot '
  7.     print ' left , middle , right '
  8.     you = raw_input()
  9.     print 'you kicked ' + you
  10.     com = choice(fangxiang)
  11.     print ' the other side saved ' + com
  12.     if you != com:
  13.         print ' he missed the ball , you win '
  14.         bifen[0] += 1
  15.     else:
  16.         print ' he got the ball , you lose \n'
  17.     print ' you - com\n %d -%d\n'%(bifen[0],bifen[1])

  18.     print ' ==== now you save ===='
  19.     print ' plese choose one side to save '
  20.     print ' left , middle , right '
  21.     you = raw_input()
  22.     print ' you saved ' + you
  23.     com = choice(fangxiang)
  24.     print ' the other side kicked ' + com
  25.     if you != com:
  26.         print ' you missed the ball , you lose '
  27.         bifen[1] += 1
  28.     else:
  29.         print ' you got the ball , you win '
  30.     print ' you - com\n %d -%d\n'%(bifen[0],bifen[1])
  31. for i in range(5):
  32.     print ' ==== round %d ==== '%( i +1 )
  33.     guocheng()
  34.     while bifen[0] == bifen[1]:
  35.         i += 1
  36.         print' round %d'%(i + 1 )
  37.         guocheng()
  38.     if bifen[0] >bifen[1]:
  39.         print ' you win '
  40.     else:
  41.         print ' you lose '
  42.    
复制代码

作者: 枫叶落时    时间: 2017-8-10 21:02
crossin先生,请问,我们这些新手完全不知道怎么下手去码,有什么推荐书籍去看,或者方法吗?
作者: crossin先生    时间: 2017-8-10 23:39
枫叶落时 发表于 2017-8-10 21:02
crossin先生,请问,我们这些新手完全不知道怎么下手去码,有什么推荐书籍去看,或者方法吗? ...

你先去码简单的呀,猜数字那些。照着课程一句句读,如果这也不行,那换什么书也没用的。

《父与子的编程之旅》,这边比较浅显,但至少你也得会写个比大小猜数字
作者: 枫叶落时    时间: 2017-8-10 23:49
先生,你编这几套码,我都能读懂,但是要自己编就有很大难度了。。。一开始还跟得上能自己码出来,从小游戏踢球那个部分开始就显的很吃力了。
作者: crossin先生    时间: 2017-8-11 09:41
枫叶落时 发表于 2017-8-10 23:49
先生,你编这几套码,我都能读懂,但是要自己编就有很大难度了。。。一开始还跟得上能自己码出来,从小游戏 ...

还是写的少。前面的简单代码,不看参考自己写,然后尝试加一些功能
作者: lubvi    时间: 2017-10-30 14:54
C老师, 我想问一下, 如果是 '赵钱孙李周吴郑王'这种纯汉字,可以分割嘛 。我用.split()分不了,还是整体输出的
作者: lubvi    时间: 2017-10-30 16:00
crossin先生 发表于 2017-8-11 09:41
还是写的少。前面的简单代码,不看参考自己写,然后尝试加一些功能


C老师, 我想问一下, 如果是 '赵钱孙李周吴郑王'   'abcdefg'这种一串字符,可以分割嘛 。我用.split()分不了,还是整体输出的
作者: crossin先生    时间: 2017-10-31 10:47
lubvi 发表于 2017-10-30 16:00
C老师, 我想问一下, 如果是 '赵钱孙李周吴郑王'   'abcdefg'这种一串字符,可以分割嘛 。我用.split() ...

split只看空白符划分,你这个需求不是用split来做,直接转list就行
作者: lubvi    时间: 2017-10-31 15:06
crossin先生 发表于 2017-10-31 10:47
split只看空白符划分,你这个需求不是用split来做,直接转list就行

C老师,有没有具体教学可以看。比如字符串'abcdefg',把它分割成'a','b','c','d','e','f' ,具体用到哪个函数
作者: woodumpling    时间: 2017-11-1 08:33
lubvi 发表于 2017-10-31 15:06
C老师,有没有具体教学可以看。比如字符串'abcdefg',把它分割成'a','b','c','d','e','f' ,具体用到哪个 ...

list('abcdefg')
作者: lubvi    时间: 2017-11-1 08:50
woodumpling 发表于 2017-11-1 08:33
list('abcdefg')

问题已解决,非常感谢
作者: crossin先生    时间: 2017-11-1 16:37
lubvi 发表于 2017-10-31 15:06
C老师,有没有具体教学可以看。比如字符串'abcdefg',把它分割成'a','b','c','d','e','f' ,具体用到哪个 ...

list('abcdefg')
作者: LeeYoung    时间: 2018-1-25 18:52
这里 循环5 次  为什么用的是  for i in range(1)
作者: crossin先生    时间: 2018-1-26 11:22
LeeYoung 发表于 2018-1-25 18:52
这里 循环5 次  为什么用的是  for i in range(1)

图片中的是笔误
作者: 司南    时间: 2018-4-7 14:02
这次是几乎没有改动,直接加在后面加的几句话。
  1. #football_game.py
  2. #司南 2018.04.07
  3. #方向设定
  4. direction=['left','middle','right']
  5. #扑救方
  6. def keeper(name='computer'):
  7.     import random
  8.     dic=random.choice(direction)
  9.     if name=='computer':
  10.         print('天哪,快看,守门员扑向了%s方向' %dic)
  11.     else:
  12.         print('天哪,快看,守门员%s扑向了%s方向' %(name,dic))
  13.     return dic
  14. #射门方
  15. def shoot(man):
  16.     dic=input('请输入射球方向:left/middle/right')
  17.     print('快看,%s能否射进呢?' %man)
  18.     return dic
  19. #比赛规则
  20. def fight(keeperdic,shootdic):
  21.     if keeperdic==shootdic:
  22.         print('omg,the goalkeeper win!')
  23.         return True
  24.     else:
  25.         print('天哪,球进了!!')
  26.         return False
  27. #开始比赛
  28. score_keeper=0
  29. score_shoot=0
  30. man=input('Hei,man please tell us your name:')
  31. round=eval(input('how many round do you do'))
  32. for i in range(round):
  33.     print('====Everybody the %dth round begin!===='%(i+1))
  34.     shootdic=shoot(man)
  35.     keeperdic=keeper()
  36.     res=fight(keeperdic,shootdic)
  37.     if res:
  38.         score_keeper=score_keeper+1
  39.     else:
  40.         score_shoot=score_shoot+1
  41. #判断总分胜负:
  42. if score_keeper>score_shoot:
  43.     print('伟大的守门员赢啦!!')
  44. elif score_keeper<score_shoot:
  45.     print('%s 你赢啦!'%man)
  46. else:
  47.     print('平手!决胜局来啦')
  48.     shootdic=shoot(man)
  49.     keeperdic=keeper()
  50.     res=fight(keeperdic,shootdic)
  51.     if res:
  52.         print('Everybody!!Winner is goalkeeper')
  53.     else:
  54.         print('Everybody!!Winner is %s'%man)
  55.    
  56.         
  57.    


  58.               

  59.    
  60.         
复制代码

作者: 司南    时间: 2018-4-7 14:06
但是按照老师给的灵感,看到了一直没注意的操作方式,就是:
可以直接操作序列中的数字。
score=[0,0]
score[0]+=1
这样操作后的结果是
score[1,0]

而,score[0]+1
score[0]的结果就依旧等于0
作者: yuyu1111    时间: 2018-5-20 14:13
在接近最后的kick()显示invalid syntax是怎么回事呢,用的python 3


from random import choice

score=[0,0]
direction=['left','center','right']

def kick():
   print('==== You Kick! ====')

   print('Choose one side to shoot:')

   print('left, center, right')

   you =input()

   print('You kicked ' + you)

   com =choice(direction)

   print('Computer saved ' + com)

   if you != com:

       print('Goal!')

       score[0] += 1

   else:

       print('Oops...')

   print ('Score: %d(you) - %d(com)\n' % (score[0], score[1]))


   print('==== You Save! ====')

   print('Choose one side to save:')

   print('left, center, right')

   you =input()

   print('You saved ' + you)

   com =choice(direction)

   print('Computer kicked ' + com)

   if you == com:

       print('Saved!')

   else:

       print('Oops...')

       score[1] += 1

   print('Score: %d(you) - %d(com)\n'% (score[0], score[1]))    #列表的數字用中括號

for i in range(5):
   print('==== Round %d ====' % (i+1))
   kick()

while(score[0]==score[1]):      #平局再來
    i+=1                        #局數+1
    print('=== Round %d ==='%(i+1)  #顯示當前局數
   kick()
   
if score[0]>score[1]:
    print('You win!')

else:
    print('You Lost.')
作者: crossin先生    时间: 2018-5-20 14:20
yuyu1111 发表于 2018-5-20 14:13
在接近最后的kick()显示invalid syntax是怎么回事呢,用的python 3

上一行少半个括号
作者: yuyu1111    时间: 2018-5-20 14:53
crossin先生 发表于 2018-5-20 14:20
上一行少半个括号

是啊,解决了,谢谢老师了。这么快回覆!




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5