python数据结构的学习笔记_01

背景

前段时间学习了用c++语言描述的数据结构与算法,近期业务上用python写代码比较多,期间出现了一些问题,感觉这方面的了解还不够,因此这段时间学习下用python语言描述的数据结构与算法,加强一下python相关的知识。期间把学习的知识做个笔记梳理。

python入门

因为之前已经学习过python,所以这里就不在过多仔细的学习了,只做一个简单的温顾。

python对象

python是一种面向对象的语言,类则是所有数据类型的基础。

标识符、对象和赋值语句

python语言的所有语句中,最重要的就是赋值语句,例如

a = 55.6

上面语句"a"作为标识符与等号右边标识的对象相关联,在这一示例中浮点对象的值为55.6。如:
在这里插入图片描述

标识符a引用了float类的一个值为55.6的实例。

标识符

在python中,标识符是大小写敏感的,所以a和A是不同的标识符。标识符几乎可以由任意字母,数字和下划线组成。但是标识符不能以数字开头(如6a),并且有33个特别的保留字不能用作标识符。

python中的保留字,这些名字不能用作标识符
在这里插入图片描述

与c++不同,python是一种动态类型语言,标识符的数据类型并不需要事先声明。标识符可以与任何类型的对象相关联,并且它可以在以后重新分配给相同(或不同)类型的另外一个对象。

比如可以通过向现有对象指定第二个标识符建立一个别名。

a = 55.6
b = a

在这里插入图片描述

标识符a和b是同一个对象的别名

如果对象的一个别人被赋值语句重新赋予了新的值,那么这并不影响已存在的对象,而是给别名重新分配了存储对象。

a = a + 1.0

表达式是a+1.0是基于已存在的对象名a进行运行,因此,结果的值为56.6,即55.6+1。该结果被作为新的浮点实例存储,如果赋值语句左边的名称是a,那么重新分配存储对象。所以后面这语句对标识符b继续引用现有的值没有任何影响。
在这里插入图片描述

创建和使用对象

实例化

创建一个类的新实例的过程被称为实例化。一般来说,通过调用类的构造函数来实例化对象。例如,如果有一个名为Widget的类,假设这个类的构造函数不需要任何参数,我们可以使用 w = Widget()这样的语句来创建这个类的实例。如果构造函数需要参数,则使用w = Widget(a,b,c)的语句来创建实例。
许多python的内之类都支持所谓的字面形式指定新的实例。如上面的语句 a = 55.6的结果时创建float类的新实例。在该表达式中55.6是字面形式。

调用方法

python支持传统函数调用,调用函数的形式如sorted(data),这种情况下,data作为一个参数传递给函数。python的类也可以定义一个或多个方法(也称成员函数),类的特定实例上的方法 可以使用点操作符(“.”)来调用。例如data.sort()点左侧的表达式用于确认被调用的对象。通常,这将是一个标识符,但我们可以根据其他操作的返回结果使用点操作符来调用一个方法。例如,如果response标识一个字符串实例,那么可采用response.lower().startwith(“y”)的形式调用函数,其中response.lower()返回一个新的字符串实例,在返回的中间字符串的基础上调用startwith(“y”)方法。

python的内置类

python中常用的内置类
在这里插入图片描述

详解内置类

布尔类

布尔类(bool)常用于处理逻辑(布尔)值,该类表示的实例只有两个值——True和False。默认构造函数bool()返回False。
python允许采用bool(foo)语法用非布尔值类型为值foo创造一个布尔类型。结果取决于参数的类型。就数字而言,如果为零就为False,如果非空则为True。这种方式的一个重要应用是可以使用非布尔类型的值作为控制结构条件。

整型类

整型(int)和浮点(float)类是python的主要数值类型。int类被设计成可以表示任何大小的整型值。不像C++支持不同精度的不同整数类型(如int、short、long),python会根据其整数的大小自动选择内部表示的方式。

整数的构造函数int()返回一个默认为0的值。该构造函数可用于构造基于另一个类型的值的整数值。
在这里插入图片描述

如f是一个浮点值,表达式int(f)得到f的整数部分。

构造函数也可以用来分析一个字符串,该字符串被假定为表示整型值。如果s是一个字符串,那么int(s)得到这个字符串代表的整数值。
在这里插入图片描述

默认情况下,字符串必须使用十进制。如果需要从不同进制中转换,那么需要把进制表示为第二个可选参数。

浮点类

浮点(float)类是python中唯一的浮点类型,使用固定精度表示。其精度更像是c++中的double型,而不是c++中的float型。
整数的等价浮点形式可以直接表达成2.0。从技术上讲,数字末尾的零是可选的,所以有些程序员可以使用表达式2.来表示数字2.0的浮点形式。

float()构造函数的返回值是0.0。当给定一个参数时,float()构造函数尝试返回等价的浮点值。如果构造函数的参数是一个字符串,比如float(“3.14”),那么将会产生异常。

序列类型:列表、元祖和str类

list、tuple和str类是python中的序列类型,代表许多值的集合,集合中值的顺序很重要。
list类表示任意对象的序列(类似于其他语言中的“数组”。
tuple类是list类的一个不可改变的版本。
str类表示文本字符串不可变的序列。
python没有为字符设计一个单独的类,可以将其看作长度为1的字符串。

列表类

列表(list)实例存储对象序列。列表是一个参考结构,因为它的技术上存储其元素的引用序列。列表的元素可以是任意的对象(包括None对象)。
列表是基于数组的序列,所以采用的是零索引,因此一个长度为n的列表包含索引号从0到n-1的元素。

如: a = [2,4,6,8]
在这里插入图片描述

python使用字符[]作为列表的分隔符,[]本身表示一个空列表。
list()构造函数默认产生一个空的列表。然而,构造函数可以接受任何可迭代类型的参数。例如:list(“hello”)产生一个单个字符的列表,[“h”,“e”,“l”,“l”,“o”]。
在这里插入图片描述

元祖类

元祖(tuple)类是序列的一个不可改变的版本,它的实例中有一个比列表更为精简的内部标识。python使用[]符号来表示列表,而使用圆括号表示元祖(),()表示一个空的元祖。
为了表示只有一个元素的元祖,该元素之后必须有一个逗号并且在圆括号之内。如(17,)是一元元祖。之所以这么做,是因为如果没有添加后面的都好,那么表达式(17)会被看作一个简单的带括号的数值表达式。

str类

python的str类专门用来有效地代表一种不变的字符序列。相较于引用列表和元祖,字符串有更为紧凑的内部表示。

一个python字符串,它是字符的一个索引序列
在这里插入图片描述

字符串可以用单引号,如‘test’,也可以用双引号"test”。
引号的分隔作用可以用反斜杠来实现,即所谓的转义字符。
python也支持在字符串的首尾使用分割符"或者"“”。这样使用三重引号字符的有优点是换行符可以在字符串中自然出现,而不是使用转义字符\n。

set 和 frozenset类

python的set类代表一个集合的数学概念,即许多元素的集合,集合中没有重复的元素,而且这些元素没有内在的联系。与列表恰恰相反,使用集合的主要有点是它有一个高度优化的方法来检查特定元素是否包含在集合内。
因为基于散列表的数据结构,因此有两个算法基础产生的重要限制。
集合不保存任何有特定顺序的元素集。
是只有不可变类型的实例才可以被添加到一个python 的集合。
因此,如整数、浮点数和字符串类型的对象才有资格成为集合中的元素。

frozenset类是集合类型的一种不可变的形式,所以由frozenset类型组成的集合是合法的。
python使用花括号{和}作为集合的分隔符,例如。{“11”}或{“a”,“b”,“c”}。这个规则的特例是{}并不代表一个空的集合。
构造函数set()会产生一个空集合。如果构造函数提供参数,那么就会产生不同的元素组成的集合。
在这里插入图片描述

字典类

python的dict类代表一个字典或者映射,即从一组不同的键中找到对应的值。
字典的表达式也使用花括号{},因为python的字典类型是早于集合类型出现的,字面符号{}产生一个空的字典。一个非空字典的表示用逗号分隔一系列的键值对。例如字典{“ga”:“ifs”,“de”:“df”},表示"ga"到"ifs"和“de"到"df"的一一映射。
dict类的构造函数接受一个现有的映射作为参数,在这种情况下,它创造一个与原有字典有相同联系的字典。
在这里插入图片描述

表达式、运算符和优先级

在使用运算符的情况下,现有的值可以组合成较大的语法表达式。运算符的语义取决于其他操作数的类型。

逻辑运算符

python支持以下关键字作为运算符,其结果为布尔值:

and和or运算符是短路保护的,也就是说,如果其结果可以根据第一个操作数的值来确定,那么它们不会对第二个操作数进行运算。

相等运算符

python支持以下运算符去测试两个概念的相等性:
is同一实体is not不同的实体==等价!=不等价

当标识符a和b是同一个对象的别名时,表达式a is b的结果为真。

比较运算符

数据类型可以通过以下运算符定义一个自然次序:
在这里插入图片描述

算术运算符

python支持以下算术运算符
在这里插入图片描述

python对于除法有更多的考虑。我们首先考虑两个操作数都是整型的情况,例如,27除以4。在数学中,27÷4=6.75。在python中,/运算符表示真正的除,运算返回一个浮点型的计算结果,表达式27//4的运算值是整型6(数学概念中的商),表达式27%4运算的值是整型的3,整数除法的余数。
另外,在c++中并不支持//运算符。
另外当两个操作数都是整型时,/运算符返回不大于商的最大整数;当至少有一个操作数是浮点型时,其结果是真正除法的结果。
在操作数有一个或两个是负数的情况下,python谨慎地扩展了//和%的语义。
当除数m为正数时,python进一步保证0<=r<m。
//和%运算符的使用甚至扩展到浮点型操作数,表达式q=n//m的值不大于商的最大整数,表达式r=n%m表示r是余数,确保q*m+r等于n。
在这里插入图片描述

位运算符

python为整数提供了以下位运算符:

在这里插入图片描述

序列运算符

python每个内置类型的序列(str、tuple和list)都支持以下操作符语法:

在这里插入图片描述

python使用序列的零索引,因此一个长度为n的序列的元素的索引是从0到n-1。
python也支持负索引,表示离序列尾部的距离;索引-1表示序列的最后一个元素,索引-2表示序列的倒数第二个元素,以此类推。
在这里插入图片描述

python使用切片标记法来描述一个序列的子序列。切片被描述为一种半开放的状态,即开始索引的元素包含在内,结束索引的元素排除在外。例如,语句a[2:4]产生一个子序列,子序列包含两个索引值:2,3(不包含4)。
在这里插入图片描述

一个可选的“step”值,有可能是负数,可以当做切片的第三个参数。如果在切片表达式中省略了,一个起始索引或结束索引,则假设起始或结束对应的原始序列的头或尾。
在这里插入图片描述

所有序列规定的比较操作都是基于字典顺序,即一个元素接一个元素地比较,直至找到第一个不同的元素。例如,[5,6,9]<[5,7],因为第一个序列中索引为1的元素小。
可操作的序列类型支持:
s==t相等(每一个元素都对应相等)s!=t不相等s<t字典序地小于s<=t字典序地小于或等于s>t字典序地大于s>=t字典序地大于或等于

集合和字典的运算符

set和frozenset支持以下操作:
在这里插入图片描述

需要注意的是,集合并不保证它们内部元素以特定的顺序排列,所以比较运算符(如<)不是以字典顺序进行比较的。

字典像集合一样,它们的元素没有一个明确定义的顺序。此外,对于字典,子集的概念并没有太大的意义,所以dict类并不支持类似<的运算符。但是字典支持等价的概念,如果两个字典包含相同的键-值对集合,那么d1==d2。
字典最广泛的操作是使用索引语法d[k]访问与给定键k相关联的值。支持的操作如下:

复合表达式和运算符优先级

python的运算符优先级:

  1. 在同一个级别中,优先级高的运算符将会比优先级低的运算符先执行,除非表达式中有括号。
  2. 同一个级别中当优先级相等时,的运算符是从左到右计算的。

ps:例外规则是一元运算符和求幂运算是从右至左运算的。

python支持链接赋值,如x=y=0,将最右边的值赋值给指定的多个标识符。python还支持链接比较运算符。例如,表达式1<=x+y<=10等价于复合表达式(1<=x+y)and(x+y<=10),这样可以不用将中间的x+y计算两次。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值