python学习-高级特性

切片

# 切片获取list或tuple的部分元素
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])
# L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
# 如果第一个索引是0,还可以省略:
print(L[:3])
# 倒数切片(倒数第一个索引是-1)
print(L[-1:],L[0:-1])

ls = list(range(101))
# 第二个:后表示间隔
print(ls[::5])
# 字符串和tuple 是不可变序列, 也能使用切片, 返回的是新的拷贝对象
strs="this is my life"
tups=(1,2,3,4,5,64,6,7)
print(strs[0:-1:2],tups[0:-1:3])

迭代

li = list(range(0,100,3))
dict =  {'a': 1, 'b': 2, 'c': 3}
strs = "this is a simple string"
# for i in li:
#     print(i)

# for k in dict:
#     print(k)
   
# for s in strs:
    # print(s)
    
# 只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。
# 判断是否可迭代
from collections.abc import Iterable
print(isinstance(dict.keys,Iterable))
print(isinstance(li,Iterable))
print(isinstance(strs,Iterable))

# 获取下标
# for i,value in enumerate(li):
    # print(i,value)
# 同时引用两个变量
for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x,y)
    

列表生成器

# 生成间隔为1的序列[0,10)
print(list(range(1,11,1)))
# 生成[1x1, 2x2, 3x3, ..., 10x10]: for前面表达式进行计算, 后面的if语句用于过滤
print([x*x for x in list(range(1,11))])
# for循环后面还可以加上if判断(if语句用于过滤, 不能添加else)
print([x*x for x in list(range(1,11)) if(x % 2 == 0)])
# 使用两层循环,可以生成全排列
print([m + n for m in 'ABC' for n in 'XYZ'])
# 列出当前目录下的所有文件和目录名
import os
print([d for d in os.listdir('.')])
# 使用两个变量来生成list
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print([k+'='+v for k,v in d.items()])

列表生成器

# 必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。
# 方法一:把一个列表生成式的[]改成(),就创建了一个generator
L = [x * x for x in range(10)]
print(type(L),L) 
g = (x * x for x in range(10))
print(type(g),g,next(g),next(g)) 

# for n in g:
    # print(n)

# 斐波那契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        # print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
# fib(10)

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        # 使用yield将方法变为生成器
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
print(type(fib(10)))

for n in fib(10):
    print(n)

迭代器

# 可以直接作用于for循环的数据类型有以下几种:
# 一类是集合数据类型,如list、tuple、dict、set、str等;
# 一类是generator,包括生成器和带yield的generator function。
# 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
# 可以使用isinstance()判断一个对象是否是Iterable对象:
from collections import Iterable
from typing import Iterator
print(isinstance({},Iterable))
print(isinstance([],Iterable))
print(isinstance('abc',Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(100,Iterable))# False

# 被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
print(isinstance({},Iterator)) # False
print(isinstance([],Iterator)) # False
print(isinstance('abc',Iterator)) # False
print(isinstance((x for x in range(10)),Iterator)) # True

# 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator
# 使用iter() 函数将list, dict,str转为Iterator
print(isinstance(iter({}),Iterator)) # True
print(isinstance(iter([]),Iterator)) # True
print(isinstance(iter('abc'),Iterator)) # True

# Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误
# Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。数据长度不确定 使用list是永远不可能存储全体自然数的。

# 一个 Iterator 对象需且仅需同时具有 __iter__ 和 __next__ 方法
class IteratorExample:
    def __iter__(self):
        pass
    def __next__(sefl):
        pass

print(isinstance(IteratorExample(), Iterator)) # True
上一篇:python基础:列表推导式|迭代器|生成器|匿名函数


下一篇:dirmap改造计划