简明python_Day7_数据结构、切片
2019.5.14 热 无题,中午在会议室抽空学习
刚补完昨天模块的内容,今天学数据结构。字段的意思就是属性。晚上要补回练习。
##############################################################################
数据结构:标准数据一共六种:数字类型、字符串类性、列表、元组、字典、集合
将数据聚合在一起。用来存储一系列相关数据的集合。Python 中有四种内置的数据结构——列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。
**有关对象(object)与类(class)的讨论:
列表是使用对象与类的实例。当我们启用一个变量 i 并将整数 5 赋值给它时,你可以认为
这是在创建一个 int 类(即类型)之下的对象(即实例) i 。
一个类(list就是一个类,万物皆有类)也可以带有method(每个类都有一些针对这个类的属性或是操作),也就是说对这个类定义仅对于它启用某个函数。但这个需要你拥有这个类的一个对象(类里面的个体)才能使用它的method。
举个例子,Python 为 list 类提供了一种 append 方法,能够允许你向列表末尾添加一个项目。例如 mylist.append('an item')将会向列表 mylist 添加一串字符串。在这里要注意到我们通过使用点号的方法来访问对象。
格式: 对象.method 对象.field
字段(field)字段就是属性:只为该类定义且只为该类所用的变量。只有当你拥有一个属于该类的对象时,你才能够使用这些变量或名称。
列表:如一张购物清单,可添加、移除或搜索列表中的项目。是一种可变的(Mutable)数据类型。你必须有一种列表也是一个序列的意识
list: mylist=[a,b,c,dd]
列表的 sort 方法对列表进行排序。在这里要着重理解到这一方法影响到的是列表本身,而不会返回一个修改过的列表——这与修改字符串的方式并不相同。同时,这也是我们所说的,列表是可变的(Mutable)而字符串是不可变的(Immutable)。
元组:近似列表,但不可变(类似字符串)。通常用于保证某一语句或某一用户定义的函数可以安全地采用一组数值,意即元组内的数值不会改变。
tuple: mytuple=(a,b,c,dd)
这种使用方括号的形式被称作索引(Indexing)运算符。我们通过指定new_zoo[2] 来指定 new_zoo 中的第三个项目;我们也可以通过指定 new_zoo[2][2] 来指定new_zoo 元组中的第三个项目中的第三个项目。
《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《《《〈《〈《〈《
1)索引操作也可以使用负数,在这种情况下,位置计数将从队列的末尾开始: mytuple(-1)=(dd)。(步长设置为-1时,翻转文本,即sad变成das)这个叫切片操作:mytuple[1:3]=b,c(含1不含3) 。
2)同样可以在切片操作中使用负数位置,在切片操作中提供第三个参数,这一参数将被视为切片的步长(Step)(在默认情况下,步长大小为 1):mytuple(::2)=(a,c)。
3)什么都不写,只写[:]
就可以原样复制一个list: L()=mytuple(:)=(a,b,c,dd) 而且,mytuple的改变不会影响L。
4)能对列表,元组,字符串进行切片操作。
5)有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。
作业:对字符串的切片:(如下是完美答案,因为免去判断当前字符串长度的需要)
》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》
元组内没有项目那就一个圆括号得了,但是只有一个项目时比较特殊,需要加一个逗号:singleton=(1,) ,如此一来 Python 才可以识别出在这个表达式想表达的究竟是一个元组还是只是一个被括号所环绕的对象。
字典:就像一本地址本:我们将键值(Keys)(即姓名)与值(Values)(即地址等详细信息)联立到一起。在这里要注意到Key必须是唯一的且只能使用不可变的对象(如字符串),正如在现实中面对两个完全同名的人你没办法找出有关他们的正确信息。value不设限制。(在编译器设计的术语中,这叫作符号表(Symbol Table))
形式:d = {key : value1 , key2 : value2} 这样的形式,来成对地指定键值与值。在这里要注意到成对的键值与值之间使用冒号分隔,而每一对键值与值则使用逗号进行区分,它们全都由一对花括号括起。
注意:字典中的成对的键值—值配对不会以任何方式进行排序。如果你希望为它们安排一个特别的次序,只能在使用它们之前自行进行排序。
使用:d['key'] 就等于value1
添加配对:d['key3']=value3 d中就会多出一对 key3:value3
用字典的 items 方法来访问字典中的每一对键值—值配对信息,这一操作将返回一份包含元组的列表,每一元组中则包含了每一对相应的信息——键值以及其相应的值:(标记处自定义,给key和value起名,并通过 for...in 循环将每一对配对的信息相应地分配给 name 与address 变量)
for name, address in d.items():
print('Contact {} at {}'.format(name, address))
判断key是否在字典里:if 'Guido' in d:
注意:.format() format前不是逗号!!!是点!!!
序列:列表、元组和字符串可以看作序列(Sequence)的某种表现形式。序列最大作用是提供资格测试(in 与 not in 表达式)和索引操作(index),允许我们直接获取序列中的特定项目。
上面所提到的序列的三种形态——列表、元组与字符串,同样拥有一种切片(Slicing)运算符,它能够允许我们序列中的某段切片(在元组中说了这个事)——也就是序列之中的一部分。
集合(set):简单对象的无序集合(只考虑存在,不考虑出现次数和次序即重复也只出现一次)适用于删掉重复的内容。另外,通过使用集合,你可以测试某些对象的资格或情况,检查它们是否是其它集合的子集,找到两个集合的交集。
method: xx.add('onestr')
xx.remove('onestr')
bb=aa.copy() #bb是aa的复制
bb.issuperset(aa) #判断bb是否aa的超集,是返回Ture
测试:
此处有个细节:Ture前多了个空格,原因是,python在两个字符间会自动插一个空格(可以认为是逗号的原因),如最后一句的表达就可以解决掉这个空格。
引用:(copy一个序列时的陷阱)
print('Simple Assignment')
shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist 只是指向同一对象的另一种名称
mylist = shoplist
# 我购买了第一项项目,所以我将其从列表中删除
del shoplist[0]
print('shoplist is', shoplist)
print('mylist is', mylist)
神奇的是,打印出来的都没有apple这个项目,因此我们能确认shoplist和mylist指向是同一个对象。
因此要注意:
如果你希望创建一份诸如序列等复杂对象的副本(而非整数这种简单的对象(Object)),你必须使用切片操作来制作副本。如果你仅仅是将一个变量名赋予给另一个名称,那么它们都将“查阅”同一个对象,如果你对此不够小心,那么它将造成麻烦。
针对 Perl 程序员的提示: 要记住列表的赋值语句不会创建一份副本。你必须使用切片操作来生成一份序列的副本。
如下切片操作就不会有事:
################################################数据结构 END###################