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中,只要是可迭代的对象,无论有没有下标,都可以进行迭代,比如:listsettuplestrdict 

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

from collections.abc import Iterable
print(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 

相关推荐