设为首页收藏本站

Crossin的编程教室

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

【Python 第27课】 list切片

[复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2014-4-24 18:33:17 |只看该作者 |倒序浏览
list有两类常用操作:索引(index)和切片(slice)。

昨天我们说的用[]加序号访问的方法就是索引操作。

除了指定位置进行索引外,list还可以处理负数的索引。继续用昨天的例子:

l = [365, 'everyday', 0.618, True]

l[-1]表示l中的最后一个元素。
l[-3]表示倒数第3个元素。

切片操作符是在[]内提供一对可选数字,用:分割。冒号前的数表示切片的开始位置,冒号后的数字表示切片到哪里结束。同样,计数从0开始。
注意,开始位置包含在切片中,而结束位置不包括。

l[1:3]

得到的结果是['everyday', 0.618]。

如果不指定第一个数,切片就从列表第一个元素开始。
如果不指定第二个数,就一直到最后一个元素结束。
都不指定,则返回整个列表的一个拷贝。

l[:3]
l[1:]
l[:]

同索引一样,切片中的数字也可以使用负数。比如:

l[1:-1]

得到['everyday', 0.618]

27-1.jpeg

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

昨天有了一次罚球的过程,今天我就让它循环5次,并且记录下得分。先不判断胜负。

用score_you表示你的得分,score_com表示电脑得分。开始都为0,每进一球就加1。

from random import choice

score_you = 0
score_com = 0
direction = ['left', 'center', 'right']

for i in range(5):
   print '==== Round %d - You Kick! ====' % (i+1)
   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_you += 1
   else:
       print 'Oops...'
   print 'Score: %d(you) - %d(com)\n' % (score_you, score_com)

   print '==== Round %d - You Save! ====' % (i+1)
   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_com += 1
   print 'Score: %d(you) - %d(com)\n' % (score_you, score_com)

注意:手机上代码有可能会被换行。
这段代码里有两段相似度很高,想想是不是可以有办法可以用个函数把它们分离出来。

27-2.jpeg

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

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

沙发
发表于 2015-3-13 14:46:04 |只看该作者
  1. #coding:utf-8
  2. #football游戏,电脑随机进行扑救(左中右),你进行射门,三个方向,看能不能射进
  3. #football1.0
  4. #zzx 2015.03.12
  5. from random import choice
  6. print'------------------------欢迎来到欧冠点球的决胜时刻,请屏住呼吸,拭目以待吧---------------------------'
  7. #方向
  8. direction = ['left','middle','right']
  9. #电脑扑救方法
  10. def fight(name='computer') :
  11.                 if name == 'computer':
  12.                                 dic = choice(direction)
  13.                                 print'守门员%s迅速扑救,他扑向了皮球的%s方向。他能否守住呢?\n' %(name,dic)
  14.                 else :
  15.                                 dic = raw_input('请输入您要扑球的方向(left,middle,right),看你能够抵挡住这世界波。')
  16.                                 print'守门员%s迅速扑救,他扑向了球门的%s方向。他能否守住呢?\n' %(name,dic)
  17.                 return dic
  18. #输入射门
  19. def shoot(name='computer') :
  20.                 if name == 'computer':
  21.                                 dic = choice(direction)
  22.                                 print '\n%s发出了世界波,像球门快速飞来,你要赶快判断他的方向,守住大门!\n'%name
  23.                 else:
  24.                                 dic = raw_input('请输入你要射门的方向(left,middle,right),关键一球哦!\n')
  25.                                 print '\n%s发出了世界波,射向了球门的%s方向,你期待这进球的那一刻\n'%(name,dic)
  26.                 return dic
  27. def judge(shootDic,fightDic) :
  28.                 if shootDic == fightDic :
  29.                                 print 'omg,伟大的守门员拯救了这场比赛。他将球扑出了球门。\n'
  30.                                 return True
  31.                 else:
  32.                                 print '球进了,恭喜你,伟大的射手!\n'
  33.                                 return False
  34. #开始比赛
  35. man_point = 0;
  36. computer_point = 0;
  37. man = raw_input('请输入你的姓名:')
  38. for i in range(1,4):
  39. #人先射门,电脑守门
  40.                 print '下面由%s先主发点球,祈祷吧!'%man
  41.                 shootDic = shoot(man)
  42.                 fightDic = fight()
  43.                 res = judge(shootDic,fightDic)
  44.                 if not res :
  45.                                 man_point+=1
  46.                                 print '好样的%s,球进了,加一分,总分为%d'%(man,man_point)
  47. #电脑射门,人守门
  48.                 print '交换场地,下面由电脑先发球'
  49.                 shootDic2 = shoot()
  50.                 fightDic2 = fight(man)
  51.                 res2 = judge(shootDic2,fightDic2)
  52.                 if not res2 :
  53.                                 computer_point+=1
  54.                                 print '好样的computer,球进了加一份,得分为%d'%computer_point
  55. print '总成绩是:%s--%d-----------computer--%d'%(man,man_point,computer_point)
  56. if man_point > computer_point :
  57.                 print '恭喜你,最终你赢得了胜利,伟大的射手----%s'%man
  58. elif man_point<computer_point :
  59.                 print '很遗憾,电脑赢得了胜利,你输了,再接再厉吧'
  60. else:
  61.                 print '平手啊,你和电脑一样厉害'







复制代码
回复

使用道具 举报

0

主题

0

好友

215

积分

中级会员

Rank: 3Rank: 3

板凳
发表于 2015-4-22 10:40:22 |只看该作者
楼上的代码好棒啊
回复

使用道具 举报

0

主题

0

好友

54

积分

注册会员

Rank: 2

地板
发表于 2015-5-27 22:25:00 |只看该作者
优化了一点点,不涉及技术
  1. #coding:gbk #我的电脑用gbk才能显示汉字名字
  2. #football游戏,电脑随机进行扑救(左中右),你进行射门,三个方向,看能不能射进
  3. #football1.0
  4. #zzx 2015.03.12
  5. from random import choice
  6. print'------------------------欢迎来到欧冠点球的决胜时刻,请屏住呼吸,拭目以待吧---------------------------'
  7. #方向
  8. direction = ['left','middle','right']
  9. #电脑扑救方法
  10. def fight(name='computer') :
  11.                 if name == 'computer':
  12.                                 dic = choice(direction)
  13.                                 print'守门员%s迅速扑救,他扑向了皮球的%s方向。他能否守住呢?\n' %(name,dic)
  14.                 else :
  15.                                 dic = raw_input('请输入您要扑球的方向(left,middle,right),看你能够抵挡住这世界波。\n')
  16.                                 print'守门员%s迅速扑救,他扑向了球门的%s方向。他能否守住呢?\n' %(name,dic)
  17.                 return dic
  18. #输入射门
  19. def shoot(name='computer') :
  20.                 if name == 'computer':
  21.                                 dic = choice(direction)
  22.                                 print '\n%s发出了世界波,像球门快速飞来,你要赶快判断他的方向,守住大门!\n'%name
  23.                 else:
  24.                                 dic = raw_input('请输入你要射门的方向(left,middle,right),关键一球哦!\n')
  25.                                 print '\n%s发出了世界波,射向了球门的%s方向,你期待这进球的那一刻\n'%(name,dic)
  26.                 return dic
  27. def judge(shootDic,fightDic) :
  28.                 if shootDic == fightDic :
  29.                                 print 'omg,伟大的守门员拯救了这场比赛。他将球扑出了球门。\n'
  30.                                 return True
  31.                 else:
  32.                                 print '球进了,恭喜你,伟大的射手!\n'
  33.                                 return False
  34. #开始比赛
  35. man_point = 0  #初始化人分数,此处不需要分号
  36. computer_point = 0 #初始化电脑分数,此处不需要分号
  37. man = raw_input('请输入你的姓名:')
  38. for i in range(1,4):
  39. #人先射门,电脑守门
  40.                 print '下面由%s先主发点球,祈祷吧!'%man
  41.                 shootDic = shoot(man)   #调用shoot函数,并赋值name=你的名字,执行else部分,就是crossin部分简单的,返回你的选择方向
  42.                 fightDic = fight()  #调用fight函数,返回电脑的选择方向
  43.                 res = judge(shootDic,fightDic)
  44.                 if not res :
  45.                                 man_point+=1
  46.                                 print '好样的%s,球进了,加一分,总分为%d'%(man,man_point)
  47. #电脑射门,人守门
  48.                 print '交换场地,下面由电脑先发球'
  49.                 shootDic2 = shoot()
  50.                 fightDic2 = fight(man)
  51.                 res2 = judge(shootDic2,fightDic2)
  52.                 if not res2 :
  53.                                 computer_point+=1
  54.                                 print '好样的computer,球进了加一份,得分为%d'%computer_point
  55. print '总成绩是:%s--%d-----------computer--%d'%(man,man_point,computer_point)
  56. if man_point > computer_point :
  57.                 print '恭喜你,最终你赢得了胜利,伟大的射手----%s'%man
  58. elif man_point<computer_point :
  59.                 print '很遗憾,电脑赢得了胜利,你输了,再接再厉吧'
  60. else:
  61.                 print '平手啊,你和电脑一样厉害'






复制代码
回复

使用道具 举报

0

主题

0

好友

54

积分

注册会员

Rank: 2

5#
发表于 2015-5-27 22:25:33 |只看该作者
太懒了,看了一部分
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

6#
发表于 2015-12-4 17:29:48 |只看该作者
表示学习阶段,这样没必要的东西搞得太复杂反而不好吧
回复

使用道具 举报

0

主题

0

好友

200

积分

中级会员

Rank: 3Rank: 3

7#
发表于 2015-12-5 12:24:33 |只看该作者
本帖最后由 周末晒被子 于 2015-12-5 12:25 编辑

Crossin先生,您在这节课的结尾说,能不能把代码中两端相似度高的部分分离出来,写成函数。

我发现函数只能写到 you=raw_input 为止,一旦包进去,就会提示下面函数外面的 you 未被定义。

如果是先生的话,会怎么把这两段代码函数化呢?
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2015-12-5 20:49:58 |只看该作者
周末晒被子 发表于 2015-12-5 12:24
Crossin先生,您在这节课的结尾说,能不能把代码中两端相似度高的部分分离出来,写成函数。

我发现函数只 ...

变量是有作用域的,函数里面的变量,对于外面来说是看不见的,要通过参数和返回值来得到结果
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

200

积分

中级会员

Rank: 3Rank: 3

9#
发表于 2015-12-7 13:35:08 |只看该作者
本帖最后由 周末晒被子 于 2015-12-7 13:43 编辑

谢谢Crossin先生的回复~

那个,我不明白先生这节课结尾的这句话是什么意思:
“这段代码里有两段相似度很高,想想是不是可以有办法可以用个函数把它们分离出来。”

我一开始的理解是:==== Round %d - You Kick! ====和==== Round %d - You Save! ====的相似度高,那么比较出这两段代码的不同之处,用参数代替不同之处,来定义成函数e。可以用两遍函数e,也算有点省力。

但是我发现写不出来函数e,就是因为到了两段代码的if you==(!=)com:之后的部分太不一样了,连加分的位置都不一样,所以我把函数的范围缩小到if you==(!=)com:以上的部分,但是因为you不作用到函数外面,所以程序会在if you==(!=)com:这里报错。

所以我就来问问先生会怎么写这个函数。

但是后来看到先生是把==== Round %d - You Kick! ====和==== Round %d - You Save! ====作为一轮,并在一起写成函数来用,更好。
回复

使用道具 举报

0

主题

0

好友

200

积分

中级会员

Rank: 3Rank: 3

10#
发表于 2015-12-7 13:41:56 |只看该作者
本帖最后由 周末晒被子 于 2015-12-7 13:43 编辑

后来我自己写了一个点球小游戏,如何描述射门的部分借鉴了先生的设计,5轮点球、5轮打平之后一球生死战,都是借鉴了您的设计。
呃,不能上传.py文件,但是代码太长了就不放上来了。
回复

使用道具 举报

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

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

GMT+8, 2024-4-20 19:11 , Processed in 0.040743 second(s), 33 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部