设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 33680|回复: 29
打印 上一主题 下一主题

【Python 第28课】 字符串的分割

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2014-4-24 18:34:05 |只看该作者 |正序浏览
字符串和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

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

50

积分

注册会员

Rank: 2

30#
发表于 2018-5-20 14:53:15 |只看该作者
crossin先生 发表于 2018-5-20 14:20
上一行少半个括号

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

29#
发表于 2018-5-20 14:20:36 |只看该作者
yuyu1111 发表于 2018-5-20 14:13
在接近最后的kick()显示invalid syntax是怎么回事呢,用的python 3

上一行少半个括号
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

50

积分

注册会员

Rank: 2

28#
发表于 2018-5-20 14:13:54 |只看该作者
在接近最后的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.')
回复

使用道具 举报

0

主题

2

好友

72

积分

注册会员

Rank: 2

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

而,score[0]+1
score[0]的结果就依旧等于0
回复

使用道具 举报

0

主题

2

好友

72

积分

注册会员

Rank: 2

26#
发表于 2018-4-7 14:02:58 |只看该作者
这次是几乎没有改动,直接加在后面加的几句话。
  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.         
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

25#
发表于 2018-1-26 11:22:57 |只看该作者
LeeYoung 发表于 2018-1-25 18:52
这里 循环5 次  为什么用的是  for i in range(1)

图片中的是笔误
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

17

积分

新手上路

Rank: 1

24#
发表于 2018-1-25 18:52:59 |只看该作者
这里 循环5 次  为什么用的是  for i in range(1)
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

23#
发表于 2017-11-1 16:37:15 |只看该作者
lubvi 发表于 2017-10-31 15:06
C老师,有没有具体教学可以看。比如字符串'abcdefg',把它分割成'a','b','c','d','e','f' ,具体用到哪个 ...

list('abcdefg')
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

60

积分

注册会员

Rank: 2

22#
发表于 2017-11-1 08:50:51 |只看该作者
woodumpling 发表于 2017-11-1 08:33
list('abcdefg')

问题已解决,非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-6-14 15:58 , Processed in 0.029657 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部