前言:本文笔记来自于《python编程从入门到实践》,Eric Mathhes著。
代码改变世界。
列表是什么?就是list,也就是 [ ] 。
现在我要创建一个列表,aa=['apple' , 'orange', 'banana']
访问列表元素的操作叫做索引,从0而不是从1开始。
aa[0],索引第一个元素,结果是apple。
其实还可以aa[0].title(),结果是Apple。
当你不知道列表有多少个元素,但想访问倒数第一个元素的时候:aa[-1]
修改列表元素,我想修改第一个元素的值变成boom。
aa[0]=boom为错误操作,要时刻弄清楚列表里面的元素是什么形态的,是单或双引号。否则会报错boom未被定义。
所以应该正确输入aa[0]=’boom‘
这时候列表aa就成了
aa=['boom' , 'orange', 'banana']
给列表添加元素,最简单的方式自然是将元素附加到列表末尾。比如刚才把apple修改成boom,我后悔了,我想追回来:
aa.append(’apple‘)
这时候列表aa就是['boom', 'orange', 'banana', 'apple']。
添加元素最简单的操作,就是append(),括号内填写想要加进去的元素。
这个时候,有些人可能有强迫症,或者他最喜爱的水果是pitaya(火龙果),想把pitaya排在第一个,但append()只能插入到最后一个元素,这个操作就是insert()。
aa.insert(0,’pitaya‘) 这个insert()使用的方法自然是括号内填写想要插入的索引位置,逗号后面接想要添加的元素。
这时候他女朋友有意见了,他女朋友想要添加一个pear(梨子)进去,这个时候你会使点坏,你将梨子安排进列表中的第三个位置:
aa.insert(2,'pear') 那么最终列表aa就是这样的结果:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
最后再啰嗦一句,为啥括号里面是2,因为索引是从0开始的而不是1。
然后,烦人的女朋友终于走了,其实你是非常不喜欢梨子的,这时候,你想删掉梨子,而且你明确知道梨子的位置。那么:
del aa[2]
print(aa)
这时候你看到的输出结果就成了aa=['pitaya', 'boom', 'orange', 'banana', 'apple']。
梨子成功地从列表消失了,但是,这个操作有风险,因为一经删除,你就无法再访问你删掉的东西了。
这个时候,你的脑海中浮现出女朋友再次推门进来,看到一脸慌张的你,命令你再看看aa的情况。这个时候你是无解的。
所以,你吓的撤回了删除的操作,这个时候aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']。
骚年,不要慌,我有一个妙计,既可以让你的列表中没有烦人的pear,还能访问已经删除的pear,向你女朋友解释她的pear其实还在。
pop()方法可以删除列表末尾的元素,并能让你能够接着使用它,比如,你可能需要获取刚被射杀的外星人的相关信息,然后在它死亡的位置打上死亡爆炸的特效。
注意,为什么说pop()是删除列表末尾的元素,因为空格里面没有东西的话,是默认删除最后一个元素。
通俗一点介绍,就是弹出元素。这时候我们知道pear的索引位置,将pear给弹出来。
bb=aa.pop(2) #我们将弹出去的pear存储到变量bb里面。
print(aa)
ptint(bb)
输出结果为:
['pitaya', 'boom', 'orange', 'banana', 'apple']
pear
这么看来,骚年,当你女朋友要求看看你的aa列表的时候,你可以帅气地甩头发对她说:"亲爱的,我把你的pear存储在别的地方了,是一个叫baby的地方,我把它缩写成bb了。”这时候你熟练地print(bb),这时候你女朋友看到她的pear被单独的放在一个“baby”的地方,肯定感动地稀里哗啦的。
一波骚操作,深藏功与名。
回到正题,有的同学就有可能想起第一篇的内容,没错,就是那个删除空白的strip(),为什么使用strip()操作却不影响变量的值呢,而pop()操作不需要经过特意赋值的操作,就能直接
影响aa列表的值呢?坦白地说,我也不知道这是什么回事,你只需要记住strip()不会影响变量的值,需要经过t特意的赋值。记就完事了。
实际上,在我们编程的过程中,并不是每次的列表你都能记住某个元素的具体位置的,有些列表很长。你想删除一个元素但不清楚具体的索引位置。remove()可以满足这个操作。
我们将cc设置为一个无穷元素的列表吧:cc=[……,’pear‘,……],想要弹出pear,还是将pear存储到变量bb吧:
bb=cc.remove(’pear‘)
这个时候,你会发现打印出来的结果不对,没错,打印的结果是None,空值。但是cc列表中确实没了pear。
我们犯了一个思维惯性的错误,以为remove()与pop()应该一样,弹出去的值都可以访问。实际上remove()的操作同样是删除出去后,不能再访问。但是区别于del删除的操作是什么呢?
在remove()之前,我们可以先找一个变量存储一下要删除的这个值啊。
这个时候我们可以刹车一下,总结一下我们学到的三个删除指令:
def aa[ ]:需要知道元素的具体索引位置,删除的值无法在访问。
aa.pop( ):需要知道元素的具体索引位置,不输入则默认最后一个,可以访问弹出的元素,能直接影响变量的值。
aa.remove( ):不知道元素的具体索引位置, 括号内输入要删除的元素值,删除的值无法访问,但是在操作之前能提前存储好删除的值。
从此,我们可以推理出,def删除的操作,其实也能提前存储好要删除元素的值。故remove()和def的区别就是,前者可以直接删除,在不知道具体索引位置的情况下使用。
那么写一段代码放在这儿,打印结果省略。
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
bb='banana'
del aa[4]
print(aa)
print(bb)
那么,大家不介意我出个简单的题吧?现有aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple'],你需要对列表中的每个水果发出我要吃这个水果的语句。
答案:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
for a in aa:
print("I want to ear”+a+“.”)
输出结果:
I want to ear pitaya.
I want to ear boom.
I want to ear pear.
I want to ear orange.
I want to ear banana.
I want to ear apple.
这段代码,就是对列表的遍历操作,使用的功能是for循环。
刚开始使用for循环时请牢记,对列表中的每个元素,都将执行循环指定的步骤,不管列表中含有多少个元素。
另外,编写for循环时,对于用于存储列表中每个值的临时变量,可以指定任何名称,还可以效率更高地这样命名,对于小猫列表一般这样:
for cat in cats:
如果想要执行更多的操作,想在每一次表达想吃这个水果之后,并说“吃到了,舒服!”:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
for a in aa:
print("I want to ear”+a+“.”)
print(“吃到了,舒服!”)
这儿就省略掉输出结果,有些人可能就觉得很啰嗦,其实只要在结尾的时候说一句就够了。但是有人会这么敲代码,会意外地发现为啥每一句之后都有这句话,这就涉及到缩进问题。
正确的代码应该是:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
for a in aa:
print("I want to ear”+a+“.”)
print(“吃到了,舒服!”)
将最后一行取消了缩进,最后的结果变成了在最后只说了一句“吃到了,真舒服!”。
这是因为,如果最后一行保持跟倒数第二行一样的缩进,代码就会执行为for循环里面的打印,每循环一次就会打印一次。这就是缩进块的概念。
保持一样的缩进块,就相当于属于一个模块;不一样的缩进块,就不属于一个模块。
当然,有人也会犯这样的错误,必要的缩进没有缩进:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
for a in aa:
print("I want to ear”+a+“.”)
这个时候就会报错,报的是缩进错误。当然了,不必要的缩进也会带来报错。
可以说:强制缩进规范是python函数的特点,为了使python代码看上去整齐美观简洁。这里,我将列举出一些常犯的错误。
1.忘记缩进。
2.忘记缩进额外的代码行。
3.循环后不必要的缩进。
4.不必要的缩进。
5.遗漏了冒号
接下来我介绍的是使用函数range()创建数字列表。
for value in range(1,5):
print(value)
输出结果:
1
2
3
4
那么,看到这个应该有了一个大概的了解,我做出总结:range(x,y),从x开始(包含x)遍历,访问到y停止,但不会打印y。
所以想要打印1到5,正确的方式应该是:
for value in range(1,6):
print(value)
那么打印出1-10内的偶数:
double_numble=list(range(2,11,2)) 为什么从2开始,是因为前者能被打印出来;为什么是11结束,因为后者不被打印。前面两个是起点和终点,最后面的是间隔的数,打印出偶数。
使用range()几乎能创建任何需要的数字集。那么,如何创建一个列表,其中包含前10个整数的平方呢?
squares=[ ]
for value in range(1,11):
square=value**2
squares.append(aquare)
print(squares)
这是一个常规的操作,先创建一个空列表,然后把1-10进行平方处理,最后append依次加入空列表。
为了让代码更加简洁,可以这样:
squares=[ ]
for value in range(1,11):
squares.append(value**2)
print(squares)
那么,有人可能想起上面所学的list: double_numble=list(range(2,11,2)), 于是我也大胆尝试一下新的方法:
for value in range(1,11):
square=value**2
print(list(square))
令人意外的是,这段程序报错了,报错的原因我翻译了一下,竟然是int不能直接列表化?也就是说square是一个整数,而不是一个列表?
于是我去运行:
for value in range(1,11):
square=value**2
print(square)
结果出乎我的意料,是100,即10的平方。不对呀,在我的思维中,这个循环的运行,square难道不是1,4,9,16,25,36,49,64,81,100吗?然后最后一行list列表括起来?
很遗憾,事实就是这样,我的思维发生了错误。很显然,这是for循环,但是square是被循环改变了10次的值,最后一次改变的值是100,并不是我想象中的10个square值。
有时候,错误也值得记录下来,要知道有一段诗:
我搜集我的错误,
不是为了把它置于枕下,
而是为了把它洒落在路上:
错误,也会发光。
所以,更加简洁的表达方式就是列表解析,上面代码可以缩成两行:
squares=[value**2 for value in range(1,11)]
print(squares)
可能会有些看不懂,把它们拆分成三部分,试图去理解吧!
value**2 // for value // in range(1,11)
最后用列表括起来,就完成了!
注:要创建自己的列表解析,需要经过一定的练习,但能够熟练地创建常规列表,你会发现这样做完全值得。
这儿,我会布置三道题,答案在下一篇文章公布:
创建一个列表,其中包含3-30内能被3整除的数字。
创建一个列表,其中包含1-10中奇数的立方数
创建一个列表,其中包含1-20的奇数。
(建议普通方式,列表解析方式都做一遍)
使用列表的一部分,这个操作呢,就叫做切片。,让我们重新召唤出来aa列表:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
接下来我会做出一系列的切片操作,请自行理解。
aa[0:3] ['pitaya', 'boom', 'pear']
aa[1:4] ['boom', 'pear', 'orange']
aa[ :4] ['pitaya', 'boom', 'pear', 'orange']
aa[2: ] ['pear', 'orange', 'banana', 'apple']
aa[-3: ] ['orange', 'banana', 'apple']
如果我想要进行切片操作后进行遍历,比如我想打印出前三个水果并表达想吃的愿望:
for a in aa[ : 3]:
print("I want to eat "+a +".")
输出的结果自然是:
I want to eat pitaya.
I want to eat boom.
I want to eat pear.
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([ : ])。
让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
bb=aa[ : ]
print(aa)
print(bb)
结果很明显,是一样的列表。但是,我就知道有人要问,为什么第二行不能直接bb=aa赋值处理呢?
是这样的,你可以先运行这段代码:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
bb=aa
bb.append(’ice‘)
print(aa)
print(bb)
有没有发现这段代码的运行结果跟你想象中的不一样?为什么你给bb加一个’ice‘,为什么aa列表也加进去了?
因为,你如果按上面的方式处理的话,直接赋值处理,你会将变量aa和变量bb都指向了一个列表。所以你如果修改了aa的值,bb的值也会相应的变化。
正确的操作应该是产生出一个独立的列表,这样两个列表的变化是独立的。所以正确的方式是:
aa=['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
bb=aa[ : ]
bb.append(’ice‘)
print(aa)
print(bb)
输出结果:
['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple']
['pitaya', 'boom', 'pear', 'orange', 'banana', 'apple', 'ice']
学了这么多,有人就会考虑到一些项目中的需求,想要弄一个集合,里面的元素值不能被修改,确实有,这个概念就是元组,用()表示。
假如要定义一个长宽不应改变的矩形,可以将长度和宽度存储在一个元组中。
dimensions=(20,50)
具有无法修改里面元素的性质,否则代码会报错。同时这个元组跟列表一样,可以遍历for循环操作。
所以能修改的只有元组的变量,给存储元组的变量赋值。
dimensions=(30,40),这样矩形的元组就发生了改变。