跳到主要内容

2 篇博文 含有标签「python」

查看所有标签

我的python开发环境管理实践

· 阅读需 3 分钟
Jason Lee

前言

前段时间做项目,摸索出了一套比较稳定且适合自己的 python 环境管理方案,适用于 win10/11。

2024 年更新:这个节点上,主流有四种环境管理工具:venv(也就是本文推荐的),virtualenv(貌似在 windows 上不友好,比较繁琐),conda(辣鸡,不考虑),poetry(号称现代化的 python 环境管理工具,以后可以尝试)。当时写的 venv 的用法还是有些不对的地方,故修改一下。

venv 的使用

我在之前很长一段时间里用的是 anaconda 作为包管理器。但是一些缺点让我放弃了它:首先 anaconda 太庞大了,其次它的 conda 库经常找不到一些库或者网络速度极慢。后来我转到了 venv,venv 和 conda 一样,虚拟环境被包含在一个文件夹中,里面有一个脚本文件用于激活。

每个项目可以用 venv 创建自己独有的环境。为了统一和简介,依赖的文件夹名都叫做'venv'。打开 cmd,并切换到文件夹下,新建环境的命令如下:

python -m venv venv

这样就创建了一个文件夹,内部目录为:

16873086912601687308690642.png

其中,Lib 装了环境,Scripts 有激活和退出环境的脚本。以 powershell 为例,输入脚本路径,就激活了环境:

.\venv\Scripts\activate.ps1

退出:deactivate. 通过pip list,新环境预装的包为:

16873091022651687309101499.png

可以说什么都没有,具有很大的灵活性了,完全由用户掌控。

vscode 和 pycharm 选择创建好的 venv

如果是一些小脚本,单独运行的那种,我会选择 vscode;如果用到了 django 等创建一个项目,则用 pycharm。

首先说说 vscode。右下角选择 venv 解释器路径:

16873102812591687310281154.png

然后是 pycharm,同样是右下角,add new interpreter->existing->选择解释器位置:

16873105482641687310547564.png

这时候要新建一个 terminal,就会自动将环境挂载上。

我在2023年回顾python3基础

· 阅读需 5 分钟
Jason Lee

到底什么是数字、元组、字符串的不可变性?

不可变性,指的是不能改变原有位置上的元素;不包括在空位置上创建元素。所以,元组都可以连接其他同类元素使得自己变得更长,而不能改变原来的元素。

数字、字符串的不可变性:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。字符串类似。

生成器和迭代器

生成器和迭代器都可以提高性能和内存效率,因为它们可以一次生成一个元素,而不必在内存中存储整个数据集。通过理解生成器和迭代器的工作原理,我们可以更有效地处理大型数据集。

假如有一个场景,我们深度学习训练时读取数据,由于训练图片很多,不可能一次性读进内存,所以采用生成器或迭代器的方式,一次读取几张图像。

生成器和迭代器实现的事情都是类似的,即一次只输出少量的数据,只是他们的创建方式有差异。

迭代器

迭代器是一种对象,它可以用于迭代序列中的元素。迭代器具有一个__next__()方法,该方法返回序列中的下一个元素,并在没有更多元素时引发StopIteration异常。

创建迭代器的方法:一个从现有序列中直接创造:iter(seq),另一种需要创建一个类(由类实例化出对象),类带有__iter____next__方法:

class FibonacciIterator:
def __init__(self):
self.a = 0
self.b = 1

def __iter__(self):
return self

def __next__(self):
result = self.b
self.a, self.b = self.b, self.a + self.b
return result

fib_iter = FibonacciIterator()
for i in range(10):
print(next(fib_iter))
## 另外一种调用方式
for value in fib_iter:
print(value)

生成器

生成器是一种特殊的函数,它使用yield关键字来产生一个值,并暂停函数的执行。每次调用生成器函数时,它都会从上一次停止的位置继续执行,直到遇到yield语句。生成器是一种简单而强大的工具,可以在处理大型数据集时提高性能和内存效率。

def fibonacci():
a, b = 0, 1
while True:
yield b
a, b = b, a + b

f = fibonacci()
for i in range(10):
print(next(f))
## 也可以:
for value in f:
print(value)

可以看出,生成器在这个例子中会简短一些。同时可以看出,调用的时候,生成器和迭代器的两种方式都一样,分别是固定次数(可能会超出边界而引发StopIteration异常,以及forin循环。创建时的不同是:生成器是一个函数,而迭代器是一个对象。

不定长参数

不定长参数就是那种在定义函数或者方法时,括号里的参数带一个或者两个星星的。一个星星被放入元组,实参不带参数关键字;两个星星被放入字典,实参带关键字,关键字被当作字典的键名。

def printinfo( arg1, *vartuple, **vardict ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print(vartuple)
print(vardict)

printinfo( 70, 6, a=60, b=50)

out:

输出:
70
(6,)
{'a': 60, 'b': 50}

异常处理

raise 抛出异常,程序把异常打印出来(抛给用户),并停止后续代码的运行。如果没有raise,程序将继续运行。