微专业 Python精进路线展望 第一周_对于一个已有函数如何更新其功能?(同名使用)-程序员宅基地

技术标签: python  

上下文管理器

上下文Context:程序执行中某个状态

  • 程序执行所需的一些内外部参数,构成了程序运行时的状态。
  • 上下文是用来表达程序运行状态的概念,对应内存状态。
  • 上下文是程序中断保留或恢复运行的重要状态信息。

上下文管理器:一个可以在程序中加载独立上下文的对象

  • 万物皆对象:上下文管理器也是一个对象,管理者一个独立上下文区域。
  • 上下文管理器使用with显示创建。
  • 进入和退出分别对应__enter__()和__exit__()。
#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)

如何使用上下文管理器

  • with要配合特定对象使用。
    • Python默认支持的对象:
      • file
      • decimal.Context
      • thread.LockType
      • threading.Lock
      • threading.RLock
      • threading.Condition
      • threading.Semaphore
      • threading.BoundedSemaphore
    • 用户可自定义对象
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:实现容器中元素的迭代

  • 容器container: 包含一组元素的数据类型,如 全部组合数据类型。
  • 迭代器:容器之上的一种迭代,迭代方式以对象形式表达。
  • 迭代器定义了逐一获取容器中元素的方法。

迭代器类型 iterator types:实现容器中元素的迭代

  • 迭代器是一个对象,常与for…in…配合使用,需要重载两个方法。
  • _ _ iter _ _ ()返回迭代器对象自身,配合for…in…使用时需要。
  • _ _ next _ _()返回容器的下一个元素,如果遍历结束,产生Stoplteration异常。

迭代器类型:原理实例

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:实现容器中元素的迭代

  • 迭代器非常常用,尤其是涉及管理一组数据的应用场景。
  • 自定义类+for…in…管理一组数据,作为数据管理的核心自定义数据类型。
  • 迭代器返回下一个元素的方式为优化程序内存使用提供了重要支持。

生成器设计

生成器Generator: 快速实现迭代器类型的方式

  • 生成器是迭代器的另一个角度诠释,生成器都是迭代器。
  • 生成器以逐一产生数据为角度,重点在于迭代逻辑的方便实现。
  • 生成器只需要yield保留字即可定义并表达,不用重载对象方法。

生成器Generator: 快速实现迭代器类型的方式

  • 生成器函数是生成器的核心,用来实现迭代逻辑。
  • 任何包含yield语句的函数,都是生成器函数。
  • 对于函数来说,yield和return功能接近,但不完全相同。

普通函数

  • 每次调用完整执行后退出。
  • 如果函数表达了容器概念也是如此。

计算资源被浪费

生成器:设计实例

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
'''

生成器函数的设计原则

  • 若想不断生成数据,生成器函数需要存在迭代/循环过程。
  • 每次迭代/循环产生的结果以yield方式表达。
  • 生成器函数要与for…in…配合使用,注意:生成器是一种特殊迭代器。

装饰器与语法糖

装饰器Decorator: 以函数为参数实现其额外功能更新

  • 需求:对于一个已有函数,如何更新其功能?(同名使用)
  • 解决方式1:重新编写该函数,把功能补充进去。
  • 解决方式2:不改变原来函数,增补一个装饰器给它。

装饰器Decorator: 以函数为参数实现其额外功能更新

  • classmethod()和staticmethod()内置函数。
  • @classmethod
  • @staticmethod
def f(...):
	...
f=staticmethod(f)

上面实例等价下面实例

@staticmethod
def f(...):
	...

语法糖 Syntactic Sugar: 方便使用但无实质功能的语法

  • 语法糖:一种功能的简化使用方式,非功能性改变。
  • Python中采用@作为语法糖,辅助装饰器使用。
  • 任何语法糖表达的装饰器都对应一个函数。
@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:在程序层面的多段代码异步执行

  • Python3.5新增内置功能:async和await保留字。
  • async:用于定义异步执行的协程代码片段。
  • await:异步代码段之间的手工同步方式。

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对象
'''

协程初步

  • 协程就是一个函数,只是它满足一下几个特种:
    1.有I/O(输入/输出:如存储txt)依赖的操作。
    2.可以在进行I/O操作时暂停。
    3.无法直接执行。
  • 它的作用就是对有大量I/O操作的程序进行加速。
    python协程属于 可等待对象,因此可以在其他协程中被等待
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 对象引用增加保留字,相当于绑定别名

  • import 模块 as 别名(对象引用)
  • (try …)except 异常 as 对象引用
  • with … as 对象引用

assert 断言语句保留字,通过异常进行程序辅助调试

  • assert 判断条件
  • 如果条件为False,产生AssertionError异常

break、continue循环控制保留字

  • break 退出当前层循环。
  • continue 退出当次循环。

class 类定义保留字

  • class 类名:
  • class 派生类名(基类名):

def 函数定义保留字

  • def 函数名(参数列表):
  • async def 函数名(参数列表):

if、elif、else条件判断保留字

  • 条件判断:if-else、if-elif-else
  • else:可以与循环和异常结合使用

try、except、finally异常处理保留字

  • try-except
  • try-except-else-finally

for、while循环处理保留字

  • 遍历循环:for…in
  • 无限循环:while

from、import模块导入保留字

  • import 模块名
  • from 模块名 import *

in 成员关系操作保留字

  • 成员关系提取:for … in …
  • 成员关系判断:… in …

is 对象判断保留字

  • 对象一致性判断,即比较id()函数结果。
  • 以内存对象为判断依据:x is y。

lambda 匿名函数保留字

  • 定义匿名函数,产生函数对象。
  • lambda 参数列表:表达式。

pass 空操作保留字

  • 代表空操作,执行后不产生任何功能。
  • 在程序中用作占位符。

raise 异常产生保留字

  • 产生一个异常,辅助try-except程序功能。
  • raise 异常名称

return 函数返回保留字

  • 结束当前函数,返回0个或多个结果。
  • return 返回值。

with 上下文管理器保留字

  • 构建并管理一个上下文区域。
  • with 表达式 as 对象:

yield 生成器定义保留字

  • 定义一个同步或异步(协程)生成器。
  • yield 表达式。

del 删除保留字

  • 解除引用与对象的绑定关系,“删除”引用。
  • del 引用。

global 全局声明保留字

  • 全局变量声明,声明后可以赋值。
  • global 变量名。

nonlocal 非本地声明保留字

  • 声明变量为当前与全局命名空间之间。
  • nonlocal 变量名。

True、False布尔保留字

  • True:表示真。
  • False:表示假,含0、0.0、[]、{}、""等。

None 空无保留字

  • 表示空无,与False不同。
  • Python最基础的一个对象。

async 协程声明保留字

  • 声明一段协程程序。
  • async def 协程函数名(函数参数):
  • async with …:

await 协程等待保留字

  • 等待一段协程程序执行并返回结果。
  • await 协程函数调用()。

Python特殊符号

特殊符号:表达Python语法的三种逻辑

  • 操作符:表达操作运算。
+ - * ** / // % @(矩阵乘法操作符,尚未有功能支持 预留)
<< >> & | ^ ~
< > <= >= == !=
  • 分界符:表达式之间的分界。
( ) [ ] {
     } , : . ; @ = -> += -= *= /= //= %= 
@= &= |= ^= >>= <<= **=
# ;当多行语句在一行表示时,可以用分号分隔,但不建议
# ->函数注解,辅助对函数参数及返回值类型进行注解
'''
def foo(a: int,b: str)->str:
	return "{} and {}".format(a,b)
'''
  • 特殊含义:具有特殊含义的符号。
' " # \

Python内置函数

函数 描述
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导入模块时调用的查找函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45550866/article/details/104966000

智能推荐

matlab用傅里叶变换实现图像的低通滤波_matlab傅里叶变换 低通滤波-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏56次。要求可以使用 MATLAB 的傅里叶变换函数和反变换函数。原理部分低通滤波器指去除图像中的高频成分,而低通滤波器指去除图像中的高频成分。 考虑的有三种低通滤波器:理想滤波器、布特沃斯滤波器和高斯滤波器。 理想低通滤波器:以原点为圆心,D为半径的圆内, 无衰减地通过所有频率,在圆外截断所有频率。由下面函数确定: 具体参见下图: Matlab函数介绍Fft2:二维快速傅里叶变换 Fftshift:移动零频点到频谱中间 Ifft2: 二维快速反傅里叶变换..._matlab傅里叶变换 低通滤波

计算机毕业设计——基于HTML(品优购)电商购物商城项目设计与实现(html前端源码和论文设计)-程序员宅基地

文章浏览阅读767次。精彩专栏推荐 【作者主页——获取更多优质源码】 【web前端期末大作业——毕设项目精品实战案例(1000套)】1 网页简介:此作品为学生个人主页网页设计题材,HTML+CSS 布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平, 非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Web

CentOS在线和离线安装PostgreSQL-程序员宅基地

文章浏览阅读320次。postgresql在线安装很简单进入官网:https://www.posthttps://www.postgresql.org/gresql.org/如文档所示,在线安装步骤与命令:sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-..._pgdg-centos95-9.5-3.noarch.rpm

【PrimeTime 基本命令】_这个命令可以创建符合要求的library cell集合,可以将它传递给另一个命令-程序员宅基地

文章浏览阅读950次。https://www.micro-ip.com/drchip.php?mode=2&cid=17_这个命令可以创建符合要求的library cell集合,可以将它传递给另一个命令

ELasticsearch的安装以及与spring-data-elasticsearch的整合使用_lorg/elasticsearch/common/settings/settings;ljava/-程序员宅基地

文章浏览阅读3.1k次。#Elasticsearch安装这里本人使用的是docker镜像安装,至于怎么安装就不说了,贴一下配置最基本的配置文件就好#集群名称,默认为elasticsearch, 命名规则为 es-产品名-ES版本cluster.name: luckyqing#节点名称,es启动时会自动创建节点名称,但你也可进行配置node.name: es-46-68-76#设置索引的分片数#index..._lorg/elasticsearch/common/settings/settings;ljava/lang/string;)v

oracle 判断是否为小数,Oracle 判断是否为数字型(金额型)-程序员宅基地

文章浏览阅读5k次。在sql server,校验数据是否为数字型比较容易,有提供的方法可以使用:ISNUMERIC当是数字型,方法返回值为1;否则返回值为0例:select * from tablename where isnumeric(data) = 1在Oracle中没有这样的方法,要实现判断是否为数字型需要自己写一个方法来实现。但也可以用其它方法:方法一,用正则的方法:使用 regexp_like例:sele..._oracle判断是否是数字,包括小数

随便推点

LATEX(2)增大表格名称与表格间距_latex中表格名字和表格距离调整-程序员宅基地

文章浏览阅读2.6w次,点赞12次,收藏19次。LaTeX的表格环境是默认把表格名称放在表格底部的,如果我们把表格名称放置在表格开头就会发现名称与表格的距离十分接近,非常不好看,就像下图显示的一样: 但是我们如果习惯把表格名称放置在表头又该怎么办呢?下面给大家提供两种方法。 版本一:在文中使用命令”\caption”前添加增大间距的命令,具体如下:\begin{table}[H]\centering\setlength{\aboveca_latex中表格名字和表格距离调整

oracle行标识是什么,oraclerowid在表行中的物理标识-程序员宅基地

文章浏览阅读143次。欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 当然最常用的是用rowid去除重复: 查出重复数据: select a.rowid,a.* from 表名 a where a.rowid != ( select max(b.rowid) from 表名 b where a.字段1 = b.字段1 and a.字段2 = b.字段2 ) 删欢迎进入Oracle社区论坛..._oracle 中 每行 数据的 标记

CMPT1.ConfigMgr Prerequisites Tool简介-程序员宅基地

文章浏览阅读230次。ConfigMgr Prerequisites Tool 使用指南系列-1:ConfigMgr Prerequisites Tool简介Lander Zhang 专注外企按需IT基础架构运维服务,IT Helpdesk 实战培训践行者博客:https://blog.51cto.com/lander IT Helpdesk实战培训视频课程:https://edu.51cto.com/lectur..._configmgr tool

elasticsearch update 无结果_es updaterequest没有更新-程序员宅基地

文章浏览阅读2.8k次。 这个一直不能用:for id in data_front: res=es.update(index=index, doc_type=doc_type, id=id, body={"doc": {"flag":0}}) print(id,res) break {'total': 0, 'successful'..._es updaterequest没有更新

linux/module.h_module_firmware-程序员宅基地

文章浏览阅读741次。动态加载模块到内核中1、相关的结构体struct kernel_symbolstruct modversion_infostruct module_attributestructmodule_version_attributestruct module_kobjectstruct module// 模块结构体,将上面的变量放到结构体中,有的值进行了初始化2、加载、卸载、以及注册、注销等函数..._module_firmware

『Flutter开发实战』十分钟入门Dart语言_dart语言实战-程序员宅基地

文章浏览阅读441次。参考自:https://dart.cn/samplesDart 编程语言概览本文向你展示的 Dart 语言用法并不全面—这里只是对那些喜欢通过示例了解语言的人提供一个简单的介绍。你也许会对Dart 语言的速查表 CodeLab或 Dart 语言概览和库概览更感兴趣。语言概览包含示例的 Dart 语言全面概览。本文中大部分的阅读更多链接均会跳转到此概览中。库概览通过各种示例向你介绍 Dart 的核心库。通过此概览你可以了解更多关于内置类型、集合、日期时间、异步 Stream..._dart语言实战