zoukankan      html  css  js  c++  java
  • 《Python编程,从入门到实践》- 02 列表和操作列表

    列表

    简单来说列表就是由一系列按特定顺序排列的元素的集合

    在Python中。用方括号 [] 来表示列表,并用逗号分隔其中的元素

    访问的方式类似其他语言 变量名[index] 

    names = ["alices","bob","tom"]
    print(names[0])
    print(names)
    print(names[-1])  # 不同于java,c++。这里是能使用-号的,表示倒着数,倒着是从1开始,但是倒着越界是会报错的
    # print(names[3])
    list = ["String", 1]  # 没有报错,也就是说 python的列表的它的变量是一个原理,都是指向性的,并不是限定了类型
    print(list)

    有几点说明一下,因为Python不需要指定类型,所以Python中的列表里是可以放不同类型的元素的

    对于列表内容的访问而言,存在一个越界问题,在Java或者C++中,角标不能为负,在Python中可以,角标为负代表倒着数

    修改,删除,添加元素

    list[0] = "alice"
    print(list[0])  # 修改就是直接换,而且这个就类似于变量那个原理,是能换类型的
    list[0] = 0
    print(list[0])
    list.insert(0, 'x')
    print(list.__len__())
    list.insert(20, 'w')  # 这里注意一下,我插入的位置是20,但这个20是大于应该最后一个位置的,但它自动的默认了尾
    print(list.__len__())
    print(list)
    list.insert(-2, "m")   # 果然 负数也是能使用的,意味着新插入的这个是 倒着的第x + 1,
                           # 顺便说一下,如果这个负数的绝对值 大于了列表长度,类似于上面的20,那么会插到头的位置,而不是报错
    list.append("sss")  # 尾插的话 直接append,但好像没有提供头插的函数
    print(list)
    del list[0]
    print(list)
    del list[-1]  # 删的时候是 如果删 list[20],list[-20]的话是不能删的,
    print(list)
    list.pop()  # 直接删除头部好像也没有直接的尾巴删,也就是说,python中的列表可以近似的看成是队列的形式,
                # 当然这个pop同与其他pop是弹射,也是说,返回第一个值并删除
                # 再说一下,这个pop其实是可以弹任何位置的,只需要在括号里加索引号就行了
    print(list)
    list.remove("m")  # 上面是按索引删除,remove可以按值删除
    print(list)
    # list.remove("non")  # 删不存在的值是会报错的
    print(list)

    修改很简单直接修改,插入的话,其实有两种方式,主要是尾插和随意位置插入。需要注意的地方是使用insert()插入时,插入位置可以为负数,同时没有边界限制。也就是说,即使列表长度只有x,你在大于x的位置插入,也不会报错,它会插在最后面。而且,负数并非插在最前面,而是倒数的方式插入

    删除的话,主要有三种方式,一种是直接删除某个位置的元素,这里注意使用del的时候,角标不能越界。第二个是pop()函数,也就是弹出首,这个函数会返回第一个位置的值并将其删除,说到这,是不是感觉Python中的列表很类似于队列,先进先出,尾插头出。当然这个pop函数其实是能弹任何位置的。只要将index传入就行了。第三种则是remove方法,按值删除,要注意的是,不能删除没有的元素,否则会报错

    组织列表

    排序,Python提供sort函数可以帮助数组快速排序,我现在还不清楚这个sort是怎么实现的(现在还不晓得查看源码的方式,不同于Java直接点就能看)。

    # list2 = [0, 1, 2, 'a', 'b', 'c', "Alice", "Bob", "Tom", 'A', 'B', "C", "addrress", "name"]
    # 数字和字符不能一起排序,也就是说,如果你要使用sort切记列表里的元素是同一类型的
    list2 = ['a', 'b', 'c', "Alice", "Bob", "Tom", 'A', 'B', "C", "addrress", "name"]
    print("list2 =", list2)
    list2.sort()   # 这个sort是永久排序   sorted() 函数是临时排序
    print("list2 =", list2)
    list2.reverse()  # 翻转列表
    print("list2 =", list2)
    print(len("abcd"), len(list2))  # len 这个函数是可以获取字符,列表的长度的,不能获取数字的长度,至于能不能获取对象,之后再看

    Python 提供的sort() 函数是一种永久性排序,而sorted则是临时排序(用法 sorted(list))

    需要注意的地方是,数字和字符串不能一起排序,也就是说,需要保证列表里是同一类型的。至于能不能排对象,是否那个类需要实现类似于Java中compareable接口之类的,后续学习的时候再深入。

    reverse可以翻转列表,永久性。len可获取字符串长度,列表长度。不能获取数字长度。

    其实对于列表的使用,我个人认为还是应该将同一类型的元素放在一个列表里。若非特殊使用,还是不要在一个列表里放多种元素

    操作列表

    遍历列表,遍历的方式当然是使用循环去遍历

    lists = ['b', 'c', "Alice", "Bob", "Tom", 'A', 'B', "C", "addrress", "name"]
    for element in lists:  # 这种循环方式就是典型的for-each循环,我不晓得python中是否有像java,c++中那样“标准”循环,或者while循环
        # 注意缩进,这个缩进内 都表示要循环的,它就是一个 块 的概念
        print(element, end = " ")  # 不换行打印
        a = 3 # 但是这个定义是全局的
    print()
    print("a =", a)

    Python中提供一种典型的for-each循环,做法很简单,如上。

    需要注意的地方是,一是缩进。之前我就说过了,Python中的缩进有特殊含义,它代表了一个代码块。要循环的部分在这个块内,其余放块外。第二点,就是在这个块内定义的变量是全局的,不是局部的,出了这个块也可以使用。暂时留个疑问,Python中是否有局部变量这个概念

    创建数字列表,Python中提供了简单的创建一串数字的方法

    numbers = range(1, 5)  # range函数并不是生成了一个列表
    print(numbers)
    numbers = list(range(1, 5))  # 要这样使用才能创建列表,1 2 3 4 ,没有最后那一位,起名字时注意一下,列表尽量不要直接用list命名
    
    #for index in range(0, 5, 1)  正确的来说,我建议最好写成这样子的,开始,结束,自增,这里是叠加的
    for index in range(0, 5):   # range 从0到4  也就说,如果想使用类似于“标准”循环 可以这样做
        print(index, end = " ")

    需要注意的地方是,使用range函数创建时,需要用list函数去包装

    一些简单的统计

    # 常规函数,最大,最小,求和
    print()
    print(max(lists))  # 最大最小能用于字符型列表
    print(min(numbers))
    print(sum(numbers))  # 求和只能用于数字型
    
    squares = [value**2 for value in range(1, 11)]  # 快速创建,新人不建议使用,熟练后再
    print(squares)

    使用列表中的一部分,Python提供了切片这种方法,创建切片时,需要指定第一个元素的位置和最后一个元素的位置+1

    # 切片
    players = ["alice", "bob", "tom", "allen", "mark"]
    players_son = players[0:3]  # 切片是能直接拿来做列表的,和range不同,不需要list去包装
                                # 多说一点,这个对象是新生成的,修改其内容不会影响到players
    print(players_son)
    print(players[-1:3])  # 没报错,什么也没打印
    print(players[-3:-1]) # 负数的使用和之前的是一样的,越界不报错,越界按边界算
    print(players[:5])  # 只写一边,另一边代表边界
    players_son[0] = "none"
    
    players_copy = players[:]  # 因为切片是新生成的,所以就可以这样拷贝
    players_copy2 = players   # 不能直接players_copy = players,否则两个变量就其实是一个对象了
    players_copy2[0] = "none"
    print("
    ", players)
    
    players_copy2 = players.copy()  # 这个复制也会修改原内容
    players_copy2[0] = "none"
    print("
    ", players)

    需要注意的地方,就是切点吧。因为Python中允许角标为负(老实说,我不太喜欢这点)所以在使用的时候,要注意区间范围,如果是从负数跨正数会产生什么,负数到负数会产生什么,大到小产生什么,等等这系列问题,其实动手实践才能更好的去理解。还有一个很重要的地方就是对于切片生成的子集而言,是一个新的列表和源列表无关。

    列表的复制,列表的复制依赖于列表的切片,只要不输入始末就代表了头和尾。如果直接使用 ==  或者 copy 则不会产生新的列表,两个变量其实引的是同一个东西,改变一个另一个也会改变。

    元祖,简单来说就是一个常量集,不能改变长度,也不能改变内容

    # 元祖-不可变列表
    players2 = ("alice", "bob", "tom", "allen", "mark")
    # 没有提供插入和删除函数,元祖应该是内容和长度都不可变的
    # 其他使用方式和列表如出一辙
    # 如何修改,其实只能是重新定义,如果需要用到修改,则去使用列表

    最后要说的一点是代码格式,不要随意缩进,缩进的时候想明白这行代码应该出现在哪个位置,这是很重要的。

    至于代码风格,每个人都不同,每个公司都不同,没法统一标准。但是尽量和大部分的分格靠弃肯定是没问题的。

  • 相关阅读:
    第38周星期六小结
    第38周星期日小结
    第39周星期三熟悉java项目第一天小结
    第39周星期一今天开始用扇贝记单词
    第38周星期四电话会议忙碌的一天
    第38周星期二
    第38周星期三熟悉工程环境
    PHP实现图片的等比缩放和Logo水印功能示例
    微信授权登录微信公众号和PC端网站
    PHP实现购物车的思路和源码分析
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/11888468.html
Copyright © 2011-2022 走看看