今天进入高级特性的学习啦,其实就是怎么能更简单的写代码。
高级特性
切片
记住一个关键就是切片的时候含头不含尾!!!
- 之前在学习基本类型的时候提到过这个特性,就是将字符串或者列表的一部分截取出来。
list = ['one', 'two', 'three', 'four', 'five']
# 取出该list的前三个元素组成一个新的list
print(list[0: 3])
运行结果:
['one', 'two', 'three']
-
list[0:3]
表示,从索引0
开始取,直到索引3
为止,但不包括索引3
。即索引0
,1
,2
,正好是3个元素。
如果第一个索引为0
的话,还是可以省略的。
list = ['one', 'two', 'three', 'four', 'five']
# 取出该list的前三个元素组成一个新的list
print(list[: 3])
运行结果:
['one', 'two', 'three']
- python支持倒数切片,记住倒数第一个元素的索引是
-1
。
list = ['one', 'two', 'three', 'four', 'five']
# 取出该list倒数第三个之前所有元素组成一个新的list
print(list[: -3])
运行结果:
['one', 'two']
- 最后还有一个就是可以按照某个规则进行获取
list = ['one', 'two', 'three', 'four', 'five']
# 所有的元素里面每隔两个取一个元素
print(list[::2])
运行结果:
['one', 'three', 'five']
迭代
通过for循环遍历一个list。
list = ['one', 'two', 'three', 'four', 'five']
for value in list:
# 将list中每一个元素都打印出来
print(value)
运行结果:
one
two
three
four
five
可以遍历字典的key和value:
y = {'a': 1, 'b': 2, 'c': 3}
for a in y.keys():
print(a)
for b in y.values():
print(b)
运行结果:
a
b
c
1
2
3
列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
python range()
函数可创建一个整数列表,一般用在 for 循环中。
# 如果是单纯生成一个整数列表,那么我们直接使用range()就可以了,可是如果我们需要生成复杂的话就需要列表生成式了。
# 生成一个1到10的list
l = range(1,11)
print(l)
# 生成一个1到10的平方的list
t = [x * x for x in range(1, 11)]
print(t)
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
还可以生成更复杂更多条件的列表
# 生成一个1到10中偶数的平方list
l = [x * x for x in range(1, 11) if x % 2 == 0]
print(l)
运行结果:
[4, 16, 36, 64, 100]
生成器
通过列表生成器我们可以生成符合要求的所有列表,可是如果我们想要生成一个非常大的列表的话要怎么办呢?
在Python中,有种一边循环一边计算的机制,称为生成器:generator
。
# 创建一个list
l = [x * x for x in range(1,11) if x % 2 == 0]
print(l)
# 创建一个generator
g = (x * x for x in range(1,11) if x % 2 == 0)
print(g)
运行结果:
[4, 16, 36, 64, 100]
<generator object <genexpr> at 0x000001C600C81B30>
创建L
和g
的区别仅在于最外层的[]
和()
,L
是一个list,而g
是一个generator。
打印generator元素可以使用next(g),每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
g = (x * x for x in range(1, 11) if x % 2 == 0)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
运行结果:
4
16
36
64
100
Traceback (most recent call last):
File "D:/WorkSpace/Study/pythonTest/dataType.py", line 7, in <module>
print(next(g))
StopIteration
当然也可以使用for循环进行迭代,不会有任何异常。
g = (x * x for x in range(1, 11) if x % 2 == 0)
for value in g:
print(value)
运行结果:
4
16
36
64
100
迭代器
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象:
a = isinstance((x for x in range(10)), Iterator)
print(a)
a = isinstance([], Iterator)
print(a)
a = isinstance({}, Iterator)
print(a)
a = isinstance('abcd', Iterator)
print(a)
运行结果:
True
False
False
False
- 凡是可作用于
for
循环的对象都是Iterable
类型; - 凡是可作用于
next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列; - 集合数据类型如
list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
# 通过iter()获得一个Iterator对象
a = isinstance(iter([]), Iterator)
print(a)
a = isinstance(iter({}), Iterator)
print(a)
a = isinstance(iter('abcd'), Iterator)
print(a)
运行结果:
True
True
True
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。