Python组合数据类型(一)

目录

一、数据类型

1、基本数据类型

2、组合数据类型

二、介绍两个函数

1、 isinstance函数

2、len函数

三、Python指针

1、指针

2、is运算符和==的区别

3、列表的指针

四、函数参数的传递

1、例子一

2、例子二

五、字符串详解

1、转义字符

2、字符串的切片

3、字符串的分割

①初级分割

②高级分割

4、字符串函数

5、字符串编码

6、字符串格式化

六、元组

1、元组的一些特点

2、元组元素的指针

3、元组赋值

4、元组的大小比较

七、用元组取代复杂分支结构


一、数据类型

在Python中主要有两种数据类型

1、基本数据类型

基本的数据类型包括:int(整型),float(浮点型),complex(复数)

2、组合数据类型

组合的数据类型包括:str(字符串),tuple(元组),list(列表),dict(字典),set(集合)

二、介绍两个函数

1、 isinstance函数

isinstance(x,y)函数用于查询数据x是否含有类型y

a = "1233456"
print(isinstance(a,str))
print(isinstance(a,int))

2、len函数

len()函数用来求组合数据类型的元素个数(长度)

a = ["123" , "hello" , "scy"]
b = "hello!!!"
print(len(a))
print(len(b))

三、Python指针

Python中,指针是一个非常重要的概念,在很多的编程语言中,都会涉及到指针,或者类似于指针的概念,而它之所以叫做指针,那么它就会像一个箭头一样,必然会指向某个地方。

1、指针

在Python中,所有的变量都是指针,也就是说,Python中所有可赋值的东西,即出现在赋值符号“=”左边的东西,都是指针

并且我们还要注意几点:

①指针即代表着内存单元的地址

②我们可以把Python的指针理解为一个“箭头”,所有的变量都是箭头,指向了内存的某个地方

③对变量进行赋值的本质,就是让这个变量(箭头)指向某个地方

当我们对变量进行赋值时,就是相当于让变量指向某处:

a = 3
b = 4

在内存中,就是这样:

当我们用一个变量对另一个变量进行赋值时,就是相当于让两个变量指向了同一个地方:

a = b

在之前的文章我们提到过,这里的“a = b”的含义相当与“把b的值赋给a”,也就是说此时a和b都等于“4”了,那么它在内存中就会变成:

2、is运算符和==的区别

当a is b 为True时,说明a和b是指向同一个地方

当a == b 为True时,说明a和b指向的地方放着相同的东西,但是a和b不一定指向相同的地方

当我们使用a = b 时,会使得a 和 b 指向同一个地方

下面我们来写一个代码证明一下:

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

我们这串代码在内存中应该是这样的:

所以结果就是:

注意!

对于int、float、complex、str、tuple类型的变量a和b,只需要关注a==b是否成立即可,因为这些数据本身不会更改,不会出现a的数值改变了,b的数值也跟着改变。

对于list、dict、set类型的变量a和b,a==b和a is b的结果都需要关注,因为这些数据本身会改变,改变了a指向的内容,b也许也会改变

3、列表的指针

列表的元素也可以赋值,因此也是指针,所以前面那张图更准确的来说应该是这样的:

四、函数参数的传递

函数参数的传递方式都是传值,也就是说形参是实际参数的一个拷贝,函数的参数也是指针,形参和实参指向了同一个地方,对形参赋值(让形参指向别的位置),不会影响实参

1、例子一

下面我们来看一个例子:

def Swap (x,y) :tmp = xx = yy = tmpreturn x,y
a = 4
b = 5print(Swap(a,b))
print(a,b)

我们来仔细观察这两个输出:

我们发现在这个Swap函数中,a和b的数值确实是被调换了,但是当我们输出a和b本身的数值的时候,发现本身没有改变,我们下面用一张图来解释一下:

当我们执行了tmp = x之后:

当我们再执行x = y 时,此时x的那个红箭头就指向了“5”,当我们再执行y = tmp的时候,就是让y的红色箭头指向了“4”,此时,我们就实现了参数的互换。

但是当我们用变量a和b去调用参数时,相当于把参数a和b附在了x和y上面,然后在函数体内部x和y实现了转换时,输出的“Swap(a,b)”实现了转化。

但是根据上述的步骤我们发现,从始至终a和b本身的值都没有发生变化

2、例子二

当我们在函数执行的过程中,改变了形参指向的地方的内容,则实参所指向的地方的内容也会发生改变:

def Swap (x,y) :tmp = x[0]x[0] = y[0]y[0] = tmpreturn x,y
a = [4,5]
b = [6,7]print(Swap(a,b))
print(a,b)

我们来看一下输出的结果:

我们发现直接输出a和b他们的数值居然也发生了变化,我们来看一下下面的图:

当我们执行了tmp = x [0]

当我们再执行x[0] = y[0] 时,x[0]变成了“6”,当我们执行y[0] = tmp时,y[0]变成了“4”,相信你们已经发现了区别,我们这次并没有改变红色的箭头(指针),而是改变了这些指针所指向的位置的内容,这时这两个就都会被改变了。

五、字符串详解

1、转义字符

我们在输入print(“......”)中的文字或符号时,可能会想输出一些特殊的符号,但是这些符号可能会被编译器识别为其他的字符,导致我们输出了不符合的东西,那么我们该怎么输入呢:

我们先来看几个简单的转义字符:

转译前转译后
\n换行
\t制表符
\"双引号
\\斜杠

我们现在来看看代码:

print ("hello\nworld\thello\"world\"yes\\")

输出:

我们有时候不希望“\”实现被转译的功能,想让他就当作一个普通字符输出,那么我们可以在“引号”前面加一个字母r

print (r"hello\nworld\thello\"world\"yes\\")

我们可以发现,里面所有的转义符都不起作用了

2、字符串的切片

字符串的切片,也叫子串(即字符串某连续的一部分

我们在Python中会用a[x:y]来对字符串进行切片,会从a[x]切到a[y](不包含a[y]的那个字符)那一部分的子串

注意!

①字符串切片是一个左闭右开的区间

②a[x: ]:终点省略就是一直取到最后一个字符

③a[ :y]:起点省略就是从第一个字符开始取

④a[x : y : z]:会从a[x]切到a[y](不包含a[y]的那个字符),但是是每z个字符取一个,最后拼起来,若z为负数,就代表倒着取

⑤x和y可以都省略,就代表从头取到尾,或者从尾取到头(看z的正负)

⑥字符串切片的用法也适用于元组和列表

3、字符串的分割

①初级分割

在之前我们提到过,我们在Python中,可以用x.split()函数对字符串x进行分割,但是我们函数的括号里是什么都没有的,这就意味着我们是默认用空白字符(空格、制表符、换行符、回车符等)来对字符进行分割的,我们其实可以在()中添加一个字符,用这个字符来作为分割符,两个相同的分隔符之间会被分割出来一个空串

看一个例子:
 

s = "helloxxxworldxxx!!!xxx!!!"
a = s.split("xxx")
print(a)

我们用“xxx”作为分割符,对字符串s进行分割:

它会根据分隔符,把字符串进行分割,并把各个子串放到一个列表中输出。

②高级分割

在上面的分割方法中,我们只能让某一固定的字符or子串作为分隔符,对字符串进行分割,或者用那几个空白字符,但是如果我们想要把一个文章进行分割,那么就需要根据文章里面所有的标段符号来进行分割,所以我们需要同时针对多个字符作为分隔符来分割文章:

我们在这里会导入re包来进行这个操作:

例子:

import rea = "hello,my name is Sue! Good morning ! hello : world ?? "
b = re.split(':|,|!|\?' ,a)
print(b)

我们把字符串a中的所有的标点作为分隔符来进行分割

来看看效果:

4、字符串函数

在Python中有很多关于字符串的函数:

s.count(x):求字符串s中x出现的次数

len(s):求字符串s的长度

s.upper()  /  s.lower():把字符串中的字符转化大写 / 小写

s.find(x)  /  s.index(x):查找字符串s中是否含有x

①rfind()和rindex()函数用于用字符串的尾部开始查找

②虽然这两个都是关于查找的函数,但是略有一点不同,即在于这两个函数在遇到错误时的返回值不同

我们下面来用代码看一下:

先用find函数来查找一个字符串中不包含的子串:

s = "hello world!"
a = s.find("scy")
print(a)

find函数发现字符串中不包含所要查询的子串时,会返回-1

当我们用index函数进行同样的操作时,我们会发现有不一样的结果:

s = "hello world!"
b = s.index("scy")
print(b)

程序最终会报错!

利用这个特点我们可以结合前面说到的异常处理,用try和except,这样当报错时进行对应的代码执行

s = "hello world!"try :b = s.index("scy")
except Exception as e :print(e)    #将异常对象存储在变量e中

输出:

③find函数还可以从指定的起点查找:

s = "hello world!"
a = s.find("he" , 2)
#从下角标为2的元素开始查找he子串
print(a)
#输出为-1

s.replace(x,y):把字符串s中的x都替换成y

isdigit():判断字符串是否是数字

islower() / isupper() :判断字符串中是不是都是小写 / 大写

startswith() /  endswith():判断字符串是否以某一个子串开头or结尾

strip():去除字符串头尾的空白字符

lstrip():去除字符串左端的(头部的)空白字符

rstrip():去除字符串右端的(尾部的)空白字符

5、字符串编码

字符串的编码在内存中的编码是Unicode的,写入文件时,可能是gbk或者utf-8

ord():字符转化为编码

chr():编码转化为字符

6、字符串格式化

我们下面会介绍两种格式化方法:

①使用format

a = "hello {0} {1:10}, you get ${2:0.4f}".format("Mr.","Mike",6.2)
print(a)

输出:

{0}代表选取后面下角标为0的元素

{1:10}代表选取下角标为1的元素,并且总共要占10个字符宽度(宽度是10),不足10个就用空格补全

{2:0.4f}代表选取下角标为2的元素,宽度是0,并且要保留四位小数

②使用%

print("Today is %s. %d." %('May' , 21))

六、元组

元组和列表在很多地方都有相似之处,我们下面会来详细的了解一下元组:

1、元组的一些特点

一个元组是由数个逗号分割的值组成,前后可加括号

a = 123456 , 000 , "hello"

这就是一个简单的元组,和列表相似,里面可以是数字,也可以字符串

如果我们想创建一个空元组,直接写一个括号即可

注意在代码中区分字符串和元组,如果末尾有逗号,就是元组,没有就是字符串,如果区分错误,可能会导致我们某些数据分析错误

来看一个简单的例子:

a = "hello" ,
b = "hello"
print(type(a))
print(type(b))
print(len(a))
print(len(b))

输出:

可以看到,仅仅是一个逗号的差别,就是两个不同的数据类型,因为数据类型的不同,所以他们的某些数据也会不一样,比如说测量其长度(见上)

我们可以用之前遍历查找列表中的元素一样,对元组的元素进行查找,但是元组有以下的一些特殊之处:

元组不能修改,即不可增加,删除元素,不可对元素进行赋值,不可改变元素的顺序

a = 123456 , 000 , "hello"
a[0] = 5

像上面的这个例子,最终会导致程序报错,因为元组中的元素是不可以被修改的

我们虽然不能修改元组的元素,但是我们可以用加号把两个元组进行连接

2、元组元素的指针

我们现在已经知道,元组中的元素不可修改,但是我们现在要详细的对这句话进行解析!

这里说的元素不可修改,指的是不能改变元组的元素的指向(就相当于箭头),但是变元组元素指向的内容是可能被修改的

首先,我们先要知道,元组内部是由若干元组组成,这些元素不仅可以是数字,字符,甚至可以是一个列表,甚至是一个元组

我们来看一个简单的例子:

a = (123456 , 000 , "hello" , [2,"scy"])
a[3][1] = "scyscy"
print(a)

上面的元组中,最后一个元素是一个列表,众所周知,列表是可以更改的,所以我们对这个列表进行更改,就相当于改变了这个元素的指针所指向位置的内容,但是没有改变指针,所以这个最后是会被执行成功的!

3、元组赋值

在给元组赋值时,我们要注意元组和指针的关系:

来看一个简单小例子:

x = (1 ,2 ,3)
b = x
print(b is x)   #判断是不是指向了同一个地方
#————————第一部分————————————
x += (100,) #相当于新建了一个元组
print(x)
print(b)
#————————第二部分————————————

我们先看看第一部分是内存中是怎样体现的:

当我们执行了第二部分的“x += (100,)”时,就相当于在内存中创建了一个新的地址,里面有(1,2,3,100)这个内容,而x的指针也将会指向这个内容:

我们再来看看内部的变化:

4、元组的大小比较

两个元组比大小,就是把每个元组的元素逐个比对,比如a元组的第一个元素和b元组的第一个元素进行比较,直至分出胜负

如果对应的元素不可比较,就会报错:

print((1,'a',12) < (1,'b',17))
print((1,'a') < (1,'a',13))
print((2,'a') > (1,'b',13))
print((2,'a') < ('ab','b',13))

前三个运行结果都是True

最后一个会报错(无法比较)

七、用元组取代复杂分支结构

假如我们现在想写一个根据输入对应的数字,来输出星期几的程序,如果我们想用if分支语句,需要写好几个分支,如果代码和情况更复杂,就会变得更加难写,我们可以用元组来代替分支语句:

weekdays = ("星期一" , "星期二" , "星期三" , "星期四" , "星期五" , "星期六" , "星期日")n = int(input())
if n > 7 or n < 1 :print("错误!!!!!!!!!!!!")
else :print(weekdays[n-1])

以上就是Python组合数据类型的第一部分(刷新纪录,太多字了):)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Doris vs ClickHouse 企业级实时分析引擎怎么选?

Apache Doris 与 ClickHouse 同作为OLAP领域的佼佼者&#xff0c;在企业级实时分析引擎该如何选择呢。本文将详细介绍 Doris 的优势&#xff0c;并通过直观对比展示两者的关键差异&#xff0c;同时分享一个企业成功用 Doris 替换 ClickHouse 的实践案例&#xff0c;帮助您做出明…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

Android Native 之 文件系统挂载

一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知&#xff0c;init进程为android系统的第一个进程&#xff0c;也是native世界的开端&#xff0c;要想让整个android世界能够稳定的运行&#xff0c;文件系统的创建和初始化是必不可少的&#xff…

Chain of Draft: 借鉴人类草稿思维让大型语言模型更快地思考

这个研究探讨了大型语言模型&#xff08;LLMs&#xff09;在执行复杂推理任务时面临的计算资源消耗与响应延迟问题。研究特别聚焦于思维链&#xff08;Chain-of-Thought, CoT&#xff09;提示范式的效率局限性。CoT虽然有效&#xff0c;但在推理过程中需要生成冗长、详尽的逐步…

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品&#xff0c;以前都是扫二维码开箱&#xff0c;有些图书馆升级了使用指纹识别。 “是否新方法比以前好&#xff1f;”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

Vue进阶之Vue3源码解析(一)

Vue3源码解析 目录结构编译compiler-corepackage.jsonsrc/index.ts 入口文件src/compile.ts生成ASTsrc/parse.ts 代码转换src/transform.ts几种策略模式src/transforms/transformElement.tssrc/transforms/transformText.tssrc/transforms/transformExpression.ts 代码生成src/…

servlet tomcat

在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中&#xff0c;我们实践了浏览器输入一个请求&#xff0c;然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的&#xff0c;本文将…

【我的待办(MyTodolists)-免费无内购的 IOS 应用】

我的待办&#xff08;MyTodolists&#xff09; 我的待办&#xff1a;智能任务管理助手应用说明主要功能为什么选择"我的待办"&#xff1f;隐私保障使用截图 我的待办&#xff1a;智能任务管理助手 应用说明 "我的待办"是一款智能化的任务管理应用&#x…

GCC RISCV 后端 -- C语言语法分析过程

在 GCC 编译一个 C 源代码时&#xff0c;先会通过宏处理&#xff0c;形成 一个叫转译单元&#xff08;translation_unit&#xff09;&#xff0c;接着进行语法分析&#xff0c;C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…

Vim复制内容到系统剪切板

参考链接 【Vim】Vim 中将文件内容复制到系统剪切板的方法_vi 复制到系统剪贴板-CSDN博客 [转]vim如何复制到系统剪贴板 - biiigwang - 博客园 1. 确定Vim是否支持复制到系统剪切板 输入命令 vim --version | grep clipboard 如果是开头&#xff0c;说明支持系统剪切板&…

测试用大模型组词

已经把hanzi-writer的js的调用、hanzi-writer调用的数千个汉字的json文件&#xff0c;全都放在本地了。虽然用的办法还是比较笨的。我注意到 大模型也可以部署本地&#xff0c;虽然使用频率低的情况下不划算。 尝试直接通过html的javascript通过api key调用大语言模型&#x…

华为eNSP:配置单区域OSPF

一、什么是OSPF&#xff1f; OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种链路状态路由协议&#xff0c;属于内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在单一自治系统&#xff08;AS&#xff09;内部动态发现…

P62 线程

这篇文章我们来讲一下线程。截止到目前&#xff0c;我们的代码都是在单线程上运行的&#xff0c;现在看起来没有什么问题&#xff0c;但是目前所有的计算机几乎都不只有一个逻辑线程&#xff0c;所以如果我们一直使用单线程运行&#xff0c;这样的话效率会很低。尤其是如果我们…

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言&#xff1a; 在 Android 音频系统中&#xff0c;AudioMixer 是音频框架中一个关键的组件&#xff0c;用于处理多路音频流的混音操作。它主要存在于音频回放路径中&#xff0c;是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候&#xff0c;提到了一个函数pr…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展&#xff0c;IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时&#xff0c;企业面临一个重要决策&#xff1a;选择SaaS&#xff08;软件即服务&#xff09;解决方案&#xff0c;还是进行私…

DeepSeek系列模型技术报告的阅读笔记

DeepSeek系列模型技术报告的阅读笔记 之前仔细阅读了DeepSeek系列模型的主要技术方面内容与发展脉络&#xff0c;以下是DeepSeek系列模型技术报告的笔记&#xff0c;有错误的地方欢迎指正&#xff01; 文章目录 DeepSeek系列模型技术报告的阅读笔记GQADeepseek MoEAbstractIn…

【VUE】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…

Spring-framework源码编译

版本统一&#xff08;搭配其他版本会遇到不可知错误&#xff09;&#xff1a; 1&#xff09;spring 5.2.X&#xff08;5.5.26&#xff09; 2&#xff09;JDK8 3&#xff09;Gradle:5.6.4 可以在gradle-wrapper.properties中修改 https\://services.gradle.org/distribution…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;毕竟那都是别人说的&#xff0c;只有自己尝试一次才知道结果。 具体操作 第一步&#xff1a;访问 deepseek 我们访问 deepseek &#xff0c;把我们想要输入的内容告诉…