python基础2

高级特性

切片

切片即取一个list 或者 tuple 的部分元素

L= ["abc", "bcd", "efg", 123, 666]

L[0 : 3]    #取前3个元素,左闭右开
L[ : 3]     #取前3个元素,左端索引为0可省略
L[-2 : ]    #取倒数第2个一直到末尾
L[-3: -1]   #取倒数第3和第2个,注意倒数第一个元素的索引是-1

L[ :10 :2]    #取前10个数,每2个取1个

L[:]    #原样复制一个list

注:tuple也可切片,结果仍是tuple; str同理

迭代

迭代即便利某个list或者tuple,或者str

#dict 迭代key
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print(key)

#dict默认迭代key,若要迭代value
for val in d.values():
    print(val)

#同时迭代key 和 value
for k, v in d.items():
    print(k, v)

#如果在迭代list时想要下标,可使用 enumerate 函数把list变成索引-元素对
for i, val in enumerate(['A', 'B', 'C'])
    print(i, val)

列表生成式

列表生成式在python中用来生成list

#生成内容为1到10的list
list( range(1, 11) )
#生成从1到10的平方的列表,先把x*x写在前面,列表生成式则用for循环的形式
L = [x*x for x in range(1, 11) ]    
#可以在for循环后加上if,筛选出偶数的平方
L = [x*x for x in range(1, 11) if x % 2 == 0]  

#使用双层嵌套循环,生成全排列
[s1 + s2 for s1 in 'ABC' for s2 in 'XYZ']

#遍历字典生成全排列
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + 'v' for k, v in d.items()]

生成器 generator

生成器可以使得在循环的过程中不断推算出后面元素,而不必创建完整的list,从而可以节省空间

生成器有两种:列表生成式构造的生成器、由函数构造的生成器

1)列表生成式构造的生成器:将列表生成式的 [ ] 改成 ( ) 即可

L = [x * x for x in range(10)]    #普通的列表生成式

g = (x*x for x in range(10))    #g是一个生成器
print(next(g))      #用next()函数可以获得generator的下一个返回值,没有元素时继续调用next() 会抛出StopIteration错误

g = (x*x for x in range(10))    #g是一个生成器
for i in g:      #生成器也是可迭代对象,因此可以用for循环
    print(i)

2)由函数构造的生成器:使用yield

#例子1
def odd():      #函数中包含yield关键字,则函数不再是普通函数,而是generator
    print('step 1')
    yield 1
    print('step 2')
    yield 3
    print('step 3')
    yield 5
myOdd = odd()      #这也不是普通的函数调用,而是生成了一个generator对象
next(myOdd)        #用next() 函数不断获得下一个返回值

yield:函数执行到yield之后就进行返回,等到下次next()执行时,从上次返回的yield下方继续执行

#例子2,输出杨辉三角:将每一行看作一个list,写一个generator,使得能不断输出下一行的list
def triang():
    L = [1]
    while True:
        yield L
        lens = len(L)
        L = [ L[n] + L[n+1] for n in range(0, lens - 1)]#生成每行除了一头一尾的所有数字
        L.insert(0, 1)    #添加开头的1
        L.append(1)    #添加末尾的1

注意:1.杨辉三角的第n+1行每一个元素都是第n行的上面两个数的和(除了一头一尾的两个1)

           2.while True 很常用

 迭代器

可迭代对象 Iterable:可以直接作用于for循环的对象称为可迭代对象,如 list、tuple、dict、set、str等;可使用isinstance() 判断一个对象是否是Iterable对象

isinstance([], Iterable)      #判断是否是可迭代对象
isinstance('abc', Iterable)
isinstance((x for x in range(10)), Iterable)

迭代器对象 Iterator:可以被next() 函数调用并不断返回下一个值的对象称为迭代器对象;可使用isinstance() 判断对象是否是Iterator对象;

 isinstance((x for x in range(10)), Iterator)      #生成器既是可迭代对象,又是迭代器对象

iter([1,2,3])      #iter() 函数可以把可迭代对象变成迭代器对象
iter("abcdef")
原文地址:https://www.cnblogs.com/zhuqiwei-blog/p/10404171.html