今天进入高级特性的学习啦,其实就是怎么能更简单的写代码。

高级特性

切片

记住一个关键就是切片的时候含头不含尾!!!

  • 之前在学习基本类型的时候提到过这个特性,就是将字符串或者列表的一部分截取出来。
list = ['one', 'two', 'three', 'four', 'five']  
# 取出该list的前三个元素组成一个新的list
print(list[0: 3])
运行结果:
['one', 'two', 'three']
  • list[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引012,正好是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>

创建Lg的区别仅在于最外层的[]()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类型,它们表示一个惰性计算的序列;
  • 集合数据类型如listdictstr等是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

部分内容参考:
https://www.liaoxuefeng.com/w...


周兆东
107 声望21 粉丝

一个java小白的成长之路。。。