10.python中的序列

  本来说完字符串、数字、布尔值之后,应该要继续讲元祖、列表之类的。但是元祖和列表都属于序列,所以有必要先讲讲python的序列是什么。

  首先,序列是是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。每个索引对应一个元素

  Python包含 6 中内建的序列,包括列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。

  对于序列,都可以使用以下操作:

  1.索引

  2.切片

  3.加

  4.乘

  5.成员检查

  6.计算序列的长度

  7.取序列中的最大、最小值



1.索引

  所谓的索引就是对每个元素进行编号,注意,编号是从0开始的。

  我们可用通过索引来取得其对应的元素:

  对于字符串:

a = ‘scolia‘
b = a[3]
print b
print type(b)

  注意:对字符串而言,取出的元素依然是字符串类型。

  对于元祖:

a = (‘scolia‘, 123, True,(),[])
b = a[0]
c = a[1]
print b
print type(b)
print c
print type(c)

  取出来的元素原来是什么类型就是什么类型,为什么会这样呢,看下面这个例子:

  竟然是同一个对象,也就是说变量 l 和变量b 指向了同一个内存空间

def text():
    print ‘scolia‘

a = (‘scolia‘, 123, True, (), text)
b = a[4]
b()

  里面放函数也可以,那么这样呢?

l = []
a = (‘scolia‘, 123, True, (), l)
b = a[4]
b.append(1)  #append()是列表的一个方法,将一个元素添加到列表的最后,对原列表进行操作,但返回值为None
print l
print b

  我们对取出来的元素进行了操作,竟然影响了原列表。

  这说明了:

    元祖其实是一个容器,里面可以放任何的对象,而当我们通过索引去取的时候,取到的原对象。那么我看是不是可以将索引看作是一个特别的变量,它指向的也是内存空间,当然这个说法套到字符串中略显变扭,我们只能假设字符串是将每个字符都存在一个内存空间中,每个字符都是字符串类型,变量取得的是整个字符串,而索引则是每个字符的变量。当然这只是假设,具体python内部如何处理我也不知道,也许有一天我该去读一下python的源码的。



 2.切片

  所谓切片就是一次拿出多个对象,而索引一次只能拿出一个对象。

a = (‘scolia‘, 123, True)
b = a[0:2]
print b

  返回的依然是一个元祖,这里要注意一个问题,那就是 a[2] 明明是 True 才对,但结果我们并没有取到,说明切片是不包括后界限的索引的

  另外,我可以只写其中的一个:

a = (‘scolia‘, 123, True)
b = a[1:]
print b

  表示从某索引开始(包括),取到结束。

a = (‘scolia‘, 123, True)
b = a[:2]
print b

  表示从最开始,取到结束的索引(不包括)。

  另外,还可以使用负数:

a = (‘scolia‘, 123, True)
b = a[-2:]
print b

  正数表示索引是从左向右计算的,而负数则表示倒数,如-1就表示倒数第一个。

  但是,取对象的方向还是从左到右的,这里要注意下。

  

  但如果我这样写呢:

a = (‘scolia‘, 123, True)
b = a[-1:-3]
print b

  开头的索引在结束的索引的右边,是不是就可以倒过来取了呢?

  答案是:

  不可以,得到空的。看来一定要从左向右取对象

  还有,当我给的索引超出了呢?

a = (‘scolia‘, 123, True)
b = a[0:100]
print b

  python能自动处理索引超出的问题,这也是python优雅的所在。

  但是要注意:

a = (‘scolia‘, 123, True)
b = a[10:100]
print b

  这样就取不到了。

  最后,还有一个小技巧,虽然切片得到的是一个元祖,但能找到我们切片得到了几个元素,如果此时我用多个变量去承接呢?

a = (‘scolia‘, 123, True)
b,c,d = a[:]    #这里能得到原序列,此外还涉及到深浅拷贝的问题,以后再来解释
print b
print c
print d

  这样我能得到独立的对象了。



3.加

  对序列进行加法运算,将返回一个新的对象。

a = (‘scolia‘, 123, True)
b = (‘good‘, 456)
c = a + b
print a
print b
print c

  并没有影响到原序列。

  那么不同类型的序列相加呢?

a = (‘scolia‘, 123, True)
b = [‘good‘, 456]
c = a + b
print a
print b
print c

  不行。

  列表的相加也是一样的,这里不重复举例。

  另外,和字符串的+号拼接也是一样的。



4.乘

  乘法和加法类似,只是几个一样的序列相加而已,这点和数学的乘法一样。

a = (‘scolia‘, 123, True)
b = a*2
print a
print b

  同样不影响原序列



5.成员检查

  这里主要是 in 和 not in 运算符的使用。

b = 3000
print id(b)
a = (‘scolia‘, 3000, True)
print b in a
print id(a[1]), id(b)

  这里的结果很奇怪,如果还记得python中的缓存池(上篇有说过)的话,不是说数字只在 -5~257 才会有缓存行为吗?看来python内部针对这种情况特别做了优化,达到了节省内存的效果。

  就算赋值行为在下面也一样。

a = (‘scolia‘, 3000, True)
b = 3000
print b in a
print id(a[1]), id(b)

  看来在变量赋值时还有隐藏行为,python会检查元祖和列表中是否已经有一样的对象了,若有则赋值时不重新创建,而是重复引用。



6.元素长度计算

  其实是 len() 内置函数的调用,该函数会返回容器中元素的数量。

a = (‘scolia‘, 3000, True)
print len(a)

  计算是从1开始的,和索引不同,要注意区分。

  还有,虽然这里是写在序列之中,但是这个方法对字典也适用,而字典算是特殊的一种‘序列‘。

a = {‘a‘:1,‘b‘:2}
print len(a)



7.取序列中的最大、最小值

  这里其实是内置函数 max() 和  max() 的使用,其会返回序列中的最大、最小值。

  关于不同数据的比较请参照:戳这里

  或者参考我之前关于python的数字的博文。

a = (‘scolia‘, 3000, True)
print max(a)



  关于序列的内容暂时写这么多,以后有需要的话会继续补充。

时间: 2024-10-05 16:20:11

10.python中的序列的相关文章

[Python学习]——序列(1)——初识Python中的序列

我们讲的python中的序列包括:1. 字符串(多个字符组成的一个序列)2. 列表3. 元组 #列表和元组的异同? list=[1,2,3] print type(list) tuple=(1,2,3) print type(tuple) #<相同点> 列表和元组都是容器,可以包含任意类型的元素(甚至是包含一个序列) 列表和元素也都包含元素的顺序 #<差别> 列表是可变的,元组是不可变的 所以通常,在你有一些不确定长度的相同类型队列时使用列表 在已知元素数量的情况下用元组 #<

Python中的序列

Python中有四种内建的数据结构,即列表.元组.字典.集合.其中字典和集合我会以后再写,现在先说列表和元组,它们两个和以前提到很多次的字符串, 其实都属于——序列. 一.列表(list): 1. list 是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的项目应该包括在方括号中,这样Python 就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的项目.由于你可以 增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的.

2.python中对于序列比较基础的迭代方法。

一. 并行迭代. 如果并行迭代,首推zip()函数!!! 比如说现在有两个长度一样的列表,这两个列表中,索引位置相同的值是有关联的,现在必须要把这两个表的值同时遍历,如果遇到这种情况,就必须使用并行迭代了. name = ["suhaozhi","andy","tony"] age = [22,33,44] 假如说name表是每个人的名字,age表是这三个人的年龄,都是按位置对应的,现在需要同时循环迭代,这两个列表. name = ["

2018.8.10 python中的迭代器

主要内容: 1.函数名的使用 2.闭包 3.迭代器 一.函数名的运用 函数名是一个变量,但他是一个特殊的变量,与括号配合可执行函数的变量. 1.函数名的内存地址 def func(): print('呵呵') print(func) #结果 # <function func at 0x000000000215D7B8> 2.函数名可以赋值给其它变量 def func(): print('呵呵') print(func) a = func a() 3.函数名可以当做容器类的元素 def func

python中xrange和range(转)

说到序列,我们第一想到的是一组有序元素组成的集合.同时,每个元素都有唯一的下标作为索引. 在Python中,有许多内界的序列.包括元组tuple,列表list,字符串str等.上面提到的序列类型(list,tuple,str)有一个共同的特点,就是当序列对象创建时,需要开辟专门的内存空间,保存序列中的所有元素.换句话说,这些序列对象本质上,是一个集合. 例如,下面代码创建了一个序列对象s.在该对象序列创建时,需要开辟内存空间将序列中的3个元素(整数1,2,3)保存下来. s=[1,2,3] 然而

python中的for循环对象和循环退出

流程控制-if条件 ? 判断条件,1位true,0是flesh,成立时true,不成立flesh,not取反 if ?1; ? ? ?print 'hello python' ? ?print 'true' ? not取反,匹配取反,表示取非1大于2的正确关系,也就是说取1大于2的不正确证明的结果 if ? not 1 > 2 and ?1 == 1; ? ? ? ? ?print 'hello python' ? ? print 'true' if ?1 > 2; ? ?print 'hel

Python学习(一):入门篇:python中的一些数据结构

Python里的一些基本知识点总结 Last Edit 2014/5/2 这里记录的是Python2.7版本的语法特征,部分与Python3.0是不一样的. 一,关于开发环境 在windows下可以直接在官网下载相关的版本,然后默认安装.使用直带的IDLE编辑器. IDLE中两个有用的快捷键: ALT+P:重复历史命令(从最近到最老) ALT+N:   重复历史命令(从最老到最近) IDLE中没有清屏功能. 在cmd中进行: 1,首先要在环境变量的path中添加相关的路径: C:\Python2

[转]Python中函数的值传递和引用传递

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

python中的MySQL数据库操作 连接 插入 查询 更新 操作

MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维基百科对数据库表的简要解释,要想详细了解,需要看官在找一些有关数据库的教程和书籍来看看. 在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系.它由纵向的列和横向的行组成,例如一个有关作者信息的名为 authors 的表中,每个列包含的是所有作者的某个特定类型的信息,比如