Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >轻松初探 Python 篇(四)—list tuple range 知识汇总

轻松初探 Python 篇(四)—list tuple range 知识汇总

作者头像
小之丶
发布于 2018-03-07 06:46:08
发布于 2018-03-07 06:46:08
87000
代码可运行
举报
文章被收录于专栏:WeaponZhiWeaponZhi
运行总次数:0
代码可运行

这是「AI 学习之路」的第 4 篇,「Python 学习」的第 4 篇

今天的主题是 Python 的序列类型(Sequence Types),内容很多,干货很足,也是我们平时经常使用的,大家准备好小板凳纸笔吧!

注意,我不准备再将循环语句和条件语句方面的知识了,比较简单,每种语言这方面的写法区分不大,有兴趣的大家可以自行去查阅一下。

list

list 是一种有序集合,在很多语言里面都有支持,像 Java 中的 List ,可以简单理解 List 是一个顺序表,可以对它进行添加和删除元素的操作,但和 Java 不同,Java 的 List 并不是内置的,它的一些实现类比如 ArrayList 是用 Java 代码另外实现的,而 list 在 Python 中是一种内置数据类型,它是和语言本身是一体的。

list 的使用很简单,用方括号[]表示,内部的元素用逗号「,」区分。比如,我们用 list 来表示我国的几个城市的名字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city = ['北京','上海','天津','重庆']
>>> city
['北京','上海','天津','重庆']

我们可以用索引来访问 list 中指定位置的元素,这部分有点像 Java 的数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city[0]
'北京'
>>> city[3]
'重庆'
>>> len(city)
4
>>> city[4]
IndexError:list index out of range

这里要注意下,索引是从 0 开始,而不是从 1,所以最后一个重庆的索引实际上是 3,当我们试图访问位置为 4 的时候,就会产生索引越界的错误。

通过 len() 函数可以获取 list 的长度,所以实际上 list 的最后一个元素的索引是len(city)-1。

空的 list 长度为 0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = []
>>> len(L)
0

当然我们也可以从后往前进行索引,-1 代表最后一个,-2 代表倒数第二个,以此类推。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city[-1]
'重庆'
>>> city[-2]
'天津'
>>> city[-5]
IndexError:list index out of range

list 中元素的数据类型是不一定是一样的,甚至可以再嵌套一个 list:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = ['小之',23,False,['Android','Python','Java']]
>>> len(L)
4

L 中的另一个 list 整体只算一个元素,你可以把它理解为一个二维数组,可以通过 L[3][1] 调用到这个 list 中的 Python 元素。

list 常用的函数

list 是一个可变有序表,所以可以往 list 中塞数据,使用 append() 函数将把元素塞到末尾

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city.append('南京')
>>> city
['北京','上海','天津','重庆','南京']

我们还可以使用 insert() 来把元素插入到指定位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city.insert(2,'苏州')
>>> city
['北京','上海','苏州','天津','重庆','南京']

通过 pop() 可以获取 list 末尾的元素,并且删除该元素,pop(i) 可以删除并返回指定位置的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city.pop()
'南京'
>>> city.pop(0)
'北京'
>>> city
['上海','苏州','天津','重庆']

使用 remove(x) 来移除某一个特定的元素 x

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city.remove('上海')
>>> city
['苏州','天津','重庆']

使用 reverse() 来将 list 逆序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city.reverse()
>>> city
['重庆','天津','苏州']

如果想作拼接可以有两种方式,一种是通过 extend() ,一种是通过「+」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L2 = ['北京']
>>> L+L2
['重庆','天津','苏州','北京']
>>> L.extend(L2)
>>> L
['重庆','天津','苏州','北京']

注意,L+L2 并不会改变 L 的值,而 extend 是会改变调用 list 本身的值的,所以 extend 实际上可以和 L += L2 等价

你还可以通过 city *= n 来将 list 重复 n 次塞入到本身

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = ['1','2']
>>> L *= 3
>>> L
['1','2','1','2','1','2']

tuple

tuple 叫元祖,是另一种有序列表,tuple 和 list 很像,但是 tuple 初始化后就不能再被修改了,除了一些插入删除操作比如 append, pop 不能使用,其他的使用和 list 基本一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> city = ('北京','上海','南京')
>>> city[0]
'北京'
>>> city[-1]
'南京'

注意,在定义一个 tuple 的时候,tuple 的元素就被确定下来了,之后你将无法改变它,这样做的意义是 tuple 的不可变性可以使得代码更加安全,如果可以,你应该尽量使用 tuple 来替代 list。

当你定义只有一个元素的 tuple 的时候,注意需要在后面加一个「,」号,以免引起歧义。(1) 是可以代表数字 1 的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> t = (1)
>>> t
1
>>> t = (1,)
>>> t
(1,)

tuple 的「不可变」并不意味着元素完全不可变,而是代表 tuple 元素的指向是不可变的,tuple 的元素可以是一些「可变的」元素,比如 list:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> t = ('北京','上海',['重庆','南京'])
>>> t[2][0] = '天津'
>>> t
('北京','上海',['天津','南京'])

我们可以看到 tuple 中的 list 元素已经改变了,但实际上 tuple 的元素指向的仍然还是这个 list,总而言之,tuple 需要保证的是「指向不变」,而如果你需要保证内容不变,那就得保证元素本身是不可变的。

range

我们最后介绍一下 range。range 也是一个不可变的序列,它通常是使用在一些循环语句中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> list(range(10))
[0,1,2,3,4,5,6,7,8,9]
>>> list(range(1,11))
[1,2,3,4,5,6,7,8,9,10]
>>> list(range(0,30,5))
[0,5,10,15,20,25]
>>> list(range(0,10,3))
[0,3,6,9]
>>> list(range(0,-10,-1))
[0,-1,-2,-3,-4,-5,-6,-7,-8,-9]
>>> list(range(0))
[]
>>> list(range(1,0))
[]

list 函数将把可遍历的数据类型转化为 list。我们通过以上代码发现,range(10) 是 0-9 的数列,在一个参数的时候是从 0 开始的序列。range(1,11) 代表从第一个参数开始,第二个参数为止的数列,注意,这里的范围是[1,11),包括第一个参数,不包括第二个参数。三个参数,在两个参数的基础上增加了一个 step 用来表示每次增幅的数量,如果某一次增幅超过了一边范围,则割舍掉这个值。

如果没有第三个参数,则默认所有的 step 都是 +1,如果开始值和结束值大小写反了,将会返回一个空列表。

一般我们会在 for 语句中使用 range()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = []
>>> for i in range(10):
...     L.append(i)
...
>>> L
[0,1,2,3,4,5,6,7,8,9]

序列类型的一些其他用法

通用序列操作

下面说的操作和函数都是通用操作,不管是不是可变序列,都可以使用。我们先定义一个测试列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
L = [1,2,3,4,5]

x in L, x not in L

x 代表元素,L 代表列表,x in L 中如果 L 中有元素和 x 相等,就返回 True,否则返回 False,x not in L 相反。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 1 in L
True
>>> 0 in L
False
>>> 1 not in L
False
>>> 0 not in L
True

L + T

这个我们之前也讲过了,通过「+」可以拼接两个序列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> T = [6]
>>> L + T
[1,2,3,4,5,6]

L * n

将 L 重复塞入自己 n 次,得到一个新的列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L * 2 
[1,2,3,4,5,6,1,2,3,4,5,6]

len(L)

获取列表长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> len(L)
12

min(L)、max(L)

获取列表中的最大最小值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> min(L)
1
>>> max(L)
6

L.index(x)

获取 x 在 L 中第一次出现的位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = (1,2,1,3)
>>> L.index(1)
0

index 还有两个变种,可以添加两个参数,index(x,i)和 index(x,i,j)。

如果只增加一个参数,那就是获取从这个参数位置开始到列表结尾这个范围中,第一次出现 x 的位置,如果增加两个参数,则返回从 i 至 j (不包括 j)范围中第一次出现 x 的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L.index(1,1)
2
>>> L.index(1,1,3)
2

如果找不到,将会抛出 ValueError 错误

L.count(x)

返回 x 在 L 中出现的次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L.count(1)
2

可变序列操作

下面介绍一些可变序列独有的操作,tuple 是无法使用的。

除了之前介绍 list 时提到的诸如 append、remove 以外,还有一些比较有用的函数。

L.clear()

清空列表中所有的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L.clear()
>>> L
[]

L.copy

新建一份相同的列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> L = [1,2,3]
>>> A = L.copy()
>>> A
[1,2,3]
>>> A.append(1)
>>> A
[1,2,3,1]
>>> L
[1,2,3]

以上介绍了一些序列类型的一些基本操作,还有一些类似「切片」、「迭代」、「生成器」等高级操作,将在后续的文章中为大家介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WeaponZhi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Python】独特的进程池概念
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程。
杨丝儿
2022/02/25
1.6K0
Python:线程、进程与协程(6)——
    上篇博文介绍了multiprocessing模块的内存共享(点击此处可以参看),下面讲进程池。有些情况下,所要完成的工作可以上篇博文介绍了multiprocessing模块的内存共享,下面讲进程池。有些情况下,所要完成的工作可以分解并独立地分布到多个工作进程,对于这种简单的情况,可以用Pool类来管理固定数目的工作进程。作业的返回值会收集并作为一个列表返回。Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。
py3study
2020/01/06
1.5K0
一篇文章梳理清楚 Python 多线程与多进程
在学习Python的过程中,有接触到多线程编程相关的知识点,先前一直都没有彻底的搞明白。今天准备花一些时间,把里面的细节尽可能的梳理清楚。
吾非同
2021/12/13
9370
一篇文章梳理清楚 Python 多线程与多进程
44.python 进程池multiprocessing.Pool
python进程池Pool 和前面讲解的 python线程池 类似,虽然使用多进程能提高效率,但是进程的创建会消耗大量的计算机资源(进程Process的创建远远大于线程Thread创建占用的资源),线程是计算机最小的运行单位,连线程都需要使用线程池,进程有什么理由不使用进程池?
猿说编程[Python和C]
2020/03/12
2.7K0
44.python 进程池multiprocessing.Pool
【从零学习python 】85.Python进程池的并行计算技术应用
当需要创建的子进程数量不多时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,但如果是上百甚至上千个目标,手动创建进程的工作量巨大,此时就可以使用 multiprocessing 模块提供的 Pool 方法。
全栈若城
2024/02/29
1390
python 中的进程池 -- multiprocessing.pool.Pool
上一篇文章中,我们介绍了如何通过 multiprocessing 进行多进程并发编程。 通过 multiprocessing 实现 python 多进程
用户3147702
2022/06/27
2K0
python 中的进程池 -- multiprocessing.pool.Pool
Python进程间通信和进程池
可以使用multiprocessing模块的Queue实现多个进程之间的数据传递。Queue本身是一个消息列队程序。
Python碎片公众号
2021/02/26
8510
Python进程间通信和进程池
python标准库之MultiProcessing库的研究 (1)
MultiProcessing模块是一个优秀的类似多线程MultiThreading模块处理并发的包 之前接触过一点这个库,但是并没有深入研究,这次闲着无聊就研究了一下,算是解惑吧。 今天先研究下apply_async与map方法。传闻就是这两个方法分配进程池中的进程给相关函数,我想验证下。 看下官网对这两个的解释: apply_async(func[, args[, kwds[, callback[, error_callback]]]]) A variant of the apply() method which returns a result object.
Ryan_OVO
2023/10/18
2180
python标准库之MultiProcessing库的研究 (1)
python多进程编程-进程池的使用(一)
在Python多进程编程中,进程池是一种常用的技术,它可以在多个进程之间共享资源,提高程序的执行效率。
玖叁叁
2023/04/20
8860
第十五章 Python多进程与多线程
multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器。避免了GIL(全局解释锁)对资源的影响。
py3study
2020/01/09
7720
python进程池:multiprocessing.pool
本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动。
hankleo
2020/09/17
4450
进程池及回掉函数[通俗易懂]
虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此。
全栈程序员站长
2022/07/21
3610
python 进程池Pool
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
Devops海洋的渔夫
2019/06/02
1K0
Python进程间通信
可以使用 multiprocessing 模块的 Queue 实现多进程之间的数据传递,Queue本身是一个消息队列程序,首先用一个小实例来演示一下Queue的工作原理:
忆想不到的晖
2021/04/04
9100
Python进程间通信
python中的多进程处理
  众所周知,python本身是单线程的,python中的线程处理是由python解释器分配时间片的;但在python 3.0中吸收了开源模块,开始支持系统原生的进程处理——multiprocessing. 注意:这个模块的某些函数需要操作系统的支持,例如,multiprocessing.synchronize模块在某些平台上引入时会激发一个ImportError 1)Process   要创建一个Process是很简单的。
py3study
2020/01/13
7200
Python系统编程-进程1.进程1.多任务的引入2.多任务的概念
有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;
Python攻城狮
2018/08/23
6210
Python系统编程-进程1.进程1.多任务的引入2.多任务的概念
python 进程池pool简单实例
   在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。  
py3study
2020/01/03
2.2K0
【Python基础编程】全面解析进程、进程通信与生产者-消费者模式
上篇文章主要了解python的线程,如何创建线程,如何通过线程实现生产者-消费者模式以及线程池的使用等等,接下来这篇文章讲解python的进程,有问题欢迎一起探讨。
易辰君
2024/11/07
850
【说站】python中进程池Pool的初始化
3、如果池中的流程数达到指定的值,则等待该请求,直到池中的流程结束为止,以之前的流程执行新的任务。
很酷的站长
2022/11/24
3260
【说站】python中进程池Pool的初始化
【python进阶】深入理解系统进程2
前言 在上一篇【python进阶】深入理解系统进程1中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing 如果你打算编写多进程的服务程序,Unix/Linux⽆疑是正确的选择。由于 Windows没有fork调⽤,难道在Windows上⽆法⽤Python编写多进程的程 序? 由于Python是跨平台的,⾃然也应该提供⼀个跨平台的多进程⽀持。 multiprocessing模块就是跨平台版本的多进程模块。 multi
Angel_Kitty
2018/06/14
6850
相关推荐
【Python】独特的进程池概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验