Python可迭代对象(1)---从C++开发者学习python日记

news2024/11/14 20:22:09

目录

1。什么是可迭代对象?

2。列表(list)

列表的创建

列表基本操作

以上全部代码的总运行结果

列表脚本操作符

列表常用的方法和函数

列表推导式

​编辑列表的嵌套

以上全部代码的总运行结果

复习列表内容

3。元组(tuple)

元组的基本运算

元组的方法

以上所有代码运行结果


1。什么是可迭代对象?

2。列表(list)

列表的创建

#以C++的角度理解python
#列表(list)
#2.1列表是一种有序、可变序列,可以包含任意类型的元素。
#创建列表可以使用列表list函数(),也可以变量 = []的形式
#1.创建一个空链表

ret1 = list()#返回值给到ret1
ret2 = []
print(f'{ret1 = }, {ret2 = }')
#上面这个打印方法在Python中,print(f'') 是格式化字符串(f-string)的语法。
#它允许你在字符串中嵌入表达式,这些表达式在运行时会被其值所替换。f 或 F 前缀表示这是一个格式化字符串字面量。
#在 f'' 或 F'' 中的大括号 {} 内,你可以放入任何有效的Python表达式。
#当 print 函数执行时,这些表达式会被求值,并且其结果会被插入到字符串的相应位置。
#这个语法有点奇怪,f""也是可以的,取决于你要打印的类型是字符串还是字符
print(f'{ret1}, {ret2}')
#当{}里面遇到变量=或者函数=时,等号的左边在解析时会被保留,连同着等号右边被解析的东西一起被保留下来
#如果f-string表达式的{}里面没有=,那只会运算表达式的内容(值), 字符和字符串不需要加'',打印不会出现""都只会有''

str='union'
str55="dfggthth"
print(f'{str[::-1]=}')
print(f'{str[::-1]}')
print(f'{str55 = }')
print(f"{str55}")
print(f'{str=}')
lst=[1,2,3]
print(f'{lst.reverse()=}')#reverse()方法没有返回值,输出其返回值,但对原列表反向排序。#lst.reverse()=None
print(f'{lst=}')
print()
lst1 = [1, 2, 3]#列表

for item in lst1:#相当于范围for, for循环结尾有一个:
print(item)

ret3 = list('hello')#list函数,列表函数,转换成列表
print("lit1 =", ret3)
ret4 = list("hello bit")#list函数将参数对象转换成列表
print("ret4 = ", ret4)
#经过打印可以发现,列表存储字符串的方式是逐字母存储的,一个字母存一个空间
ret5 = [1, 2, 3, 'r']
print(f'{ret5 = }')
print(f"{ret5 = }")
#无论是用f''或者f""格式化打印都没有什么问题, 随便选一种都可以
a = 5
print(f"hhdhhcdsich addf ddef {a}")
print(f'hhdhhcdsich addf ddef {a}')
##无论是用f''或者f""格式化打印都没有什么问题, 随便选一种都可以


列表基本操作


ret5 = [1, 2, 3, "apple", "banaban", 'dafd']#直接使用[]赋值相当于C++的可变参数列表Args... args, 放什么类型的数据都可以
ret6 = ['how', 'are', 'you']
for item in ret6: #类似于C++11的范围for注意:
print(item, end = '%')#如下
print(item, end = ':')#每一次打印的结尾换行被:占了,所以就没有换行了
print(item)
#print()#属于单个for语句包含的语句要对齐, 空的print语句仍然保留自动换行的属性,这里起到自动换行的作用
#print()#这个没有和for里面的语句对其所以不属于for语句里面的东西
#所以这个的意思是等for语句执行完后再打印的换行

#使用enumerate()函数遍历列表同时获得每个元素的索引(下标值)和元素值(列表中对应下标的对应的元素的内容)
#获取打印出来的格式为:下标 元素值 ———和C++一样下标也是从0开始的

for ideax, itea in enumerate(ret6):#一个负责获取下标一个负责获取元素值,多个变量中间用,隔开
print(ideax, itea)#for循环里面的语句千万不要置顶写, 语法规定不能
#访问列表元素的基本操作

ret7 = [1, 2, 3, "apple", "banaban", 'dafd']
print(ret7[0])#取列表从左往右的第1个元素
print(ret7[2])#取列表从左往右的第3个元素
#print(ret7[11])#越界了
#print(ret7[9])#越界了
#print(ret7[7])#越界了
print(ret7[-1])#下标为负数时是从最右边往下标为0的数,也就是如果是-1,那就是从右往左数的第一个
print(ret7[-2])#从右往左的第2个
##print(ret7[-100])#越界
#由上面的访问-100,11,7,9下标都越界报错了,可以看出python列表的越界检查不是抽样式的,而是抛异常式的,这一点像C++的array
#添加元素到列表的操作
ret8 = [1, 2, 3, "apple", "banana"]
ret9 = [8, "hdggf"]
ret8.append('ret')#append的作用是在列表末尾添加一个元素
print(ret8)
ret8.insert(1, "hehe")#insert的作用是在指定位置插入一个元素,这个指定的位置不能为空(这里和C++就不一样了)
print(ret8)
ret8.extend(ret9)#extend的作用是将另一个列表的所有元素添加到当前列表的末尾
print(ret8)
ret8.extend(["hehe"])#可以传右值(C++)
print(ret8)

#删除列表元素
print()
ret10 = [1, 2, 3, "apple", "banana", 'uhdcv', 4, 8]
ret10.pop(0)#pop的作用是删除指定下标位置的元素
print(ret10)
ret10.pop(1)
print(ret10)
print(ret10[0])
print(ret10[1])
#由上面代码执行逻辑可以发现, 每次删除后,各元素下标都会重新按正常的顺序排布
ret10.remove("banana")#remove的作用是删除指定的元素,这个元素需要列表里面有的,不然会报错
#ret10.remove(100)

print(ret10)
ret10.clear()#clear的作用是删除列表的所有元素
print(ret10)

ret11 = [1, 2, 3, "apple", "banana", 'uhdcv', 4, 8]
del ret11#del的作用是删除整个列表
#print(ret11[2])#列表被del后就彻底消失了,这时就取不到列表里面的元素了
# lst1 = [1, 2, 3, 44, 5, 7, 8, 9, 10, 11, 12, 13, 34, 45, 99]
# lst2 = lst1[1:8:2]
# lst3 = lst1[-1:-8:-2]#步长默认缺省值为1
# lst4 = lst1[-1:-9]#步长默认缺省值为1

以上全部代码的总运行结果

列表脚本操作符([:::])

lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = lst1 + lst2#连接操作符+, 用于将两个链表连接在一起,也就是相当于将一个链表尾插到另一个列表当中
print(lst3)

lst4 = lst1 * 3#重复操作符*,用于将一个链表的全部元素按原顺序重复n次
print(lst4)#重复3次

print(f"{3 in lst1 = }")#成员关系操作符(in/not in): 判断成员变量是否在列表中,输出一个bool值(False/True)
print(f"{5 in lst1 = }")
print(f"{5 not in lst1 = }")
# while 5 not in lst1:#可以作为循环判断的条件
# print("hehe")
print()
#[::]切片操作,用来访问一个列表的子集
#切片运算符的语法:object [start : end : step]
#✓ start: 切片开始位置,省略时默认为起点或终点,由step正负决定。
#✓ end: 切片结束(但不包含)位置,(默认为列表长度)。
#✓ step: 切片的步长,可正,可负,(默认为1)。step正负号决定了切取方向,切记!#从C++的角度就是相当于步长给了一个缺省值,然后可以不写的,直接使用缺省值
#从开始位置的元素开始取,隔n个下标取一个元素
# 切片操作不会因为下标越界而
# 抛出异常,而是在列表尾部截
# 断或返回一个空列表,代码具
# 有更强的健壮性。


lst5 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ret1 = lst5[::1]
ret2 = lst5[3:8:2]
ret4 = lst5[-3:-8:2]#需要全部同号才能正确取到,头尾步长三个的方向一致才可以进行
ret5 = lst5[-3:-8:-2]#负的下标是从-1开始的
ret3 = lst5[3::2]
ret6 = lst5[3:]#下标为3之后的元素自行截断
ret7 = lst5[::-1]#逆序遍历所有元素
print(ret1)
print(ret2)
print(ret3)
print(ret4)
print(ret5)
print(ret6)
print(ret7)
print()

列表常用的方法和函数


lst7 = ['a', 'z', 'd', 'f', 'g', 'A']
lst8 = [1, 2, 6, 5, 3, 99, 78]
lst8.sort()#sort默认升序
print(lst8)
#print(lst8.sort())#不可以直接这么写,因为没有返回值,所有会直接输出None
print(f"lst7.sort() = {lst8}")

lst9 = [9, 7, 6, 5, 4, 3, 17, 15, 13, 11]
print(sorted(lst9))#内置函数sorted默认升序,使用内置函数sorted()对列表进行排序,并返回排序后的新列表;但原列表不变。
print(sorted(lst9, reverse = True))#降序排序, 一看就懂了,就是在原本升序排完之后再确认是要反转一下
print(lst9)
print()
#sum作为内置函数起到将内部的所有元素取和的作用
print(sum(range(1, 11)))#sum()函数的start参数默认为0
print(sum(range(1, 11), 5))#指定start参数为5,等价于5+sum(range(1,11)), range(i,j)相当于生成从[i, j)(左闭右开)的连续整数

ret11 = [1, 2, 2, 2, 2, 2, 3, 4, 'a', 'b', 'a', 'c', 'f']
print("hello python")
#index的作用是返回列表中第一个值为x的元素的下标,若不存在值为x的元素则抛出异常
print(ret11.index(1))
print(ret11.index('a'))
#ret11.index(100)#ValueError: 100 is not in list
#count的作用是返回指定元素x在列表中的出现次数
print(ret11.count('a'))
#reverse的作用是对列表所有元素进行逆序排列,无返回值
ret11.reverse()
print(ret11)
#copy的作用是返回列表的浅复制(相当于C++的浅拷贝)---copy可以将原列表复制到新的列表对象, 返回一个新的对象
ret12 = ret11.copy()
print(f'{ret12 = }')
print(ret12.copy())


列表推导式


#一般格式:[expression for item in iterable [if condition]]
#➢expression:表示在迭代过程中对每个元素执行的操作或表达式。
#➢item:表示可迭代对象中的每个元素。
# ➢iterable:表示可迭代对象,例如列表、元组或集合。
# ➢condition:(可选) 表示条件,只有满足条件的元素才会被包含在结果列表中。


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ret9 = [x**2 for x in numbers if x % 2 == 0]#可以这么理解,每一个可以通过条件if的并且可以在指定循环的列表或者range中取到的元素x都需要
#执行for前面的语句,然后得出的最终值存储在新列表中,所以列表推导式的返回值是列表对象
#x**2的意思是x的平方, n**m的意思是n的m次方

print(ret9)
ret10 = [x * 5 for x in range(5)]#range的默认起始值是0,所以根据左闭右开原则,range(i) 的范围就是0到i - 1
print(ret10)
#if条件只是起到约束列表取值的条件,所以可以省略

print(sum([2**x for x in range(64)]))



列表的嵌套


◆ 列表嵌套是指在一个列表中包含另一个或多个列表。这样做可以创建多维结构的列表。 ◆ 例如:学生的成绩单grades 列表包含了三个子列表,分别表示每个学生的成绩。 grades = [ ["Alice", 85, 90, 92], ["Bob", 78, 82, 80], ["Charlie", 90, 95, 88] ] ◆ 通过列表嵌套,可以方便地访问和操作多维数据。例如,思考 grades[1][2] = ? ◆ 列表嵌套还可以进一步嵌套,形成更复杂的数据结构。例如,可以在每个学生的成绩列 表中再嵌套一个列表,表示每个科目的具体信息,如考试日期、教师等。 ◆ 列表嵌套是一种灵活且强大的数据结构,可以在编程中用于表示和处理复杂的数据关系。

#学生的成绩单grades 列表包含了三个子列表---就是列表里面有列表,相当于二维数组
garden = [["dadf", 1, 2, 3], ["dedf", 1, 3, 4, 5], ["edrrvg", 4, 5, 66, 7]]
print(garden)
print(garden[1][2])#3

以上全部代码的总运行结果

复习列表内容

3。元组(tuple)

# ◆ 元组:有序、不可变的元素序列。(不可变,意味着一旦创建就不能修改)
# ◆ 元组创建:通过圆括号 () 或 tuple()函数来创建。
# ◆ 访问元组元素(可使用索引、切片或for循环遍历):
# ➢ tup[index]: 通过指定索引index访问元组tup中的特定位置的元素。
# ➢ tup.index(x): 返回tup中第一个值为x的元素的下标,若x值不存在则抛出异常。
# ➢ tup[star:stop:step]: 使用切片操作(slicing), 获取元组的子元组。
# ➢ for item in tup:遍历元组中的所有元素。
# ◆ 成员身份判断:in,not in. 例如,if 'apple' in ('apple', 'banana', 'orange’):


元组的创建


# ❖ 元组一旦定义就不允许更改。
# ❖ 元组没有append()、extend()和insert()等方法,无法向元组中添加元素。
# ❖ 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能
# 从元组中删除元素。
# ❖ 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,
# 那么一般使用元组而不用列表。
# ❖ 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
# ❖ 元组可用作字典的“键”,也可以作为集合的元素。列表不能作为字典的“键”,
# 包含列表、字典、集合或其他类型可变对象的元组也不能做字典的“键”。


x = (1, 2, 3, 4)#相当于C++的隐式类型转换,将=左边的未知类型转换成右边的元组类型
print(x.index(1))#通过指定索引index访问元组x中的特定位置的元素。
print(x[1])#通过指定索引index访问元组x中的特定位置的元素。
y = tuple((1, 2, 3, 4, 5, 6, 7, 8, 9))#注意双括号, 里面这个表示元组, 在使用中可以发现这个函数非常鸡肋

print(y[0:5:2])#使用切片操作(slicing), 获取元组的子元组。
for i in y:#遍历元组中的所有元素。
print(i**2, end = '%')
print();
# while 1 in y:#成员身份判断
# print("hehe")

if 1 in y:
print("hehe")
else :
print("haha")

if 1 not in y:
print("hehe")
else :
print("haha")
print()
# ❖ 元组一旦定义就不允许更改。
# ❖ 元组没有append()、extend()和insert()等方法,无法向元组中添加元素。
# ❖ 元组没有remove()或pop()方法,也无法对元组元素进行del操作,不能
# 从元组中删除元素。
# ❖ 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,
# 那么一般使用元组而不用列表。
# ❖ 元组对不需要改变的数据进行“写保护”将使得代码更加安全。
# ❖ 元组可用作字典的“键”,也可以作为集合的元素。列表不能作为字典的“键”,
# 包含列表、字典、集合或其他类型可变对象的元组也不能做字典的“键”。

#元组中如果包含的可变对象,那可变对象仍然可变

ret1 = ([1, 2, 3], 4, 5)
#如果元组中包含列表或其他类型的可变对象,这些对象是可变的,但对元组元素
#的直接引用仍是不可变的。
#简单来说就是,如果元组元素直接放置在=左边称为直接引用修改,虽然是可变对象,那还是会被识别为元组的元素,就不可以修改了

注意一下上图的错误信息:
ret1[0][0] = 10#把元组想象成数组就可以了,这里是两个数组的嵌套
print(ret1)
ret1[0].append(4)
print(ret1)
# ret1[0] += [0]
# print(ret1)


print()
ret2 = (1, 2, 3, 4, 'a','a', 'b','b', 'b', 'c')
#访问元组中的元素---通过下标访问
print(ret2[0])
print(ret2[4])


元组的基本运算


print(len(ret2))#len的作用是获取元组的长度
print(ret2 + (1, 2, 3))#拼接元组---相当于尾插一个+后面的元组
print(ret2 * 2)#重复元组使其连续打印出n份


元组的方法(index, count)


print(ret2.index('a'))#index的作用是获取这个元素第一次出现在元组中的下标仅一次
print(ret2.count('b'))#count的作用是获取这个元素在元组中出现的次数

以上所有代码运行结果

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

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

相关文章

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

快速了解使用路由器

插槽的使用和用法:slot 为什么要使用插槽: 在Vue.js等前端框架中 在Vue.js等前端框架中,插槽(Slot)是一种强大的工具,允许开发者在组件之间动态地传递和呈现内容。使用插槽的主要原因包括: …

【LTW】Domain General Face Forgery Detection by Learning to Weight

文章目录 Domain General Face Forgery Detection by Learning to Weightkey points方法LTW元分割策略学习过程损失函数实验评价结果消融实验总结Domain General Face Forgery Detection by Learning to Weight 会议:AAAI-21 作者: code: https://github.com/skJack/LTW 上…

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template><view class""><scroll-view scroll-y"true" class&…

2024 离线ASR和TTS推荐与示例

2024 离线ASR和TTS推荐 文章目录 2024 离线ASR和TTS推荐一、前言二、安装与使用1、EdgeTTS的安装和使用&#xff08;1&#xff09;Edge TTS介绍与效果试听&#xff08;2&#xff09;Edge TTS安装&#xff08;3&#xff09;Edge TTS查看支持的音色&#xff08;4&#xff09;Edge…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

MySQL:事务的ACID特性隔离级别脏读/不可重复读/幻读/Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned&#xff0c;你需要搜索打开Window PowerShell ISE&#xff0c;并以管理员身份打开&#xff0c;输…

图结构感知的Transformer:一种新的图表示学习方法

人工智能咨询培训老师叶梓 转载标明出处 尽管图神经网络&#xff08;GNNs&#xff09;在处理图数据方面取得了显著成就&#xff0c;但它们在表达能力和捕获长距离依赖方面存在局限性。为了突破这些局限&#xff0c;研究者们开始探索将Transformer架构应用于图表示学习。在此基…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目&#xff0c;并安装依赖项 npm install 等待完成后&#xff0c; 安装electron npm install --save-dev electron 等待完成后&#xff0c; 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

从零开始一个git操作实例,图文并茂

徒弟不懂git怎么用&#xff0c; 于是写了篇文章&#xff0c; 把本地git操作从头写了一遍&#xff0c; 自己去看吧&#xff01; 0、基本概念 •Git是一个免费、开源的、分布式版本控制系统 •它使用一个特殊的叫做仓库的数据库来记录文件的变化 •仓库中的每个文件都有一个…

ccfcsp-202406(1、2、3、4、5)

矩阵重塑&#xff08;其一&#xff09; #include <bits/stdc.h> using namespace std; int main() {int n,m,p,q;cin >> n >> m >> p >> q;vector<int> vec(n * m);vector<vector<int>> res(p, vector(q,0));int k 0;for(in…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

HarmonyOS---权限和http/Axios网络请求

网络请求(http,axios) 目录 一、应用权限管理1.1权限的等级1.2授权方式1.3声明权限的配置1.4如何向用户进行申请 二、内置http请求使用三、Axios请求使用&#xff08;建议&#xff09;3.1 使用方式一3.2 使用方式二&#xff08;建议&#xff09; 一、应用权限管理 应用权限保护…

git仓库服务器端损坏如何用本地code重新部署

文章目录 1. **在新服务器上创建一个新的 Git 仓库**2. **将本地仓库推送到新服务器**2.1. 添加新服务器为远程仓库2.2. 推送代码和历史记录2.3. 推送 tags&#xff08;如果有 tags&#xff09; 3. **在新服务器上拉取代码并部署**4. **确保修改记录和历史完整**5. **可选&…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境&#xff0c;然后将 jobId 添加到 slf4j 的 MDC 容器中&#xff0c;随后任务输出的日志都将附带 joid。 MDC 介绍如下&#xff1a; MDC ( Mapped Diagnostic Contexts )&#xff0c;它是一个…

Linux 线程互斥

文章目录 3. Linux 线程互斥3.1 相关概念3.2 互斥量mutex3.3 互斥量的接口3.4 改进3.2中的代码3.5 互斥量&#xff08;锁&#xff09;的原理3.6 封装一下原生锁的接口&#xff0c;RAII风格的锁3.7 可重入 和 线程安全 3. Linux 线程互斥 3.1 相关概念 临界资源&#xff1a;多…

web自动化学习笔记

目录 一、web自动化测试环境搭建二、web自动化测试第一个脚本三、selenium 8种定位方式3.1、通过id定位3.2、通过name定位3.3、通过tag_name&#xff08;标签名&#xff09;定位3.4、通过class值进行定位3.5、通过链接文本定位3.6、通过部分链接文本定位3.7、通过xpath定位3.8、…

MySQL:SQL语句执行过程

本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程&#xff0c;包括 SQL 的查询在 MySQL 内部会怎么流转&#xff0c;SQL 语句的更新是怎么完成的。 在分析之前我会先带着你看看 MySQL 的基础架构&#xff0c;知道了 MySQL 由那些组件组成以及这些组件的作用是什么&#xf…

Spring_AMQP

文章目录 一、SpringAMQP二、SpringAMQP应用2.1、消息发送2.2、消息接收 一、SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址。 SpringAMQP提供了三个功能&am…