zoukankan      html  css  js  c++  java
  • Python初探list

    今天要说一个新概念--list,中文可以翻译成列表,是用来处理一组有序项目的数据结构。想象一下你的购物清单、待办工作、手机通讯录等等,它们都可以看作是一个列表。说它是新概念也不算确切,因为我们之前已经用过它,就在这个语句里:

    for i in range(1, 10):

       #此处略过数行代码

    看出来list在哪里了吗?你试一下:

    print range(1,10)

    得到的结果是:

    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    这就是一个list。它由range产生。把上面那个for循环语句写成:

    l = range(1, 10)

    for i in l:

    效果是一样的。

    于是可以看出,for循环做的事情其实就是遍历一个列表中的每一项,每次循环都把当前项赋值给一个变量(这里是i),直到列表结束。

    我们也可以定义自己的列表,格式就是用中括号包围、逗号隔开的一组数值:

    l = [1, 1, 2, 3, 5, 8, 13]

    可以用print输出这个列表:

    print l

    同样也可以用for...in遍历这个列表,依次输出了列表中的每一项:

    for i in l:

       print l,

    列表中的元素也可以是别的类型,比如:

    l = ['meat', 'egg', 'fish', 'milk']

    甚至是不同类型的混合:

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

    l身为一个列表,有一些特有的功能,这个我们下回再说。

     操作list

    上周给list开了个头,知道了什么是list。假设我们现在有一个list:

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

    除了用for...in遍历l中的元素,我们还能做点啥?

    1. 访问list中的元素

    list中的每个元素都对应一个递增的序号。与现实中习惯的序号不同在于,计算机中的计数通常都是从0开始,python也不例外。如果你记不清这个而导致了错误,请去听一下孙燕姿的《爱从零开始》。

    要访问l中的第1个元素365,只要用l[0]就可以了。依次类推,

    print l[1]

    就会输出'everyday'

    注意,你不能访问一个不存在的元素,比如l[10],程序就会报错,提示你index越界了。

    2. 修改list中的元素

    修改list中的某一个元素,只需要直接给那个元素赋值就可以了:

    l[0] = 123

    输出l,得到[123, 'everyday', 0.618, True],第1个元素已经从365被改成了123。

    3. 向list中添加元素

    list有一个append方法,可以增加元素。以l这个列表为例,调用的方法是:

    l.append(1024)

    输出l,你会看到[123, 'everyday', 0.618, True, 1024],1024被添加到了l,成为最后一个元素。(第一个元素在上一步被改成了123)

    然后同样可以用l[4]得到1024。

    4. 删除list中的元素

    删除list中的某一个元素,要用到del:

    del l[0]

    输出l,得到['everyday', 0.618, True, 1024]。这时候再调用l[0],会得到'everyday',其他元素的序号也相应提前。

    以上这些命令,你可以直接在python shell中尝试。

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

    我打算从今天开始,每天说一点这个小游戏的做法。方法有很多种,我只是提供一种参考。你可以按照自己喜欢的方式去做,那样她才是属于你的游戏。

    先说一下方向的设定。我的想法比较简单,就是左中右三个方向,用字符串来表示。射门或者扑救的时候,直接输入方向。所以这里我准备用raw_input。有同学是用1-8的数字来表示八个方向,每次输入一个数字,这也是可以的。不过这样守门员要扑住的概率可就小多了。

    至于电脑随机挑选方向,如果你是用数字表示,就用我们之前讲过的randint来随机就行。不过我这次打算用random的另一个方法:choice。它的作用是从一个list中随机挑选一个元素。

    于是,罚球的过程可以这样写:

    from random import choice

    print 'Choose one side to shoot:'

    print 'left, center, right'

    you = raw_input()

    print 'You kicked ' + you

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

    com = choice(direction)

    print 'Computer saved ' + com

    if you != com:

       print 'Goal!'

    else:

       print 'Oops...'

    反之亦然,不赘述。

    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]

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

    昨天有了一次罚球的过程,今天我就让它循环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) ' % (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) ' % (score_you, score_com)

    注意:手机上代码有可能会被换行。

    这段代码里有两段相似度很高,想想是不是可以有办法可以用个函数把它们分离出来。

  • 相关阅读:
    swagger2 Could not resolve pointer: /definitions
    mybatis-plus使用Oracle函数生成主键
    WebLogic安装及部署
    windows下用bat启动jar包,修改cmd标题(title)
    Windows下修改Tomcat黑窗口标题
    jar包注册为Linux服务
    Redis我想入门——数据类型
    Redis我想入门——启动
    JAVA8给我带了什么——Optional和CompletableFuture
    JAVA8给我带了什么——并行流和接口新功能
  • 原文地址:https://www.cnblogs.com/yunlongaimeng/p/8654937.html
Copyright © 2011-2022 走看看