【Python】4.基础语法(4)列表和元组

news2024/9/21 22:47:56

文章目录

  • 1. 列表是什么, 元组是什么
  • 2. 创建列表
  • 3. 访问下标
  • 4. 切片操作
  • 5. 遍历列表元素
  • 6. 新增元素
  • 7. 查找元素
  • 8. 删除元素
  • 9. 连接列表
  • 10. 关于元组


1. 列表是什么, 元组是什么

编程中, 经常需要使用变量, 来保存/表示数据。

如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可。

num1 = 10
num2 = 20
num3 = 30
......

但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据。这个时候, 就需要用到列表。

列表是一种让程序员在代码中批量表示/保存数据的方式

  • 列表类似于一个口袋,可以往里面装东西和拿东西,数量可变。

元组和列表相比, 是非常相似的, 只是列表中放哪些元素可以修改调整, 元组中放的元素是创建元组的时候就设定好的, 不能修改调整。

  • 元组类似于真空包装的一个口袋,里面东西是固定的,数量不变的。

2. 创建列表

创建列表主要有两种方式。 [ ] 表示一个空的列表。

alist = [ ]# 方法1
alist = list()# 方法2
print(type(alist))

如果需要往里面设置初始值, 可以直接写在 [ ] 当中。

可以直接使用 print 来打印 list 中的元素内容。

alist = [1, 2, 3, 4]
print(alist)

列表中存放的元素允许是不同的类型。(这一点和 C++/Java 差别较大)。

alist = [1, 'hello', True, [4, 5, 6]]
print(alist)

打印:

[1, 'hello', True, [4, 5, 6]]

因为 list 本身是 Python 中的内建函数, 不宜再使用 list 作为变量名, 因此命名为 alist


3. 访问下标

  1. 可以通过下标访问操作符 [ ] 来获取到列表中的任意元素。

[]放到一个列表变量的后面,同时[]写上一个整数,此时他就是下标访问运算符。

我们把 [ ] 中填写的数字, 称为下标或者索引。

alist = [1, 2, 3, 4]
print(alist[2])

打印:

3

注意: 下标是从 0 开始计数的, 因此下标为 2 , 则对应着 3 这个元素。


  1. 通过下标不光能读取元素内容, 还能修改元素的值。
alist = [1, 2, 3, 4]
alist[2] = 100
print(alist)

打印:

[1, 2, 100, 4]

  1. 如果下标超出列表的有效范围, 会抛出异常。
alist = [1, 2, 3, 4]
print(alist[100])
# IndexError: list index out of range

  1. 因为下标是从 0 开始的, 因此下标的有效范围是 [0, 列表长度 - 1]。 使用 len 函数可以获取到列表元素个数。
alist = [1, 2, 3, 4]
print(len(alist))

打印:

4

  1. 下标可以取负数,表示 “倒数第几个元素”

ec2508d85b1faabfc17cb0a248b1e2cb

alist = [1, 2, 3, 4]
print(alist[3])
print(alist[-1])

打印:

4
4

alist[-1] 相当于 alist[len(alist) - 1]


4. 切片操作

通过下标操作是一次取出里面第一个元素。

通过切片, 则是一次取出一组连续的元素, 相当于得到一个子列表。

  1. 使用 [ : ] 的方式进行切片操作。
alist = [1, 2, 3, 4]
print(alist[1:3])

打印:

[2, 3]

alist[1:3] 中的 1:3 表示的是 [1, 3) 这样的由下标构成的前闭后开区间。

也就是从下标为 1 的元素开始(2), 到下标为 3 的元素结束(4), 但是不包含下标为 3 的元素。所以最终结果只有 2, 3


  1. 切片操作中可以省略前后边界
alist = [1, 2, 3, 4]
print(alist[1:])  # 省略后边界, 表示获取到列表末尾
print(alist[:-1])  # 省略前边界, 表示从列表开头获取
print(alist[:])  # 省略两个边界, 表示获取到整个列表

打印:

[2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4]

  1. 切片操作还可以指定 “步长” , 也就是 “每访问一个元素后, 下标自增几步”
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(alist[::1])
print(alist[::2])
print(alist[::3])
print(alist[::5])
print(alist[1:-1:2])

打印:

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

  1. 切片操作指定的步长还可以是负数, 此时是从后往前进行取元素。表示 “每访问一个元素之后, 下标自减几步”
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(alist[::-1])
print(alist[::-2])
print(alist[::-3])
print(alist[::-5])

打印:

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

  1. 如果切片中填写的数字越界了, 不会有负面效果。只会尽可能的把满足条件的元素过去到。
alist = [1, 2, 3, 4]
print(alist[100:200])

打印:

[]
alist = [1, 2, 3, 4]
print(alist[3:200])

打印:

[4]

5. 遍历列表元素

“遍历” 指的是把元素一个一个的取出来, 再分别进行处理。

  1. 最简单的办法就是使用 for 循环

    elem就代表了列表里的每个元素

alist = [1, 2, 3, 4]
for elem in alist:
    print(elem)

打印:

1
2
3
4

关于elem

代码1:

alist = [1, 2, 3, 4]
for elem in alist:
    elem = elem + 10
    print(elem)

打印:

11
12
13
14

为什么会这样呢?

因为elem就代表了列表里的每个元素, elem = elem + 10相当于1+10;2+10;3+10;4+10

改变的是elem,不会改变列表元素。


代码2:

alist = [1, 2, 3, 4]
for i in range(0, len(alist)):
    alist[i] = alist[i] + 10
    print(alist[i])

打印:

11
12
13
14

代码2虽然和代码1打印内容一样,实际上有很大的区别:

代码1改变的是elem,不会改变列表元素。

代码2改变的是alist[i],也就是列表元素,会改变列表元素。


  1. 也可以使用 for 按照范围生成下标, 按下标访问
alist = [1, 2, 3, 4]
for i in range(0, len(alist)):
    print(alist[i])

打印:

1
2
3
4

  1. 还可以使用 while 循环。手动控制下标的变化
alist = [1, 2, 3, 4]
i = 0
while i < len(alist):
    print(alist[i])
    i += 1

打印:

1
2
3
4

6. 新增元素

  1. 使用 append 方法, 向列表末尾插入一个元素(尾插)。
alist = [1, 2, 3, 4]
alist.append('hello')
print(alist)

打印:

[1, 2, 3, 4, 'hello']

  1. 使用 insert 方法, 向任意位置插入一个元素

insert 第一个参数表示要插入元素的下标。

alist = [1, 2, 3, 4]
alist.insert(1, 'hello')
print(alist)

打印:

[1, 'hello', 2, 3, 4]

什么是 “方法” (method)

方法其实就是函数。只不过函数是独立存在的, 而方法往往要依附于某个 “对象”。

像上述代码 alist.append , append 就是依附于 alist, 相当于是 “针对 alist 这个列表, 进行尾插操作”。

alist = [1, 2, 3, 4]
alist.insert(100, 'hello')
alist.insert(-100, 'hello')
print(alist)

打印:

['hello', 1, 2, 3, 4, 'hello']

7. 查找元素

  1. 使用 in 操作符, 判定元素是否在列表中存在,返回值是布尔类型。
alist = [1, 2, 3, 4]
print(2 in alist)
print(10 in alist)
print(10 not in alist)

打印:

True
False
True

  1. 使用 index 方法, 查找元素在列表中的下标,返回值是一个整数。
alist = [1, 2, 3, 4]
print(alist.index(2))

打印:

1

如果元素不存在, 则会抛出异常。

alist = [1, 2, 3, 4]
print(alist.index(2))
print(alist.index(10))

打印:

63ef4532be2aeadd336fbac2b6a907d3


8. 删除元素

  1. 使用 pop 方法删除最末尾元素
alist = [1, 2, 3, 4]
alist.pop()
print(alist)

打印:

[1, 2, 3]

  1. pop 也能按照下标来删除任意位置的元素
alist = [1, 2, 3, 4]
alist.pop(2)
print(alist)

打印:

[1, 2, 4]

  1. 使用 remove 方法, 按照值删除元素.
alist = [1, 2, 3, 4]
alist.remove(2)
print(alist)

打印:

[1, 3, 4]

9. 连接列表

  1. 使用 + 能够把两个列表拼接在一起。

    此处的 + 结果会生成一个新的列表。而不会影响到旧列表的内容。

alist = [1, 2, 3, 4]
blist = [5, 6, 7]
print(alist + blist)

打印:

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

  1. 使用 extend 方法, 相当于把一个列表拼接到另一个列表的后面。

a.extend(b) , 是把 b 中的内容拼接到 a 的末尾。不会修改 b, 但是会修改 a

alist = [1, 2, 3, 4]
blist = [5, 6, 7]
c = alist.extend(blist)  # extend是没有返回值的。
# 拿一个变量来接收一个没有返回值的方法的返回值就会返回None。类似于C里的NULL(空指针 ),或者Java里面的null(空引用)
print(alist)
print(blist)
print(c)

打印:

[1, 2, 3, 4, 5, 6, 7]  # alist
[5, 6, 7]  # blist
None  # 这是Python里面一个特殊变量的值,表示什么都没有

  1. 使用+=来进行拼接
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
a += b
print(a)
print(b)

打印:

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

虽然这里的+=操作和上面的extend操作有点像,但是本质上是不同的。

a+=b等价于a=a+ba+b会产生一个大的新的临时列表c,然后把c的值赋值给a,再去销毁c,相当于a的旧的值就不要了。

a.extend(b)则是直接把b的内容拼到了a的后面,更加高效,省去了数据拷贝和数据释放的过程。


10. 关于元组

元组的功能和列表相比, 基本是一致的。

  1. 元组使用 ( ) 来表示。
a = ()  # 方法1
b = tuple()  # 方法2
print(type(a))
print(type(b))

打印:

<class 'tuple'>
<class 'tuple'>

  1. 创建元组的时候,指定初始值
a = (1, 2, 3, 4)
print(a)

打印:

(1, 2, 3, 4)

  1. 元组中的元素也可以是任意类型的
b = (1, 2, 'hello', True, [])
print(b)

打印:

(1, 2, 'hello', True, [])

  1. 通过下标来访问元组中的元素。下标也是从0开始到 len - 1 结束。
a = (1, 2, 3, 4)
print(a[1])
print(a[-1])

打印:

2
4

a = (1, 2, 3, 4)
print(a[1])
print(a[-1])

打印:

1519a8b3bab82b303da56c9d810ba134


  1. 通过切片来获取元组中的一个部分
a = (1, 2, 3, 4)
print(a[1:3])

打印:

(2, 3)

  1. 元组也同样可以使用for循环等方式来进行遍历元素
a = (1, 2, 3, 4)
for elem in a:
    print(elem)

打印:

1
2
3
4

  1. 可以使用in来判定元素是否存在,使用index来查找元素的下标
a = (1, 2, 3, 4)
print(3 in a)
print(a.index(3))

打印:

True
2

  1. 可以使用+来拼接两个元组(本质上是创建一个新的大元组)
a = (1, 2, 3, 4)
b = (5, 6, 7, 8)
print(a + b)

打印:

(1, 2, 3, 4, 5, 6, 7, 8)

元组不能修改里面的元素, 列表则可以修改里面的元素

因此, 像读操作,比如访问下标, 切片, 遍历, in, index, + 等, 元组也是一样支持的。

但是, 像写操作, 比如修改元素, 新增元素, 删除元素, extend 等, 元组则不能支持。

另外, 元组在 Python 中很多时候是默认的集合类型。

  1. 当进行多元函数赋值的时候,其实本质上就是按照元组的方式来进行工作的 。

例如, 当一个函数返回多个值的时候:

def getPoint():
    return 10, 20
result = getPoint()  # 定义result本质上就是创建一个元组
print(type(result))

打印:

<class 'tuple'>

此处的 result 的类型tuple, 其实是元组。

问题来了, 既然已经有了列表, 为啥还需要有元组?

元组相比于列表来说, 优势有两方面:

你有一个列表, 现在需要调用一个函数进行一些处理。但是你有不是特别确认这个函数是否会把你的列表数据弄乱。那么这时候传一个元组就安全很多。

元组不能被修改->不可变对象。而不可变对象是可以哈希的。

马上要讲的字典, 是一个键值对结构。要求字典的键必须是 “可hash对象” (字典本质上也是一个hash表)。

而一个可hash对象的前提就是不可变,因此元组可以作为字典的键, 但是列表不行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【间接经验】高性能调度系统设计总结

原文 他人的间接经验 -> 自己的直接经验 调度模块在很多系统中都是常用的模块&#xff0c;比如实习生的每天签到邮件&#xff0c;预约银行的业务短信&#xff0c;学习通的上课通知&#xff0c;腾讯视频push中台的任务下发&#xff0c;调度系统在中间起到关键作用。 用户画像…

Python中的异或操作

你是否曾经想过,仅仅使用一个简单的符号就能实现数据加密、快速交换变量值,甚至是检测重复元素? 欢迎来到Python异或操作的神奇世界!在这篇文章中,我们将深入探讨这个看似简单却蕴含无限可能的位运算符。 无论你是刚入门的新手,还是想要提升算法技能的资深程序员,这篇文章都将…

每日一练4:牛牛的快递(含链接)

链接&#xff1a; 牛牛的快递_牛客题霸_牛客网 题目&#xff1a; 代码1&#xff1a; #include <iostream> using namespace std;int main() {double mo;char ch;int ret 0;cin >> mo >> ch;if(ch y) ret 5;ret 20;if(mo < 1){cout << ret;re…

LIN总线CAPL函数——计算PID(linGetProtectedID)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

了解依赖反转原则(DIP)、控制反转(IoC)、依赖注入(DI)及 IoC容器

这篇文章将描述 DIP、 IoC、 DI 和 IoC 容器。大多数情况下&#xff0c;初学者开发人员会遇到 DIP、 IoC、 DI 和 IoC 容器的问题。他们混淆在一起&#xff0c;发现很难辨别他们之间的区别&#xff0c;不知道为什么他们需要使用他们。另一方面&#xff0c;很多人使用 DI&#x…

YOLOv8改进实战 | 注意力篇 | 引入基于跨空间学习的高效多尺度注意力EMA,小目标涨点明显

YOLOv8专栏导航&#xff1a;点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习&#xff0c;并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOT…

Centos安装配置Gitea(Ubuntu等系统也可参考)

准备工作 安装好宝塔面板&#xff0c;再进入宝塔面板安装好MySQL&#xff0c;添加配置一个MySQL数据库gitea&#xff0c;用户名和密码也为gitea &#xff08;也可用命令行做相关操作&#xff0c;自行搜索教程&#xff09; 通过终端下载安装git&#xff0c;添加普通用户git&a…

数据库管理-第238期 23ai:全球分布式数据库-架构与组件(20240904)

数据库管理238期 2024-09-04 数据库管理-第238期 23ai&#xff1a;全球分布式数据库-架构与组件&#xff08;20240904&#xff09;1 架构图2 分片数据库与分片3 Shard Catalog4 Shard Director5 Global Service6 管理界面总结 数据库管理-第238期 23ai&#xff1a;全球分布式数…

效率升级,创意无限:2024年必备录屏软件

随着科技的飞速发展与用户需求的多元化趋势&#xff0c;录屏软件市场迎来了前所未有的繁荣景象&#xff0c;各种功能强大、特色鲜明的软件如雨后春笋般涌现。今天&#xff0c;我们将聚焦于那些如同obs录屏般&#xff0c;能够提供快捷操控体验的专业录屏工具。 1.福昕录屏大师 …

第L5周:机器学习:决策树(分类模型)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1. 决策树算法是一种在机器学习和数据挖掘领域广泛应用的强大工具&#xff0c;它模拟人类决策过程&#xff0c;通过对数据集进行逐步的分析和…

Chrome 浏览器插件获取网页 window 对象(方案二)

前言 最近有个需求&#xff0c;是在浏览器插件中获取 window 对象下的某个数据&#xff0c;当时觉得很简单&#xff0c;和 document 一样&#xff0c;直接通过嵌入 content_scripts 直接获取&#xff0c;然后使用 sendMessage 发送数据到插件就行了&#xff0c;结果发现不是这…

Python(TensorFlow)和MATLAB及Java光学像差导图

&#x1f3af;要点 几何光线和波前像差计算入瞳和出瞳及近轴光学计算波前像差特征矩阵方法计算光谱反射率、透射率和吸光度透镜像差和绘制三阶光线像差图和横向剪切干涉图分析瞳孔平面焦平面和大气湍流建模神经网络光学像差计算透镜光线传播几何偏差计算像差和像散色差纠正对齐…

【unity实战】利用Root Motion+Blend Tree+Input System+Cinemachine制作一个简单的角色控制器

文章目录 前言动画设置Blend Tree配置角色添加刚体和碰撞体代码控制人物移动那么我们接下来调整一下相机的视角效果参考完结 前言 Input System知识参考&#xff1a; 【推荐100个unity插件之18】Unity 新版输入系统Input System的使用&#xff0c;看这篇就够了 Cinemachine虚…

嵌入式全栈开发学习笔记---C++(函数/类模板)

目录 函数模板 模板机制 函数模板语法 函数模板和普通函数的区别 函数模板和普通函数调用规则 函数模板机制 排序模板函数 类模板 类模板语法 模板继承 类模板中的static关键字 模板声明 .hpp文件 类模板小结 上节学习了运算符重载&#xff0c;本节开始学习函数模…

使用 GZCTF 结合 GitHub 仓库搭建独立容器与动态 Flag 的 CTF 靶场+基于 Docker 的 Web 出题与部署+容器权限控制

写在前面 关于 CTF 靶场的搭建&#xff08;使用 CTFd 或者 H1ve&#xff09;以及 AWD 攻防平台的搭建&#xff0c;勇师傅在前面博客已经详细写过&#xff0c;可以参考我的《网站搭建》专栏&#xff0c;前段时间玩那个 BaseCTF&#xff0c;发现它的界面看着挺不错的&#xff0c…

LVGL 控件之复选框(lv_checkbox)和下拉列表(lv_dropdown)

目录 一、复选框1、组成2、设置复选框文本3、复选框部件的状态4、复选框事件5、API 函数 二、下拉列表1、组成2、选项2.1 添加选项2.2 获取当前选中的选项 3、设置3.1 设置列表展开方向3.2 设置下拉列表图标3.3 设置列表常显文本 4、事件5、API 函数 一、复选框 1、组成 复选…

Android studio 导出 release 版本的 .aar 文件

不同的android studio 版本可能会有不同的方案&#xff0c;我针对的是&#xff1a; 首先打开settings: Setting —> Experimental 界面 将选项&#xff1a;【configure all gradle tasks】勾上&#xff1a; 接着点击 File —> Sync Project with Gradle Files 然后&…

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

【颤抖不再怕,帕金森患者的活力锻炼秘籍!】

Hey小伙伴们~&#x1f44b; 今天我们来聊聊一个温暖而重要的话题——如何帮助我们的亲人或自己&#xff0c;在帕金森病的挑战下&#xff0c;依然保持生活的活力与光彩&#xff01;&#x1f308; 帕金森病&#xff0c;这个名字听起来或许让人心生畏惧&#xff0c;但它绝不是生活…

地产行业如何利用Java实现精准营销

在当今竞争激烈的地产市场中&#xff0c;如何有效触达潜在客户并促进销售转化&#xff0c;成为众多房企关注的焦点。106短信平台作为一种精准的营销工具&#xff0c;在地产行业中发挥着越来越重要的作用。 支持免费对接试用&#xff1a;乐讯通PaaS平台 找好用的短信平台,选择乐…