给妹子讲python-S01E01好用的列表

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好用的列表的更多相关文章
- python学习第九讲,python中的数据类型,字符串的使用与介绍
目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...
- python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍
目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...
- python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍
目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- python学习第四讲,python基础语法之判断语句,循环语句
目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...
- python学习第一讲,python简介
目录 python学习第一讲,python简介 一丶python简介 1.解释型语言与编译型语言 2.python的特点 3.python的优缺点 二丶第一个python程序 1.python源程序概 ...
- python基础一数据类型之列表
摘要: python基础一中写到列表,那么这篇主要讲列表. 1,定义列表 2,列表.元祖.字符串都属于序列,都可以用用索引和切片. 3,列表的方法 1,定义列表 list1 = ['a','b',1, ...
- Python内建的对象列表
Python内建的对象列表 刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起... 在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多 ...
- python数据类型详解及列表字典集合推导式详解
一.运算符 Python语言支持以下类型的运算符: 算术运算符 如: #!/usr/bin/env python # -*- coding:utf-8 -*- a = 5 b = 6 print(a ...
- 【python基础】之list列表
python提供了一个被称为列表的数据类型,他可以存储一个有序的元素集合. 记住:一个列表可以存储任意大小的数据集合.列表是可变对象,有别于字符串str类,str类是不可变对象. 1.创建一个列表 l ...
随机推荐
- Android第1-2周作业
作业1:安装环境,截图编程界面,截图运行界面 作业2:九宫格 <?xml version="1.0" encoding="utf-8"?> < ...
- CSS一个较为完整的页面布局_可以根据页面屏幕大小调整布局
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)
查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找: 线性查找也称为顺序查找,用于在无序数列中查找. 二分查找: 二分查找也称为折半查找,其算法用于有序数列. ...
- [AcWing 801] 二进制中1的个数
点击查看代码 #include<iostream> using namespace std; int lowbit(int x) { return x & -x; } int ma ...
- vant 使用field组件加载页面就触发input事件的坑,已解决
使用vant的时候,遇到一个坑,加载组件就自动触发input事件,input事件里写了验证,导致已加载就验证错误 原因:v-model绑定的时候写的是null, filed组件接收的时候把他转换成空字 ...
- JDBC往数据库传值中文乱码以及时区不一致解决
设置一下时区和编码就可以了 "jdbc:mysql://localhost:3306/jdbcprac?characterEncoding=UTF-8&&useSSL=fal ...
- 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...
- Blazor Hybrid / MAUI 简介和实战
1. Blazor Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的服务 ...
- C#中的接口和类有什么异同
不同点: 1. 不能直接实例化接口 2. 接口中的成员不能用访问修饰符修饰(默认public) 3. 接口不包含方法的实现 4. 接口可以多继承,类只能单继承. 5. 类定义可在不同的源文件之间进行拆 ...
- C# 随机给一个全部信息都未知的类类型,如何获取该类的类名、属性个数、属性名、属性的数据类型、属性值?
一.场景假设 假设现在有一个泛型类T的实例对象t,该T类的全部信息都未知. 要求:打印输出实例对象t的类名.属性个数.属性名.属性的数据类型.属性值. 二.解决问题 1.我们根据输出的内容要求定义一个 ...