1.python中的容器数据类型概述
2.列表类型的异构性、有序性和本地可变性三大优势
2.列表的基本操作(增、删、改、分片索引)
3.列表的分片赋值与本地排序

【妹子说】今天开始学python啦,不过我们从哪里开始学起呢?

Python中有一种被称之为“容器”的数据类型,专门用来存放其他类型的对象,就好比小时候用的文具盒,里面放着铅笔、尺子、橡皮等等。很多人刚刚使用Python的时候,往往最先接触的就是这种容器对象,比如列表、字典、元组等等。它们功能全面,使用也很方便,可以解决很多实际问题。

那么,第一季我们就首先从这些好用、实用的python容器入手吧,第一个就介绍列表:

Python列表用起来非常灵活,它有三大优点,我们一个一个来说,聊完了这三个优点,基本上列表的基本操作我们就掌握了:

第一个优点:(https://jq.qq.com/?_wv=1027&k=UEbz4NcQ)

列表里想装啥就装啥,即:他可以包含不同种类、任意类型的对象,甚至可以嵌套列表,专业点的词儿叫:异构性;

我们看一个例子:

L1 = [1, 2, 3, 4, 5]
L2 = [1, 'spam', [2.3, 4]]
L3 = []

看这三个列表的初始化过程,异构性就搞清楚了,特别是L2列表,它同时包含了好几种不同的数据类型,甚至还嵌套了列表。

第二个优点:(https://jq.qq.com/?_wv=1027&k=UEbz4NcQ)

列表里装的元素都是有顺序的,可以按照位置序号获取单个元素,也可以用分片的方法来进行多个连续元素的获取,来个专业词汇,叫做:有序性。

按位置序号索引,例如L1[2]这种方式来访问列表中的元素只是最简单的一种,我来重点来说说分片操作这个独特用法,先看看这个例子:

L = [1,2,3,4,5,6,7,8]
print(L[1:3]) [2, 3]

我们从列表L中从左往右截取了一个片段。关于截取片段左右边界与索引值的对应关系,我们只需记住这么一个口诀“左闭右开”就OK了:

分片索引中第一个参数1表示左侧开始的索引1(从0开始计数),因此起始的元素就是整形数2,第二个参数3表示在右侧终止的索引值为3,即整形数4,但要记住他是不包含在截取的序列中的。

分片还有几种常见用法:

如果省略掉终止索引,就表示一直截取到末尾:

L = [1,2,3,4,5,6,7,8]
print(L[1:]) [2, 3, 4, 5, 6, 7, 8]

同理,如果省略掉起始索引,就表示从起始元素就开始截取:

L = [1,2,3,4,5,6,7,8]
print(L[:4]) [1, 2, 3, 4]

还可以用负索引,目前我们使用的都是正索引,即从左往右的索引值,最左侧的索引值为0,往右依次加1;还有一种负索引的表示法,即从右往左数,最右侧是-1,往左依次减1,即-2,-3以此类推:

L = [1,2,3,4,5,6,7,8]
print(L[3:-1]) [4, 5, 6, 7]

【妹子问】:那我想跳着截取呢?

那就用上第三个参数,步进值参数,这个默认是1,即1个挨着1个的取,如果我们想跳着截取,那就得专门设置这个步进参数了。

L = [1,2,3,4,5,6,7,8]
print(L[0::2]) [1, 3, 5, 7]

这时候【妹子问了一个很有内涵的问题】:我对截取出的分片进行修改,会影响到原始的列表吗?

那我们还是眼见为实:

L = [1,2,3,4,5,6,7,8]
b = L[3:-1]
print('before change:b={}'.format(b))
b[0]=111
print('after change:b={}'.format(b))
print('after change:L={}'.format(L)) before change:b=[4, 5, 6, 7]
after change:b=[111, 5, 6, 7]
after change:L=[1, 2, 3, 4, 5, 6, 7, 8]

很明显,对原始列表L进行分片切割后,产生了一个全新的列表。用变量b获取了L的分片后,实质是获取了L分片的一个新的独立拷贝。因此,你在列表b上做修改,是影响不了L的。

第三个优点:(https://jq.qq.com/?_wv=1027&k=UEbz4NcQ)

列表的大小和内容可以随意改变,在插入、删除、修改列表元素时,不需要建立一份新的列表拷贝,而是在原来的内存地址上直接修改列表对象。这个叫“本地可修改”

首先看增加新元素的三个使用场景:

L = [1,2,3,4]
L.append(5)
print(L) [1, 2, 3, 4, 5] L = [1,2,3,4]
L.insert(1,10)
print(L) [1, 10, 2, 3, 4] L = [1,2,3,4]
L.extend([11,22,33])
print(L) [1, 2, 3, 4, 11, 22, 33]

这三个用法有些不同,append方法只能在尾部加入;insert方法可在任意位置加入,比如上面例子,我们在列表的索引位置为1的地方加入元素10,如果指定的索引值大于序列的总长度,则自动加到末尾;extend方法则可以在尾部一次性加入多个元素

这时,【妹子自己操作了一把】:

L = [1,2,3,4,5]
L = L.insert(6,2)
print(L[2]) Traceback (most recent call last):
File "E:/12homework/12homework.py", line 3, in <module>
print(L[2])
TypeError: 'NoneType' object is not subscriptable

然后,就没有然后了。。。这里犯了一个常见的错误,因为我们说过插入是就地修改,而不是返回修改后的新列表。Insert方法的返回值是None,这么干换句话说,会彻底失去之前列表的引用,因为你把None值赋给了L,你就无法找到之前的列表了。append和extend方法也是这样。

删除,依据使用需求也有这几种使用场景:

最简单直接的,用remove方法,传入指定要删除的对象,注意:它也是在原列表上就地删除,返回值为None

L1 = ['aa','bb','cc']
L1.remove('aa')
print(L1) ['bb', 'cc']

这里注意,还有一个内置方法del,它额外的功能是可以删除列表中的一个分片

del L1[1:3]

还有一个pop方法,它在末端删除一个元素,并可以将删除的元素作为返回值返回给调用者

L1 = [1,2,3]
print(L1.pop())#末端删除一个元素,弹出删除的值
print(L1) 3
[1, 2]

【妹子问】那么元素修改,除了像下面这种直接用索引做元素修改的情况外,还有什么有趣的用法?

L = [4,5,6,7,8,9]
L[0] = 0

那必须要来点有意思的,主要就说分片赋值和本地排序这两个问题:

L = [4,5,6,7,8,9]
L[1:3] = ['aa','bb','cc','dd']
print(L) [4, 'aa', 'bb', 'cc', 'dd', 7, 8, 9]

分片赋值的本质是先在原列表上删除指定分片,然后在删除的位置插入新的列表,因此左右两边的长度可以不等。

本地排序非常方便,看看下面的例子就明白了。注意排序也是在本地修改,而不是将排好序的列表作为返回值返回。

L = [1,5,3,8,3,2,10]
L.sort()
print(L)
L.reverse()
print(L) [1, 2, 3, 3, 5, 8, 10]
[10, 8, 5, 3, 3, 2, 1]

【妹子说】果然呀,所谓三大优点讲完了,列表的基本用法算是弄明白了,那下次再讲讲字典和元组吧。

给妹子讲python-S01E01好用的列表的更多相关文章

  1. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  2. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  3. python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍

    目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...

  4. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  5. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

  6. python学习第一讲,python简介

    目录 python学习第一讲,python简介 一丶python简介 1.解释型语言与编译型语言 2.python的特点 3.python的优缺点 二丶第一个python程序 1.python源程序概 ...

  7. python基础一数据类型之列表

    摘要: python基础一中写到列表,那么这篇主要讲列表. 1,定义列表 2,列表.元祖.字符串都属于序列,都可以用用索引和切片. 3,列表的方法 1,定义列表 list1 = ['a','b',1, ...

  8. Python内建的对象列表

    Python内建的对象列表 刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起... 在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多 ...

  9. python数据类型详解及列表字典集合推导式详解

    一.运算符 Python语言支持以下类型的运算符: 算术运算符 如: #!/usr/bin/env python # -*- coding:utf-8 -*- a = 5 b = 6 print(a ...

  10. 【python基础】之list列表

    python提供了一个被称为列表的数据类型,他可以存储一个有序的元素集合. 记住:一个列表可以存储任意大小的数据集合.列表是可变对象,有别于字符串str类,str类是不可变对象. 1.创建一个列表 l ...

随机推荐

  1. 2021.08.01 P4311 数字序列(左偏树)

    2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...

  2. 数据传输POST心法分享,做前端的你还解决不了这个bug?

    背景 随时随地给大家提供技术支持的葡萄又来了.这次的事情是这样的,提供demo属于是常规操作,但是前两天客户突然反馈压缩传输模块抛出异常,具体情况是压缩内容传输到服务端后无法解压. 由于代码没有发生任 ...

  3. linux搭建ntp时间同步服务

    1.NTP简介 NTP(Network Time Protocol,网络时间协议)用来使计算机时间同步的一种协议.它可以使计算机对其服务器或时钟源做同步化,它可以提供高精准度的时间校正(LAN上与标准 ...

  4. react 可拖拽改变位置和大小的弹窗

    一 目标 最近,项目上需要一个可以弹出一个可以移动位置和改变大小的窗口,来显示一下对当前页面的一个辅助内容 二 思路 1.之前写过一个antd modal的可移动弹窗但是毕竟不如自己写的更定制化,比如 ...

  5. python mysqldb 报错: ProgrammingError: must be real number, not str 解决

    代码: sql = 'insert into book(book_name,book_desc,origin_price,publish_id,tag_id,book_img) values(%s,% ...

  6. c/c++递归打印文件夹

    调用linux的系统函数,实现tree的功能,递归打印文件夹 使用到得函数: DIR *opendir(const char *name); // 打开文件夹 struct dirent *readd ...

  7. 公司为什么要使用OKR,目的是什么?

    原创不易,求分享.求一键三连 站在公司角度,会有一些诉求: 想知道每个人在干什么,干得怎么样: 想知道如何把更多的人卷起来: 人是不想被管束的,无论是想"度量我"还是想卷我,都是我 ...

  8. BFC 是什么?

    BFC 是什么? 本文写于 2020 年 7 月 17 日 总有同学问我:"这个 div 为什么会插出来?为什么 float 的 div 这么不好操作?".这其实就是没有深入理解 ...

  9. 随笔总结:8086CPU的栈顶超界问题

    我们学习编程都知道栈的超界限问题是非常严重的问题,他可能会覆盖掉其他数据,并且我们不知道这个数据是我们自己保存的用于其他用途的数据还是系统的数据,这样常常容易引发一连串的问题. 在学习汇编的时候,我们 ...

  10. Unity实现”对象池管理器“

    前言:警告!这可能是坨屎,空闲时间写成,仅作娱乐 在Unity中生成或销毁一个物体会占用较大的资源,如果是制作FPS射击游戏,子弹生成更是雪上加霜.所以我自己写了一个PoolManager,不能和网上 ...