上下文Context:程序执行中某个状态
上下文管理器:一个可以在程序中加载独立上下文的对象
#cm.__enter__()执行开始,返回结果绑定给对象引用
with <表达式> as <对象引用>:
<语句块>
#cm.__exit__()执行结果,退出上下文区域
with open('from_f.txt','r') as fi, \
open('to_f.txt','r') as fo:
for line in fi:
fo.write(line)
如何使用上下文管理器
class DemoClass:
def __init__(self,name):
self.name=name
def __enter__(self): #重载__enter__()方法
print('进入上下文管理器')
return self #as 引用是__enter__()返回值
def __exit__(self,exc_type,exc_val,exc_tb): #__exit__()方法
print('退出上下文管理器')
def run(self):
print('DemoClass的某个实例对象在运行')
with DemoClass('Python123') as d:
d.run()
'''
进入上下文管理器
DemoClass的某个实例对象在运行
退出上下文管理器
'''
迭代器类型 iterator types:实现容器中元素的迭代
迭代器类型 iterator types:实现容器中元素的迭代
迭代器类型:原理实例
class DemoIterator:
def __init__(self,container):
self.container=container
self.salt=len(self.container)
def __iter__(self):
return self
def __next__(self):
self.salt-=1
if self.salt>=0:
return self.container[self.salt]
else:
raise StopIteration
di=DemoIterator([1,2,3,4,5,6,7,8])
for i in di:
print(i,end=' ')
#输出:
#8,7,6,5,4,3,2,1
迭代器类型 iterator types:实现容器中元素的迭代
生成器Generator: 快速实现迭代器类型的方式
生成器Generator: 快速实现迭代器类型的方式
普通函数
计算资源被浪费
生成器:设计实例
def getValue(max):
import random
ls=list(range(10))
print(ls,end=",")
for i in range(max):
yield ls[random.randint(0,9)]
for i in getValue(10):
print(i)
#输出为:
'''
[0,1,2,3,4,5,6,7,8,9],0
9
9
0
3
0
4
2
9
5
'''
生成器函数的设计原则
装饰器Decorator: 以函数为参数实现其额外功能更新
装饰器Decorator: 以函数为参数实现其额外功能更新
def f(...):
...
f=staticmethod(f)
上面实例等价下面实例
@staticmethod
def f(...):
...
语法糖 Syntactic Sugar: 方便使用但无实质功能的语法
@f1(arg)
@f2
def func():
pass
#等价于
f1(arg)(f2(func))
装饰器
装饰器设计:实例
def bar(foo):
'''
装饰器函数必须返回一个函数对象引用
否则,无法利用语法糖
因此,需要内部定义一个函数
建议:都用wrapper这个名字
函数就是一段代码
如果没有语法糖,不必要非定义函数
'''
def wrapper(a): #wrapper函数要包含printA()所用参数
print("{:*^20}".format('BEGIN')) #wrapper函数内部要完成功能扩展
foo(a)
print("{:*^20}".format('END'))
return wrapper
@bar #装饰器的语法糖,此时原函数不再是原函数
def printA(a): #原函数:有一个参数
print("这是变量{}".format(a))
printA("Python123")
'''
这是变量Python123
******BEGIN*********
这是变量Python123
*******END**********
'''
装饰器使用场景
协程Coroutine:在程序层面的多段代码异步执行
async的用法
async def foo(): #协程函数
pass
async with lock: #协程上下文管理器
pass
async for data in pipeline: #协程迭代器
pass
await的用法
async def foo(db):
data=await db.fetch('SELECT ...') #在异步函数中,等待其他函数返回结果的保留字
pass
'''
获取异步协程的结果
结果为awaitable对象
'''
协程初步
import asyncio
async def net():
return 11
async def main():
net() #error异步函数无法直接调用
d=await net() #right
print(d)
asyncio.run(main())
#输出为:11
'''
也可以使用
async def main():
task=asyncio.create_task(net)
await task
'''
import asyncio
async def hello(i):
print('hello',i)
await asyncio.sleep(3)
print('world',i)
if __name__=='__main__':
tasks=[]
for i in range(4):
tasks.append(hello(i))
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
保留字:被编程语言内部定义并保留使用的标识符,共33+2个
and/as/assert/break/class/continue/def/elif/else/except/finally/for/from/if/import/in/is/lambda/not/or/pass/raise/return/try/while/with/yied/del/global/nonlocal/True/False/None/async/await/
and/or/not逻辑运算保留字
and: 与操作 True and False
or: 或操作 True or False
not: 非操作 not True
as 对象引用增加保留字,相当于绑定别名
assert 断言语句保留字,通过异常进行程序辅助调试
break、continue循环控制保留字
class 类定义保留字
def 函数定义保留字
if、elif、else条件判断保留字
try、except、finally异常处理保留字
for、while循环处理保留字
from、import模块导入保留字
in 成员关系操作保留字
is 对象判断保留字
lambda 匿名函数保留字
pass 空操作保留字
raise 异常产生保留字
return 函数返回保留字
with 上下文管理器保留字
yield 生成器定义保留字
del 删除保留字
global 全局声明保留字
nonlocal 非本地声明保留字
True、False布尔保留字
None 空无保留字
async 协程声明保留字
await 协程等待保留字
特殊符号:表达Python语法的三种逻辑
+ - * ** / // % @(矩阵乘法操作符,尚未有功能支持 预留)
<< >> & | ^ ~
< > <= >= == !=
( ) [ ] { } , : . ; @ = -> += -= *= /= //= %=
@= &= |= ^= >>= <<= **=
# ;当多行语句在一行表示时,可以用分号分隔,但不建议
# ->函数注解,辅助对函数参数及返回值类型进行注解
'''
def foo(a: int,b: str)->str:
return "{} and {}".format(a,b)
'''
' " # \
函数 | 描述 |
---|---|
abs(x) | 返回x的绝对值(int,float),如x为复数(complex),返回摸值 |
bin(x) | 将一个整数x转换为二进制字符串形式,以0b开头 |
bytearray() | 返回一个新的字节数组 |
bytes(src) | 将src转换成一个新的字节串对象 |
chr(int) | 返回int在Unicode编码下代表的字符 |
complex([r[,i]]) | 将输入的数值/元组/字符串转换为复数(complex)对象并返回 |
dict() | 返回一个新的字典对象 |
divmod(inta,intb) | 返回(a//b,a%b)的结果 |
eval(exp) | 将字符串表达式exp作为合法的语句传入Python进行解释执行 |
float(x) | 将数字或字符串x转换为浮点数 |
hash(obj) | 返回对象obj的哈希值 |
hex(int) | 将int转换为十六进制,返回以0x为前缀全部小写的字符串结果 |
id(obj) | 返回obj在Python中的id值,一般指CPython中改对象的内存地址 |
input([prompt])在屏幕显示字符串prompt并等待输入 | |
int(x) | 将数字/字符串x转换为整数 |
len(s) | 返回对象s的长度 |
list([iterable]) | 返回一个新的列表对象,可用iterable参数对其初始化 |
max(iterable) | 返回iterable中最大值 |
min(iterable)返回iterable中最小值 | |
oct(int) | 将int转换为八进制,返回以0o为前缀的字符串结果 |
open(file,mode) | 以mode方式打开文件file并返回文件对象 |
ord© | 与chr©相反,返回字符串C的Unicode编码值 |
pow(x,y[,z]) | 返回x的y次方,可选参数z用于取模 |
print(x) | 将x打印到屏幕上 |
range(start,stop[,step]) | 返回start(包含)开始,stop(不包含)结束的可迭代对象,可选参数step控制步长间隔 |
round(x) | 对x近似取整(受浮点数精度影响,不是严格的四舍五入) |
set([iterable]) | 返回一个新的集合对象,可用iterable参数初始化 |
str(x) | 将x转换为字符串 |
sum(iterable) | 返回iterable的求和结果 |
super(x) | 用于在子类中调用父类中被重载的方法 |
tuple([iterable]) | 返回一个新的元组对象,可用iterable参数初始化 |
type(obj) | 返回obj的类型 |
all(iterable) | 如果iterable中元素都是True或iterable为空,则返回True |
any(iterable) | 如果iterable中任一元素是True,返回True,iterable为空返回False |
ascii(obj) | 返回obj的repr()输出,对于非可打印字符采用\x \u \U表示 |
bool(x) | 计算x,返回True或False |
breakpoint(*args,**kws) | 使用该函数进入Debug环境 |
callable(obj) | 如果obj是可调用的则返回True,否则返回False |
classmethod() | 装饰器函数,将方法转换为类方法,对应语法糖@classmethod |
compile(src,filename,mode) | 将src编译为代码或AST对象 |
delattr(obj,name) | 删除obj对象的name属性 |
dir(obj) | 返回obj的所有合法属性 |
enumerate(iterable) | 返回由iterable初始化的枚举对象(序号与值组成的二元组序列) |
exec(obj) | 执行传入的string或code对象 |
filter(func,iterable) | 将iterable对象传入函数func,将True对象构造为一个迭代器 |
format(value[,format_spec]) | 将value按照format_spec的格式进行格式化 |
frozenset([iterable]) | 返回一个不可修改的集合对象,只可用iterable参数初始化 |
getattr(obj,name) | 返回obj对象的name属性 |
globals() | 返回由当前全局变量组成的字典 |
hasattr(obj,name) | 如果obj对象有name属性则返回True,否则返回False |
help(obj) | 输出obj对象的帮助文档 |
isinstance(obj,classinfo) | 如果对象obj是类classinfo的实例则返回True,否则返回False |
issubclass(class,classinfo) | 如果类class是类classinfo的子类则返回True,否则返回False |
iter(obj) | 返回由obj对象构造的迭代器,obj必须是可迭代对象 |
local() | 返回由当前局部变量组成的字典 |
map(func,iterable) | 返回将iterable中每个对象传入函数func而构造的迭代器 |
memoryview(obj) | 返回obj对象的memory view信息 |
next(iterator) | 返回迭代器中下一个元素,会改变迭代器状态 |
object | Python最基础对象,它的类是所有对象的基类 |
property() | 装饰器函数,用于将方法转换为属性,对应语法糖@property |
repr(obj) | 调用obj对象 _ _ repr _ _ ()方法,返回目标对象的可打印字符串 |
reversed(seq) | 返回将序列seq反向后构造的迭代器 |
setattr(obj,name,value) | 为obj对象增加name属性,属性值为value |
slice(start,stop[,step]) | 返回start(包含)开始,stop(不包含)结束的可切片对象,可选参数step控制步间隔 |
sorted(iterable) | 返回一个由iterable对象元素排序后构成的新列表对象 |
staticmethod() | 装饰器函数,将方法转换为静态方法,对应语法糖@staticmethod |
vars(obj) | 返回obj模块/类/对象 _ _ dict _ _属性 |
zip(*iterables) | 从各iterable对象中提取元素拼成元组,形成并返回新的迭代器 |
_ _ import _ _ (name) | 使用关键字import导入模块时调用的查找函数 |