1、字符串格式化1.1 f-string格式化字符串快速把变量、表达式嵌入字符串内部用法{内容:格式符} 内容变量 / 表达式 冒号后控制数字精度、对齐、进制、填充样式1变量值加入字符串name张三age22sf姓名{name}年龄{age}print(s)输出姓名张三年龄222表达式结果加入字符串a10b3print(f总和{ab}取整除法{a//b})print(f大写{hello.upper()})输出总和13取整除法3 大写HELLO3保留小数位num3.1415926af{num:.2f}print(a)3.14bf{num:.4f}print(b)3.14164千位分隔符money1234567cf{money:,}print(c)输出1,234,5675百分比格式rate0.785cf{rate:.1%}print(c)输出78.5%6补零、固定宽度占3位前面补0n5cf{n:03d}print(c)输出005占5个字符宽度右对齐cf{n:5d}print(c)输出57 左对齐、 右对齐、^ 居中8进制转换val15f{val:d}15f{val:x}ff{val:X}Ff{val:b}11119转义 {{}}f{{hello}}{hello}10嵌套f-stringnum3.14resf结果{f{num:.2f}}print(res)结果3.1411字典、对象取值user{id:1,nick:小李}fid:{user[id]},昵称:{user[nick]}id:1,昵称:小李2、asyncio2.1 异步IOasyncio Python 单线程异步 IO 编程库靠协程 事件循环实现网络 IO 并发示例importasyncioasyncdeftest():awaitasyncio.sleep(2)return执行完毕resasyncio.run(test())print(res)调用 asyncio.run 后等待test执行完毕再往下执行。2.2 同步阻塞、异步并发注意调用 asyncio.run 会卡住站在使用者角度是同步阻塞但是协程内部是异步并发的。一个 async def 函数里面遇到await 等待、休眠时不会霸占 CPU事件循环可以切换去跑其他协程这就是异步的本质内部可以同时干多件事。外部调用者必须等整个异步程序全部跑完才交出控制权回到普通代码所以外层看起来是阻塞卡住的。2.3 async def协程函数被 async def 关键字修饰的函数统一叫做协程函数形式如下asyncdefwork():awaitasyncio.sleep(1)return10直接调用协程函数不会直接执行而是生成一个协程对象协程对象交由事件循环运行asyncio.run然后执行协程函数中的代码2.4 await 关键字await 关键字是协程内部专用的只能写在 async def 函数里遇到 await xxx当前协程暂停、让出 CPU 控制权事件循环去执行其他就绪任务等待 IO 操作休眠、网络请求完成后再切回来继续执行当前协程2.5 多任务异步执行示例两个任务并发执行asyncdefa():awaitasyncio.sleep(2);print(A)asyncdefb():awaitasyncio.sleep(1);print(B)asyncdefmain():t1asyncio.create_task(a())t2asyncio.create_task(b())awaitt1awaitt2 asyncio.run(main())虽然两个任务a和b分别执行2秒、1秒但是整体只执行2秒2.6 asyncio.gather 批量执行importasyncio# 定义几个异步任务asyncdeftask1():awaitasyncio.sleep(2)# 模拟耗时IOreturn任务1完成asyncdeftask2():awaitasyncio.sleep(1)return任务2完成asyncdeftask3():awaitasyncio.sleep(1.5)return任务3完成asyncdefmain():resultsawaitasyncio.gather(task1(),task2(),task3())print(results)# 结果顺序永远和传入顺序一致if__name____main__:asyncio.run(main())输出[任务1完成, 任务2完成, 任务3完成]2.7 loop.run_forever事件永久运行使用步骤1asyncio.get_event_loop()获取当前线程的事件循环对象EventLoop所有协程、异步任务、IO 事件都由这个循环统一调度执行2loop.run_forever()让事件循环永久无限运行不会主动退出当触发loop.stop()、loop.close()或者系统发送的终止信号时退出事件循环3示例importasyncioasyncdeftask():whileTrue:print(异步任务运行中)awaitasyncio.sleep(1)loopasyncio.get_event_loop()loop.create_task(task())loop.run_forever()4对比run()方法python3.6及之前使用 loop.run_forever()pyhton3.7之后推荐使用新方法 asyncio.run()asyncdefmain():whileTrue:print(异步任务运行中)awaitasyncio.sleep(1)asyncio.run(main())2.8 run_until_complete一次性异步运行直到传入的协程执行完毕就退出2.9 进程不退出loopasyncio.get_event_loop()…… loop.run_forever()如果将代码功能放入单独线程中运行主线程没有永久循环时进程会退出可以使用上面的方式实现进程常驻、“保持运行”。作用和 threading.Event().wait() 或 while True: time.sleep(1) 类似