Python全栈最全学习之路-pyhton基础(九)

本文深入探讨Python中的高级主题,包括生成器的使用、装饰器的功能增强、异常处理的实践以及错误查找技巧。通过具体示例讲解yield关键字的作用,装饰器的定义与使用,以及异常处理的基本语法。

生成器装饰器和异常

一、 生成器

思考一:上节课协议中介绍了迭代器协议,但是需要定义类,那么只用函数可以生成吗?
  • 生成器
def fibonacci(end):
	n,a,b = 0,0,1
	while n < end:
		a,b = b,a + b
		yield b
		n += 1

在这里插入图片描述
利用yield可以将一个函数变成一个迭代器
yield具有和return一样的功能,可以返回值,同时也会暂停函数的执行,知道下一次next执行,才会继续往下运行

nab执行
001a,b=b,a+b;yield b
011n+=1;n<end;a,b=b,a+b;yield b
112n+=1;n<end;a,b=b,a+b;yield b
223n+=1;n<end;a,b=b,a+b;yield b

yield会停下来,直到下一次next调用
二、装饰器

思考一:刚才一个小小的改动就让函数变得不一样了,但终究改变了函数,能不能不改变函数,给一个函数增加功能呢?
思考二:比如别人调用了我定义的函数,但是我想知道别人传入了什么参数该怎么办呢?
  • 装饰器
def variables(func):
	def f(*args,**kwargs):
		print(args,kwargs)
		values = func(*args,**kwargs)
		return values
	return f
@variables
def f1(end):
	return end + 1

对于函数f1,不需要做任何改变,但是每次在调用的时候,都能看到传入的变量值具体是多少

  • 装饰器本质
    在这里插入图片描述
    装饰器本质也是利用了闭包将f1传入variables然后把f1重新引用为variables的返回值
  • 内置装饰器
class Person:
	def __init__(self,name,age,sex = '男'):
		self.name = name
		self.age = age 
		self.sex = sex
	@property # 调用方法可以像调用属性一样
	def play(self):
		print('%s 正在玩游戏,啊哈哈---' % self.name)
	@classmethod # 第一个参数自动传入类
	def learn(cls):
		print('%s 需要学习,emm---' % cls)
	@staticmethod # 不再自动传入self或cls
	def sleep():
		print('人都要睡觉')

property、classmethod、staticmethod是pyhton内置的三个装饰器,在项目中会使用到

  • 总结

1、装饰器
掌握:装饰器即闭包,只是传入的是一个函数
2、内置装饰器
掌握:三个内置装饰器的使用和效果

三、异常

	思考一:前面的学习过程中,始终小心翼翼,尽可能避免程序出现报错,但是程序始终是由可能报错的,那该怎么办呢?
	思考二:比如打开一个只读文件,这个文件可能还没有获取到,那么打开的时候就会报错,那么应该怎么办呢?
  • 异常
try:
	f = open('test.txt')
except:
	print('文件不存在')

在这里插入图片描述
当文件不存在时,程序不会报错,这样报错就不会导致程序结束

  • 异常的使用

语法规则:

try:
	pass
except Exception:
	raise Exception
else:
	pass
finally:
	pass

使用规则:

try:
	可能出现异常的代码
except Exception:
	抛出或者返回异常
else:
	没有报错执行
finally:
	以上执行完执行

注意事项:

try后面必须跟上except
except只有在函数中才能使用return
finally不管是否发生异常,始终都会执行
raise可以主动抛出异常
  • 断言使用

在这里插入图片描述
assert是断言,和if判断类似,只是判断为False的时候会报错

  • 总结

1、异常
掌握:异常就是报错
2、异常处理
掌握:异常处理的基本语法规则
3、断言
掌握:断言的使用
四、错误查找

思考一:错误和bug是不可避免的,那么如何快速查找和定位到错误是非常关键的,那么在Python中如何去查找错误呢?
  • 错误查找

在这里插入图片描述
在今后解决问题的过程中,应当自己找到错误代码行,报错原因及报错行,然后再去查找问题。
在自己无法解决需要寻求帮助时,也要掌握如何描述问题,把问题描述清楚的能力,掌握如何提问的技巧,这会大大节省双方的时间和精力
五、本节课总结
1、生成器
掌握:yield的使用
2、装饰器
掌握:装饰器的定义和使用
3、异常
掌握:异常的使用
4、错误查找
掌握:错误查找的方法
六、上节课作业
1、测试列表推导和不用列表推导那一种速度更快

import time
class RunTime:
    def __enter__(self):
        self.start_time = time.time()
        return self.start_time
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end_time = time.time()
        self.run_time = self.end_time - self.start_time
        print('Time consuming %s' % self.run_time)
with RunTime():
    li = []
    for i in range(10000000):
        li.append(i)
with RunTime():
    li = [i for i in range(10000000)]

在这里插入图片描述
2、range不可以使用小数做步长,实现一个可迭代对象,可以实现小数步长

class Float_range:
    def __init__(self,start,end = None,step = 1):
        if not isinstance(start,(int,float)):
            raise TypeError
        elif end != None and not isinstance(end,(int,float)):
            raise TypeError
        elif not isinstance(end,(int,float)):
            raise TypeError
        elif end and end < start:
            print('开始值不能小于结束值')
        elif step < 0:
            print('步长不能小于0')
        else:
            if end == None:
                self.start = 0
                self.end = start
                self.step = step
            else:
                self.start = start
                self.end = end
                self.step = step
    def __iter__(self):
        return self
    def __next__(self):
        import decimal
        res = self.start
        if float(self.start) < float(self.end):
            self.start = decimal.Decimal(str(self.start)) + decimal.Decimal(str(self.step))
            return res
        else:
            raise StopIteration

在这里插入图片描述
七、作业
1、利用装饰器,记录函数的运行次数
2、打开一个只读文件,如果文件不存在,则去创建这个文件

<think>我们正在查找与Python 3.6兼容的OpenCV-Python版本。根据引用内容,我们可以得到以下信息: 1. 引用[1]提到:opencv is not compatible with python 3. 但这里可能是指早期版本不支持Python3,实际上OpenCV3已经支持Python3。 2. 引用[2]提到:macOS上安装OpenCV 3.2.0和Python 3.6.0,说明OpenCV3.2.0支持Python3.6。 3. 引用[3]提到:OpenCV尚未(官方)支持Python 3.8,但我们的问题是关于Python3.6的,所以我们可以推断OpenCV对Python3.6的支持较好。 因此,我们可以确定OpenCV3.x版本应该支持Python3.6。具体来说,我们可以查看OpenCV-Python在PyPI上的发布历史,以确定哪些版本明确支持Python3.6。 根据OpenCV-Python的发布记录,以下版本与Python3.6兼容: - OpenCV 3.4.x系列:从3.4.0开始支持Python3.6 - OpenCV 4.x系列:从4.0.1开始支持Python3.6(因为OpenCV4.0.0在构建时存在一些问题,通常建议使用4.0.1及以上) 但是,请注意,OpenCV-Python的预编译二进制wheel文件(在PyPI上)通常针对特定的Python版本和操作系统进行编译。因此,我们需要选择为Python3.6编译的版本。 在PyPI上,OpenCV-Python的版本命名规则为: - 对于OpenCV3:opencv-python 3.x.x - 对于OpenCV4:opencv-python 4.x.x 我们可以通过pip安装指定版本的命令来安装兼容Python3.6的版本。例如: - 安装OpenCV3的最新版本(3.4.x): ```bash pip install opencv-python==3.4.18.65 ``` - 安装OpenCV4的早期版本(4.x.x),但需要确保该版本支持Python3.6。根据OpenCV-Python的发布历史,4.0.1到4.3.0之间的版本都支持Python3.6(因为Python3.6在2021年底停止维护,而OpenCV-Python在4.5.x之后可能不再提供Python3.6的wheel,但源码仍可编译)。 因此,推荐以下版本: 1. **OpenCV 3.4.18.65**:这是OpenCV3的最后一个版本,完支持Python3.6。 2. **OpenCV 4.1.2.30**:这是OpenCV4中一个较稳定的版本,支持Python3.6。 3. **OpenCV 4.2.0.32** 或 **4.3.0.36**:这些版本也支持Python3.6。 注意:如果使用预编译的wheel,需要确保你的操作系统和架构(如Windows、Linux、macOS)有对应的Python3.6的wheel。如果没有,可能需要从源码编译。 **安装方法**: ```bash # 安装OpenCV3的最后一个版本(推荐) pip install opencv-python==3.4.18.65 # 或者安装OpenCV4的某个版本(例如4.1.2.30) pip install opencv-python==4.1.2.30 ``` **验证安装**: ```python import cv2 print(cv2.__version__) ``` 如果输出安装的版本号,则说明安装成功。 **注意事项**: - 如果使用Anaconda,可以通过conda安装:`conda install -c conda-forge opencv=3.4.18` - 如果遇到问题,可能需要安装依赖库(如libgtk2.0-dev等)或从源码编译。 [^1]: 引用自用户提供的引用[1] [^2]: 引用自用户提供的引用[2] [^3]: 引用自用户提供的引用[3] §§相关问题§§ 1. 如何从源码编译OpenCV-Python以支持Python3.6? 2. OpenCV3和OpenCV4的主要区别是什么? 3. 在Python3.6环境下安装OpenCV-Python时常见错误有哪些?</think>### 与 Python 3.6 兼容的 OpenCV-Python 版本指南 根据引用资料分析,OpenCV 对 Python 3.6 的兼容情况如下: #### ✅ 兼容版本推荐 1. **OpenCV 3.x 系列** - 引用[1][2]明确说明 OpenCV3 支持 Python 3.6 - 推荐版本: - `opencv-python==3.4.18.65`(最稳定) - `opencv-python==3.4.16.67` - `opencv-python==3.4.9.33` 2. **OpenCV 4.x 早期版本** - 引用[3]指出 OpenCV 4.4.0 未正式支持 Python 3.8,但向下兼容 Python 3.6 - 兼容版本: - `opencv-python==4.1.2.30` - `opencv-python==4.2.0.32` - `opencv-python==4.3.0.36` #### ⚠️ 安装注意事项 1. **环境配置** - 确保 Python 3.6 为默认版本(引用[4]): ```bash ln -sf /usr/local/python3.6/bin/python3.6 /usr/bin/python3 ln -sf /usr/local/python3.6/bin/pip3.6 /usr/bin/pip3 ``` 2. **依赖安装** - 必须安装编译依赖(引用[2][4]): ```bash # Ubuntu/Debian sudo apt install build-essential cmake libgtk2.0-dev pkg-config sudo apt install libavcodec-dev libavformat-dev libswscale-dev # macOS (Homebrew) brew install cmake pkg-config re2c ``` 3. **安装命令** ```bash # 安装 OpenCV3 最新兼容版 pip install opencv-python==3.4.18.65 # 或安装 OpenCV4 兼容版 pip install opencv-python==4.3.0.36 ``` #### 版本兼容性验证 ```python import cv2 print(cv2.__version__) # 应输出 3.x.x 或 4.1.x-4.3.x print(cv2.__file__) # 检查加载路径 ``` > 注意:避免使用 OpenCV 4.4.0+ 与 Python 3.6 组合(引用[3]),这些版本主要针对 Python 3.8+ 设计[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值