切片
背景说明:
针对字符串提供了很多各种截取函数(例如,substring
),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。
举例:
1.取一个list或tuple的前3个元素
#取一个list或tuple的前3个元素
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
#方法1
print(L[0],L[1],L[2])
#方法2:切片
print(L[0:3])
#方法3:
print(L[:3]) #方法2中,如果第一个索引是0,还可以省略
#索引从1开始,取2个元素出来
print(L[1:3])
#索引为-1取最后1个元素
print(L[-1])
#取倒数第4个到倒数第3个,不包括倒数第2个元素
print(L[-4:-2])
#取最后2个元素
print(L[-2:])
---->
Michael Sarah Tracy
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Sarah', 'Tracy']
Jack
['Sarah', 'Tracy']
['Bob', 'Jack']
L[0:3]
表示,从索引0
开始取,直到索引3
为止,但不包括索引3
。
2.list列表的操作
L = list(range(100))
print(L)
#切片方式,取前10个数
print(L[0:10])
print(L[:10])
#取后10个数
print(L[-10:])
#前11-20个数
print(L[10:20])
#前10个数,每两个取一个
print(L[:10:2])
#所有数,每5个取一个
print(L[::5])
#什么都不写,只写[:]就可以原样复制一个list
print(L[:])
3.tuple元组的操作
'''
元组的操作
唯一区别是tuple不可变,因此,tuple操作的结果仍是tuple.
'''
T = tuple(range(1,10))
#取前3个数
print(T[:3])
#字符串'xxx'也可以看成是一种list,每个元素就是一个字符
print("hello,i'm a super man!"[:3])
小结:
有了切片操作,就可以减少循环的使用,Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。
迭代
概念
如果给定一个list
或tuple
,我们可以通过for循环
来遍历这个list
或tuple
,这种遍历我们称为迭代(Iteration)。
说明:
Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
list这种数据类型虽然有下标,但很多其他数据类型是没有下标的。但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:
实例:
1.dict字典的迭代
d = {'a':1,'b':2,'c':3}
#默认情况下,dict迭代的是key
for key in d:
print(key)
#迭代value
for value in d.values():
print(value)
#同时迭代key和value
for k,v in d.items():
print(k,v)
--->
a
b
c
1
2
3
a 1
b 2
c 3
说明:
因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
2.字符串的迭代
'''
字符串的迭代
'''
for i in "helloword":
print(i)
---->
h
e
l
l
o
w
o
r
d
3.对list实现类似Java那样的下标循环
Python内置的enumerate
函数可以把一个list
变成索引-元素对,这样就可以在for循环
中同时迭代索引和元素本身。
for i,value in enumerate(["tom","cat","dog"]):
print(i,value)
--->
0 tom
1 cat
2 dog
判断一个对象是否是可迭代对象?
方法:通过collections模块的Iterable类型判断
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
小结:
任何可迭代对象都可以作用于for循环
,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环
.
列表生成式
概念:
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式
举例:
#生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l1 = list(range(1,11))
print(l1)
#生成[1x1, 2x2, 3x3, ..., 10x10]
l2 = []
for i in range(1,11):
l2.append(i*i)
print(l2)
#升级上面的[1x1, 2x2, 3x3, ..., 10x10]
l3 = [x*x for x in range(1,11)]
print(l3)
---->
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
l4 = [y*y for y in range(1,11) if y %2 == 0]
print(l4)
--->
[4, 16, 36, 64, 100]
还可以使用两层循环,可以生成全排列
l5 = [m + n for m in "ABC" for n in "XYZ"]
print(l5)
---->
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三层和三层以上的循环用的比较少。
for循环其实可以同时使用两个甚至多个变量,如:
#dict的items()可以同时迭代key和value
d = {"x":"a","y":"b","z":"c"}
for k,v in d.items():
print(k, "=", v)
使用两个变量来生成list
#使用两个变量来生成list
d = {"X":"A","Y":"B","Z":"C"}
l = [k + "=" + v for k,v in d.items()]
print(l)
---->
['X=A', 'Y=B', 'Z=C']
把一个list中所有的字符串变成小写
#把一个list中所有的字符串变成小写
l = ["TOM","CAT","DOG","BIG","SAMLL"]
print([s.lower() for s in l])
---->
['tom', 'cat', 'dog', 'big', 'samll']
小结:
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,代码十分简洁.
生成器
概念
生成器(generator),一边循环一边计算的机制。
创建generator的方法
1.把一个列表生成式的[]
改成()
,就创建了一个generator
2.要把fib
函数变成generator
,只需要把print(b)
改为yield b
就可以了。如果一个函数定义中包含yield关键字
,那么这个函数就不再是一个普通函数,而是一个generator
:
方法1:将列表生成式的[]
改成()
定义generator
#原定义list
L = [x * x for x in range(1,11)]
print(L)
#定义generator
g = (x * x for x in range(1,11))
print(g)
--->
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
<generator object <genexpr> at 0x000002636007A318>
创建L和g的区别仅在于最外层的[]
和()
,L是一个list,而g是一个generator。
打印generator
通过next()
函数获得generator的下一个返回值,如:
#定义generator
g = (x * x for x in range(1,11))
#打印genertor
for x in range(1,11):
print(next(g))
---->
1
4
9
16
25
36
49
64
81
100
generator保存的是算法,每次调用next(g)
,就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration
的错误。