Python(5)-(高级特性)

切片( Slice)[:]

何为切片?从list或者tuple,dict等中取一段数据的操作。
比如,从list中取第2-5个元素,按照之前的做法,只能采用[L[1],L[2],L[3],L[4]] 不仅麻烦而且当数据特别多的时候,只能采用循环来做。
使用切片若需要取2-5个元素,则可以:L[1:5] 获取的就是第2-第5个元素。
当从索引0开始时,0可以省略,也就是[:n]取第0到第n个元素
同样支持倒数的切片,若取最后三个数据,则L[-3:]
支持按一定间隔选取数据,比如:L[::2] 将所有数据每两个取一次元素
支持切片的数据结构:list,tuple,字符串
实例:
利用切片操作,去除字符串首尾的空格

def a(s):
    while s[0]==' ':
        s=s[1:]
    while s[-1]==' ':
        s=s[:-1]
    return s

代码运行结果如下:
这里写图片描述
这是对字符串的切片。

迭代(lteration)

何为迭代?其实就是一种遍历,使用for...in 来实现。
1. 对list和tuple的迭代:

def a(L):
    sum=0
    for n in L:
        sum=sum+n
    return sum

以上代码是1+2+3+... 的运算,L可以是list,tuple,执行结果如下:
这里写图片描述
2. 对字符串的迭代:

#函数功能是取出字符串中最大字母值
def max(L):
    max='a'
    for n in L:
        if max<n:
            max=n
    return max

执行结果如下:
这里写图片描述
3. 对dict的迭代
对dict的迭代,默认是对key 的迭代,如果要迭代value,可用for value in L.values() ,如果要同时迭代keyvalue ,可用for k,v in L.items()
实例如下:

def score(L):
    for num in L:
        print(num)
    return None

代码执行结果如下:
这里写图片描述
可以看出,默认的迭代是对key 进行迭代。

def score(L):
    for num in L.values():#对value的迭代
        print(num)
    for num,v in L.items():#对key和value的迭代
        print(num,v)
    return None

执行结果如下:
这里写图片描述
那么,如何判断一个对象是否能迭代呢,用内置的collections 模块的iterable 类型判断
这里写图片描述
所以整数是不可以迭代的

列表生成式

作用:以最简便的方法生成想要的list。
例如:要生成一个[1*1,2*2,....100*100] 的列表,我们可以用循环来实现,带式太麻烦,所以用列表生成式来生成,比如[x*x for x in range(100)],实现如下:
这里写图片描述
列表生成式还可以添加if判断,比如要求删选出能被2整除的数。

[x*x for x in range(100) if x%2==0]

也可以使用两层循环

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

输出为:

['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

生成器(generator)

作用:当需要生成一个特别大的列表,或者列表按照一定算法生成时,我们不需要列出所有满足条件的元素,可以用生成器。
特点:保存在内存中的不再是一个个的元素,而是算法,所以节省内存空间。
方法1:直接将列表生成器的[] 改为() 即可,如下:

L=(x*x for x in range(100))

以上代码生成的就是一个generator。
这里写图片描述
方法2:使用yield
比如:生成斐波拉契数列

def fib(n):
    a=0
    b=1
    t=0
    for m in range(n):
        t=a
        a=b
        print('执行')
        yield(b)
        b=b+t
        print('相加')
    return 'done'

执行结果如下:
这里写图片描述
由图中可以看出,当第一次执行next 函数时,执行到yidld 则结束执行,当再次运行next 时,从yield 开始执行,到yield 执行再次结束。
综上,每次调用next()时 遇到yield 语句则返回,再次执行从上次返回的yield 语句继续执行
如何获取列表返回值:
1. 使用next()函数 ,如上
2. 使用for循环:
这里写图片描述
从上图运行结果可以看出,无论如何都打印不出generator 的返回值error
3.使用while可以打印 generator 的返回值

def fib(n):#生成器,生成斐波拉契数列
    a=0
    b=1
    t=0
    for m in range(n):
        t=a
        a=b
        #print('执行')
        yield(b)
        b=b+t
        #print('相加')
    return 'error'
def a(n):#调用生成器,打印n个元素
    b=fib(n)
    while True:
        try:
            x=next(b)
            print(x)
        except StopIteration as e:
            print('Generator return value:',e.value)
            break
    return 'finish'

图中可以看出,若要拿到返回值,必须捕获StopIteration 错误,返回值包含在StopIterationvalue 中。

迭代器

可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator
**可迭代对象Iterable
从以上可以看出,list,tuple,dict,set,str等都可以使用for来迭代,generator也可以,所以其都是可迭代对象Iterable 可以使用isinstance()来判断一个对象是不是Iterable 对象。要首先添加from collections import Iterable这一行 **
这里写图片描述
生成器不仅可以作用于for 循环,还可以用next() 不断调用返回下一个值,直到最后抛出StopIteration错误 。
**生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:**
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_21961385/article/details/80959255