Python 高级特性,,切片及其用法对于一个


切片及其用法

对于一个列表L = [1, 2, 3, 4, 5, 6, 7, 8, 9],我们使用切片来获取特定元素

#获取第1个到第3个(数组下标从0开始,切片是左闭右开的区间,也就是包含0,不包含3)L[0:3]#获取第2个到第五个L[1:5]#取倒数第5个到倒数第2个L[-5:-1]#取第2个到最后一个L[3:]#前5个数,每2个取一个L[:5:2]#所有数,每个两个取一个L[::2]

什么类型能进行切片?

字符串列表元组

注意:集合、字典不能进行切片操作

列表生成式

生成式的基本语法

[expr for iter_var in iterable][expr for iter_var in iterable if cond_expr]

第一种语法:首先迭代 iterable 里所有内容,每一次迭代,都把 iterable 里相应内容放到iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

第二种语法:加入了判断语句,只有满足条件的内容才把 iterable 里相应内容放到 iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

#生成一个10个元素的数据,每个分别对应 1-10的两倍my_list = [x * 2 for x in range(1, 11)]print(my_list)#生成一个100以内所有偶数的列表my_list = [x for x in range(1, 101) if x % 2 == 0]print(my_list)#使用列表生成式生成[[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5]] 这样的列表my_list = [[x, y] for x in range(1, 3) for y in range(6)]print(my_list)

迭代

在Python中,只要是可迭代的对象,无论有没有下标,都可以进行迭代,比如:list、set、tuple、str、dict

如何判断一个对象是不是可迭代的?

from collections.abc import Iterableprint(isinstance(‘aaa‘, Iterable))

如果可迭代对象里的数据成对出现,想一次性遍历出两个对象,怎么办?

for x, y in [(1, 2), (4, 5)]:  print("x+y=", x + y)

生成器

通过列表生成式,可以直接创建一个列表,但是,受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。所以可以通过生成器 Generator 生成。

生成器是一种一边循环一边计算的机制。

相比于列表生成式,只需将最外层的[ ]换成( )即可。随着变换,返回的类型也随着变动

#列表生成式,返回的是list: print(type([x * 2 for x in range(1, 11)])) #生成器,返回的是generator类型: print(type((x * 2 for x in range(1, 11)))) 

生成器怎么使用?

直接使用next(generator)

c= (x * 2 for x in range(1, 11))print(next(range_))print(next(range_))print(next(range_))print(next(range_))

缺点:有多少个可获取的元素不可预估,当超出范围之后,会报StopIteration

使用循环

range_ = (x * 2 for x in range(1, 11))for i in range_:    print(i)

这种方式更加灵活,不用担心StopInteration

Python 高级特性

评论关闭