②Python高级特性_python

②Python高级特性

切片

取list和tuple的部分元素的常见操作,是Python的一个高级特性

具体用法如下所示:

>>> L=['Michael','Sarah','Tracy','Bob','Jack']
>>> L[:]#取全部元素
>>> L[:3]#取前三个元素
>>> L[-1]#取最后一个元素
>>> L[-2:-1]#取导数第二个元素

迭代

  • 1 .如果给定一个list或tuple,可以通过​​for​​循环来遍历这个list或tuple,这种遍历称为迭代(Iteration)
dict_1={'Name':'Michael','Age':22,'Gender':'male','Country':'China','College':'PKU'}
for i in list_1:
print(i)

for k in dict_1.items():
print(k)

for c,v in dict_1.items():
print(c+':'+str(v))
  • 2.如何判断一个对象是否是可迭代对象?

使用collections模块的Iterable类型判断

for collections import Iterable
isinstance('abc',Iterable)
isinstance([1,2,3],Iterable)
isinstance(123,Iterable)
  • 3.Python内置的​​enumerate​​函数

​enumernate​​​函数可以把一个list变成索引-元素对,这样就可以在​​for​​循环中同时迭代索引和元素本身

for i,value in enumerate(['a','b','c']):
print(i,value)

列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

假如有一个列表​​list_1=[1,2,3,4,5]​​,想要求解这个列表每个元素的平方值,那么应该怎么做呢?

传统的方式可能是通过循环的方式

list_1=[1,2,3,4,5]
L=[]
for x in range(1,6):
L.append(x*x)

但是循环太繁琐,而列表生成式正是解决这种问题的利器。

L=[x*x for x in range(1,6)]
print(L)

这种生成出来的列表是一次性全部生成出来,不是惰性序列。

还可以在​​for​​​循环后面加上​​if​​条件,进行元素的筛选。

L=[x*x for x in list_1 if x%2==0]

还可以使用两层循环,可以生成全排列

[m+n for m in 'ABC' for n in 'XYZ']

if…else…

使用列表生成式的时候,会出现一些混淆。

[x for x in range(1,11) if x % 2 == 0]

上面​​if​​​语句之后不能加​​else​​,会发生语法错误。

但是可以把​​if...else​​写在前面

[x if x % 2 == 0 else -x for x in range(1,11)]

写在前面的​​if​​​必须加​​else​​。

这是因为​​for​​​前面是表达式,后面是筛选条件。表达式的话必须是​​if...else​​​,筛选条件只能是​​if​​。

生成器

  • 1.通过列表生成式可以直接创建一个列表,但是受到内存限制,列表容量有限。创建一个包含100万元素的列表,不仅占用很大的存储空间,而且假如仅仅访问列表中几个元素的话,会造成很大的空间浪费。
  • 2.如果列表元素可以按照某种算法推算出来,那么就可以在循环的过程中不断推算出后续元素,从而不必创建完整的list,节省大量的空间。这种生成列表的方式成为生成器:generator。
  • 3.generator的创建方式有两种。
  • 第一种方式很简单,就是将列表生成式中的​​[]​​改为​​()​​,就创建了一个生成器,这种生成器是一个惰性序列。可以通过​​next()​​函数获得generator的下一个返回值。
g=(x*x for x in range(10))
for n in g:
print(n)
  • 第二种是函数,如果一个函数中包含​​yield​​关键字,那么这个函数就不再是一个普通函数,而是一个generator。
    函数执行到​​yield​​语句就会返回,再次执行时从上次返回的​​yield​​语句处继续执行。
def odd():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield 3

迭代器

  • 1.凡是可作用于​​for​​循环对象的都是​​Iterable​​类型;凡是可作用于​​next()​​函数的对象都是​​Iterable​​类型,它们表示一个惰性计算的序列;
  • 2.集合数据类型如​​list​​、​​dict​​、​​str​​等是​​Iterable​​但不是​​Iterator​​,不过可以通过​​iter()​​函数获得一个​​Iterator​​对象。Python的​​for​​循环本质上就是通过不断调用​​next()​​函数实现的。

②Python高级特性_列表生成式_02