python标准库、解析式、生成器

2018-08-22  本文已影响0人  vampire6

标准库

datetime模块

time模块

解析式

列表解析式

  1. 语法:
  1. 列表解析式是一种语法糖:
  1. 举例:
#普通
even = []
for x in range(10):
  if x % 2 == 0:
    even.append(x)
 
#解析式
even = [x for x in range(10) if x%2 == 0]
  1. 思考:
[i for i in range(20) if not i % 2 and i % 3 == 0]
[i for i in range(20) if not i % 2 if i % 3 == 0]
import string
import random
x= string.ascii_lowercase
["{:>04}.{}".format(i,"".join(random.choices(x,k = 10))) for i in range(1,8)]

['0001.rvverptnre',
 '0002.beqkpbxhfl',
 '0003.woxvvayzjo',
 '0004.wrbnnkelcc',
 '0005.kpsjowcfvz',
 '0006.pnqwqzlttc',
 '0007.wehobydqnf']

字典解析式

  1. 语法:
{x:(x,x+1) for x in range(10)}
{x:[x,x+1] for x in range(10)}
{(x,):[x,x+1] for x in range(10)}
{[x]:[x,x+1] for x in range(10)} #[x]不可哈希,字典的k要求可哈希
{chr(0x41+x):x**2 for x in range(10)}
{str(x):y for x in range(3) for y in range(4)} # 输出多少个元素?
#会覆盖,返回{0:3,1:3,2:3}

集合解析式

  1. 语法
{(x,x+1) for x in range(10)}
{[x] for x in range(10)} #[x]是个集合,不能哈希,所以放在集合解析式里面会报错

生成器

生成器Generator

生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。

生成器函数:

  1. 函数体内包含yield语句的函数,返回一个生成器对象,生成器函数的函数体不会立即执行。

    生成器对象,是一个可迭代对象,是一个迭代器。

  2. 生成器对象,是延迟计算,惰性求值。

  3. next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行。

  4. 再次执行会执行到下一个yield语句,没有多余的yield语句能执行,如果函数没有显式的return语句,继续调用next函数就会抛出StopIteration异常。

  5. return会导致无法继续获取下一个值,抛出StopIteration异常。

  6. 生成器函数,它是函数,不过这个函数不像普通的函数调用时能返回一个合法的值,它返回的是一个还没有求过任何值的生成器对象,用next拨一下才会往后执行一下。

    #举例
    def gen():
        print('line 1')
        yield 1
        print('line 2')
        yield 2
        print('line 3')
        return 3
    next(gen()) # line 1
    next(gen()) # line 1
    g = gen()
    print(next(g)) # line 1
    print(next(g)) # line 2
    print(next(g, 'End')) # 没有元素给个缺省值
    print(next(g, 'End')) # 没有元素给个缺省值
    

生成器的应用

#计数器
def inc():
    def counter():
        i = 0
        while True:
            i += 1
            yield i
    c = counter()
    return lambda : next(c)

foo = inc()
print(foo())   #调用的时候是因为inc()函数返回的是一个匿名函数,而匿名函数的调用方式是(lambda 参数列表:函数体)(),所以调用的时候是foo后要加上(),即也就是inc()()。


#等价于
def inc():
    def counter():
        i = 0
        while True:
            i += 1
            yield i
    c = counter()
    
    def _inc():  #用到外面的自由变量(c):闭包
        return next(c)
    return _inc
foo = inc()    #可调用对象,函数
print(foo())
yield from

yield from是python3.3出现的新语法

yield from iterable 是for item in iterable: yield item形式的语法糖。

for x in range(1000):
    yield x
    
#等价于

yield from range(1000)

从可迭代对象中一个个拿数据

def counter(n):   #生成器,迭代器
    for x in range(n):
        yield x
        
def inc(n):
    yield from counter(n)
    
foo = inc(10)
print(next(foo))
print(next(foo))
协程coroutine

生成器的高级用法
比进程、线程轻量级
是在用户空间调度函数的一种实现
Python3 asyncio就是协程实现,已经加入到标准库
Python3.5 使用async、await关键字直接原生支持协程
协程调度器实现思路

协程是一种非抢占式调度

生成器表达式Generator expression
  1. 语法
  1. 和列表解析式的区别
  1. 和列表解析式的对比
  1. 生成器

内建函数

  1. 标识 id
  1. 哈希 hash()
  1. 类型 type()
  1. 类型转换
  1. 输入 input([prompt])
  1. 打印 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  1. 对象长度 len(s)
  1. isinstance(obj, class_or_tuple)
  1. issubclass(cls, class_or_tuple)
  1. 绝对值abs(x) x为数值

  2. 最大值max() 最小值min()

  1. round(x) 四舍六入五取偶,round(-0.5)

  2. pow(x , y) 等价于 x**y

  3. range(stop) 从0开始到stop-1的可迭代对象;range(start, stop[, step])从start开始到stop-1结束步长为step的可迭代对象

  4. divmod(x, y) 等价于 tuple (x//y, x%y)

  5. sum(iterable[, start]) 对可迭代对象的所有数值元素求和,start:初始值

  1. chr(i) 给一个一定范围的整数返回对应的字符
  1. ord(c) 返回字符对应的整数
  1. sorted
    sorted(iterable[, key][, reverse] )排序
sorted([1, 3, 5])
sorted([1, 3, 5], reverse=True)
sorted({'c':1, 'b':2, 'a':1})
  1. 翻转 reversed(seq)
    返回一个翻转元素的迭代器(惰性求值)
list(reversed("13579"))
{ reversed((2, 4)) } # 有几个元素?
for x in reversed(['c','b','a']):
    print(x)
reversed(sorted({1, 5, 9}))
  1. 枚举 enumerate(seq, start=0)

迭代一个序列,返回索引数字和元素构成的二元组
start表示索引开始的数字,默认是0

for x in enumerate([2,4,6,8]):
    print(x)
for x in enumerate("abcde"):
    print(x,end=" ")
  1. 迭代器和取元素 iter(iterable)、next(iterator[, default])

iter将一个可迭代对象封装成一个迭代器
next对一个迭代器取下一个元素。如果全部元素都取过了,再次next会抛StopIteration异常

    it = iter(range(5))
    next(it)
    
    it = reversed([1,3,5])
    next(it)
  1. 拉链函数zip(*iterables)
    像拉链一样,把多个可迭代对象合并在一起,返回一个迭代器
    将每次从不同对象中取到的元素合并成一个元组
list(zip(range(10),range(10)))
list(zip(range(10),range(10),range(5),range(10)))

dict(zip(range(10),range(10)))
{str(x):y for x,y in zip(range(10),range(10))}
上一篇 下一篇

猜你喜欢

热点阅读