基本数据类型的索引和切片
我们已经学习了,数字,布尔,字符,列表,字典,元组,集合等7种数据类型,这些类型得数据在使用时如果单个出现,也就意味着一个变量只存储他们中的一个时,这个变量就代表数据得全部,要对这个变量进行读取,修改等操作,可以直接进行。但是当一个变量中存储着多个数据时,我们依然可以对变量进行整体操作,但是很多时候,我们不希望整体改变变量中的内容,而是要改变其中的一部分,此时简单得赋值语句就不能满足要求了,我没需要用到变量元素定位得知识,我们开始学习简单的元素定位知识。
1、多个数字元素的定位
a = 12,123,343
b = a[0]
c = a[1]
d = a[2]
print(b)
print(c)
print(d)
print(a)
print(type(a))
print(type(b))
print(type(c))
print(type(d))
输出:12
123
343
(12, 123, 343)
<class 'tuple'>
<class 'int'>
<class 'int'>
<class 'int'>
这里使用了type()函数来查询变量的数据类型,type()函数是编写代码时频繁使用的函数。
可以看到,a被赋值了3个用逗号隔开的数字时,解释器会将a作为一个元组类型的变量来对待,由于元组的不可变性,他的元素被固定了下来,无法修改。此时我们依然可以用个元素的标号将元素读出并打印,元素的性质依然是int类型。可见元素的定位是可以通过变量名接元素标号的方法定位,标号用方括号括起来
2、多个字符串元素的定位
a = '12','123','343'
b = a[0]
c = a[1]
d = a[2]
print(b)
print(c)
print(d)
print(a)
print(type(a))
print(type(b))
print(type(c))
print(type(d))
输出12
123
343
('12', '123', '343')
<class 'tuple'>
<class 'str'>
<class 'str'>
<class 'str'>
我们给上例中的数字加上引号,变成字符串型,得到的结果几乎一样,和上例不同的是,字符串元素b、c、d是任然可分的:
e = d[1]
print(e)
print(type(e))
输出4,<class 'str'>
3、多个布尔值的定位
a = True,False,False
b = a[0]
c = a[1]
d = a[2]
print(b)
print(c)
print(d)
print(a)
print(type(a))
print(type(b))
print(type(c))
print(type(d))
输出True
False
False
(True, False, False)
<class 'tuple'>
<class 'bool'>
<class 'bool'>
<class 'bool'>
我们猜想:一个变量赋值多个元素值,不加标识约束,并用逗号分割,解释器会把这个变量当作元组来处理。
a = '12',123,True,'343',[1,2,3], {True,'wenzi',23},{'name':'baobao'},(5,5,8)
b = a[0]
c = a[1]
d = a[2]
e = a[3]
f = a[4]
g = a[5]
h = a[6]
i = a[7]
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
print(i)
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))
print(type(f))
print(type(g))
print(type(h))
print(type(i))
输出12
123
True
343
[1, 2, 3]
{True, 'wenzi', 23}
{'name': 'baobao'}
(5, 5, 8)
<class 'tuple'>
<class 'str'>
<class 'int'>
<class 'bool'>
<class 'str'>
<class 'list'>
<class 'set'>
<class 'dict'>
<class 'tuple'>
我们的猜想的到验证。
4,字符串,列表,元组,集合,字典的简单索引(定位)
我们上边试验了不加标识符号的各种情况,python对于无符号标识的元素组合当作元组来处理,虽然没有报错,但显然是不规范的,按规范书写应补全数据标识符。
观察一下代码
b = 'hello word'
c = b[0:5]
print(c)
输出 hello
元素索引时用方括号标识索引范围方括号内部是索引的具体范围;
0:5代表从第一个到第四个,索引角标取头不取尾,取头不取尾是一个取值范围的通用规则,在循环等情况下也遵循这个规律
b = 'hello word'
c = b[0:-3]
print(c)
输出 hello w
0:-3代表从第一个取到倒数第3个,-负号代表倒数,同样尾部不取;
b = 'hello word'
c = b[5:-6]
print(c)
此时没有输出
如果角标限定的范围中没有目标,则索引失败,取不到任何元素,这里5:-6限定的范围中没有任何元素
b = 'hello word'
c = b[0:5:2]
print(c)
输出hlo
在角标0:5:2中0:5限定从第一个取到地个,:2限定了步长为2,每两个取一个
多元素索引的规则是通用的
b1 = ['1','2','3','4','5','6','7','8','9']
c1 = b1[0:5]
print(c1)
c2 = b1[3:-3]
print(c2)
c3 = b1[0:6:3]
print(c3)
输出['1', '2', '3', '4', '5']
['4', '5', '6']
['1', '4']
b1 = ('1','2','3','4','5','6','7','8','9')
c1 = b1[0:5]
print(c1)
c2 = b1[3:-3]
print(c2)
c3 = b1[0:6:3]
print(c3)
输出('1', '2', '3', '4', '5')
('4', '5', '6')
('1', '4')
由于集合是无序的数据类型,所以不能运用下标的方法进行索引定位
集合需要切片和索引操作时需要将其转化为列表,元组等可以切片的数据类型
b = {'1','2','3','4','5','6','7','8','9'}
b1 = tuple(b) #需要转换
print(b1)
c1 = b1[0:5]
print(c1)
c2 = b1[3:-3]
print(c2)
c3 = b1[0:6:3]
print(c3)
输出('7', '3', '2', '4', '1', '5', '6', '9', '8')
('7', '3', '2', '4', '1')
('4', '1', '5')
('7', '4')
有没有发现集合b经过转换到b1后元素的顺序生了变化,而且每次运行这个程序得到的顺序都不同。其实这是合理的,由此我们可以直观理解集合的无序性。
字典和集合都使用花括号标识,字典是否有无序的特性呢?是的,字典也是无序的,也同样无法通过下标来索引,字典通过键名来索引定位。
b = {'name':'huahua','name2':'caocao','name3':'guoguo'}
print(b)
c1 = b['name']
print(c1)
c2 = b['name2']
print(c2)
c3 = b['name3']
print(c3)
b1 = list(b)
print(b1)
输出{'name': 'huahua', 'name2': 'caocao', 'name3': 'guoguo'}
huahua
caocao
guoguo
['name', 'name2', 'name3']
从最后一个输出可以看到,经过list ()方法转换后的列表是一个存有字典键名的列表用tuple()方法转换后也是同样的结果,奇怪的是,转换后得到的列表和元组都是和字典的顺序是一致的,多次运行也不会改变,或许这只是一种假象。
我们已经了解了7种基本数据类型的简单索引,我们还会遇到很多不同的情况,比如花式索引等索引技巧,那不重要,当我们遇到时再分撒学习,掌握基本的索引方法已经可以让我们读一些程序,写一些程序了。
写代码也和普通语言一样,掌握技巧,对语言十分熟悉的人为了追求简洁高效,他们的代码中会有很多技巧性风格性的东西,这样的代码对初学者而言,就好似草书,好似俚语,暗话,理解起来十分困难,而且高水平高质量的代码更注重封装,许多类,许多库,许多文件和模块会让初学者摸不着头脑,所以初学者有必要看一些入门级代码和资料,运用所学的知识完成必要的练习,不动手敲代码、不动脑想问题编程是学不会的。
到目前为止我们7种数据类型的特点,简单索引,配合赋值语句打印语句,我们可以试着在别人的代码中找到类似的语句,把他们挑出来,在编程环境中跑一跑,改一改,能够不报错,得到正确的打印输出这将激发你更多学习动力。初学者遇到问题是在所难免的,把报错信息和代码在网上搜一搜,总会有解释有答案的。对于初学者常见的错误,网上有很多汇总的帖子和资料,对照已学内容及时改正,问题会越来越少。
类的思想为拓展数据类型提供了条件,时下流行的神经网络,计算图,都是数据类型。
谈一点编程学习的一些条件。
网络环境改造:网络是必备的,谷歌是必备的。很多游戏加速器,外贸企业的数据通道都需要外网环境下实现,外网不是必须,但随着学习的深入,不上github,油管,原生社区逛逛,就无法得到第一手的学习信息,谷歌是一位很好的学习导师,是处理疑难问题的拐杖,搜索的准确性要好很多。实现外网环境的常见渠道:刚开始花点小钱,一旦有机会出去,谷歌,油管,github上大把的资源,出去以后就不用教了。
编程平台:pycharm,和微软的Visual Studio Code,二选一。虽然其他的ide 如Jupyter Notebook,pyscripter 等,甚至网页版的环境也能满足初学者的需求(随着andaconda pyscript的推出,基于网页前端运行的平台会大量出现),但正规平台才是最终的射击演练场,与其半路转型,不如早点适应,学会安装配置编程环境也是基础的技能。环境搭建简单流程:1平台软件注册,2下载,3安装,4平台运行环境变量添加(平台命令的文件目录添加到系统环境变量的目录里,这样平台的命令才会被系统支持)5,检测平台能否跑起来 6.(选择python版本)下载安装anaconda(科学计算库)7,将annaconda库添加到系统环境变量,8检查anaconda能否在系统里跑起来 9,运行编程平台,新建工程,为工程配置python解释器(指定anaconda 自带的pyhon解释器的路径为工程解释器)。其中6,7,8不是必须的,你也可以单独下载pyhon解释器配置给工程,但是anaconda对持续的学习会有很大的帮助,很多的库都依赖anaconda支撑。
辛辛苦苦搭建了平台,找一点有趣的程序跑一跑吧。
不要直接在网页上复制程序在平台上运行,大部分标点符号、排版符号是不兼容的,先放到txt文本编辑器里保存一下,再去运行,尽可能的自己敲代码,哪怕是照抄也比直接复制粘贴效果好。
索引练习题:
1、jj = [‘kj’,’8’,21,’天空‘ ,[2,4,8], {},{4,8,1},{‘A6’:3,’价格 ‘:280000,’颜色’:‘红’}]
(1)、jj的元素共有几种数据类型?
(2)、jj是几维列表?
(3)、jj[5]共有几个元素?
(4)、使用python语句,将’红‘改成’黄‘将价格280000改成260000
2、lsi = [‘tiwtter’,’facebook’,’google’,[[2,4],[45,3]],[‘True’,’False’]]
ss = lsi[3]
猜想ss的值?type(ss)的值?ss[1,1]>ss[0,0]的值?
3、试述元组和集合的异同点?
4、在网上搜索’python花式索引’相关资料,保存资料,以便查阅。
花式索引中冒号的作用?
花式索引中冒号的作用与range函数中的逗号是否一样?
冒号单独使用时代表的意义?冒号前后的数字代表?
花式索引中逗号的作用?
花式索引中出现多个[ ]的 时候,他们和维度的关系?