Python高级特性之切片、迭代

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu1014745867/article/details/82914912

切片

背景说明:
针对字符串提供了很多各种截取函数(例如,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的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。

迭代

概念

如果给定一个listtuple,我们可以通过for循环来遍历这个listtuple,这种遍历我们称为迭代(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的错误。

方法2:包含yield关键字

迭代器

猜你喜欢

转载自blog.csdn.net/yu1014745867/article/details/82914912
今日推荐