您的位置:首页 > 编程语言 > Python开发

Python高级特性(切片,迭代,列表生成式、生成器、迭代器)

2017-12-15 09:17 1281 查看
[align=left]一、切片:取出list或者tuple的任意 元素([b]部分或者所有)[/b][/align]
[align=left]      1. 语法:L[a:b:c]  ,表示取出L中的从a到b的元素,每c个取一次,当a为0时可以省略不写即L[:b:c],当c为1时可以不写即L[a:b],[/align]
eg:  lis=[1,2,3,4,5,6]

       print(lis[0:5:2])#输出[1, 3, 5],从0到5(含前不含后,包0不包5,即索引0到4),每2个元素取一次
[align=left]      切片也支持逆序,上述print(list(L[-5:])) 输出结果为[2, 3, 4, 5, 6]即从-5到-1,记住倒数第一个元素的索引是
-1
。[/align]
     2. 
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
[align=left]     eg:print((10,11,12,13,13,14,15)[:3])输出结果为(10, 11, 12)[/align]
[align=left]    3.字符串也是一种list,也可以进行切片操作
[/align]
[align=left]    eg: print('ABCDEFG'[::3])输出结果为ADG[/align]
      综合栗子:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的
strip()
方法  

st='   abc   '
print(st.strip())
def trim(S):
s=''
for x in S:
if x==' ':
continue
else:
s=s+x
return s
print(trim(st))
二、迭代:给定一个list或tuple,我们可以通过
for ... in
来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),除了list和tupe之外还可以迭代任何其他可迭代的对象,比如字符串,dirct等
[align=left]判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断   
[/align]
from collections import Iterable
print(isinstance('abc',Iterable))
print(isinstance(23,Iterable))#整数是不可迭代的
Python内置的
enumerate
函数可以把一个list变成索引-元素对,
for i,value in enumerate(['A','B','C']):#通过enumerate函数可以把一个list变成索引元素对
print(i,value)
迭代dirct
for key in d:#迭代key
print(key)
for value in d.values():#迭代value
print(value)
for key,value in d.items():#迭代key value
print(key,value)

[align=left]综合栗子:用迭代查找一个list中最小和最大值,并返回一个tuple[/align]
def findMinAndMax(L):
min=L[0]
max=L[0]
for x in L:
if x<min:
min=x
if x>max:
max=x
return (min,max)
print(findMinAndMax([12,34,23]))
三、列表生成式:将一种运算规则作用于一个列表从而生成一个新的列表
[align=left]
print([x*x for x in range(1,11)])#生成[1x1, 2x2, 3x3, ..., 10x10]
将乘方运算作用于一个list,输出[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
print([m+n for m in 'ABC' for n in 'XYZ'])#双层循环
输出['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'][/align]
[align=left]双层循环可以作用于多个对象[/align]
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print([k+'='+v for k,v in d.items()])
输出['y=B', 'z=C', 'x=A']

[align=left]综合栗子:list中所有的字符串变成小写
[/align]
L1 = ['Hello', 'World', 18, 'Apple', None]
print([s.lower() for s in L1 if isinstance(s,Iterable)])
四、生成器(generator),在Python中,这种一边循环一边计算的机制,称为生成器(Generator)属于列表生成式的进化,比列表生成式更节约内存,
1.创建方式一:将列表生成式的[]改为(),eg
g=(x*x for x in range(10))
生成器的核心在于算法,如果算法比较复杂可以将算法写成函数

2..创建方式二:一个函数 中含有yield关键字

      变成generator的函数,在每次调用
next()
的时候执行,遇到
yield
语句返回,再次执行时从上次返回的
yield
语句处继续
执行。
eg:
def odd():
print('step1')
yield 1
print('step2')
yield 2
print('step3')
yield 3
s=odd()
print(next(s))#python3.x中next()函数代替2.x中的.next()方法
print(next(s))
print(next(s))
输出结果为


综合栗子:
杨辉三角定义如下:

1
/ \
1   1
/ \ / \
1   2   1
/ \ / \ / \
1   3   3   1
/ \ / \ / \ / \
1   4   6   4   1
/ \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list:

def triangles(n): #共n行但是下标是从0-(n-1)
    i=0
    L=[1]    
    if n<0:
        return
    elif n==1:    
        yield L         
    else:
        if i==0:
            i=i+1
            yield L
        while i<=n:                    
            L=[1]+[L[x]+L[x+1] for x in range(i-1)]+[1]                                         
            yield L
            i=i+1    
for l in triangles(6):
    print(l)
运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: