每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
58. Length of last world
难度:Easy
题意:给定一个仅包含大小写字母和空格 ' '
的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0
。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
Input: "Hello World"
Output: 5
解法:
本题思路非常简单,使用两个计数器,count
和 final_count
,遍历整个字符串,如果遇到空格,那么将 count
置为 0,否则 count
自增 1,同时 final_count = count
,这样可以最后一个字符为空格的时候,也一样可以记住最后一个单词的长度。
代码:
class Solution:
def lengthOfLastWord(self, s: str) -> int:
count, final_count = 0, 0
for i in range(len(s)):
if s[i] == ' ':
count = 0
else:
count += 1
final_count =count
return final_count
Understanding Conda and Pip
这周在配置 vim 的 python-mode 插件的时候遇到一个问题,就是 python-mode 并不支持 Conda 的虚拟环境,于是想尝试将 Conda 环境迁移到 virtualenv 中,于是就开始查询迁移方式,偶然间遇到这一篇文章,Understanding Conda and Pip,详细讲述了 Conda 和 Pip 的区别和联系。
文章首先说明,Pip 是 Python Packing Authority (Pypa) 推荐的,从 Python Packages Index (PyPI) 下载标准库的包管理器。Pip 可安装打包为 wheel 或者 source 分发的 Python 软件,而后者可能要求系统在调用 pip 之前已经安装了兼容的编译器,或者库。
而 Conda 是一个跨平台的软件包河环境管理器,它允许用户在 Anaconda 的存储库或者 Anaconda Cloud 安装和管理 conda 软件包。Conda 将软件包下载为二进制格式,而且它不需要系统提前安装任何编译器。另外,conda 不仅支持 Python 软件包,还包括 C/C++ 库或者 R 软件以及其他的任何软件。
这就是 Conda 和 Pip 之间的关键区别:即 Pip 安装 Python 软件包,而 Conda 不仅可以用于安装 Python 软件包,还能安装其他语言编写的软件;Pip 需要系统安装有 Python 解释器,而 Conda 不需要,它能直接安装 Python 软件包和 Python 解释器。
另外一个主要区别是 Conda 可以创建虚拟环境,而 Pip 没有内置虚拟环境支持,而是依赖于 virtualenv 或者 venv 等其他工具来创建虚拟环境。有一些像是 pipenv、poetry 或者 hatch 的工具将 pip 和 virtualenv 打包起来,实现了再虚拟环境中工作的统一方法。
Pip 和 Conda 在实现环境中的依赖关系也有所不同。Pip 是以递归的串行循环方式来安装依赖项的,它并不会确保所有软件包的依赖关系,所以如果你有某些较早安装的软件包对较晚安装的软件包有不兼容的依赖项版本,你的生产环境有可能会被破坏;而 Conda 则使用「Satisfiability (SAT)」的方式,在安装软件包之前就验证环境中的依赖关系,虽然可能花费额外的时间,但是却能避免环境被破坏。
最后一个区别是,PyPI 上可用的软件包有接近 150000 个,而 Anaconda 存储库与 Anaconda Cloud 上加起来的软件包也只有 1500 个。所以很多时候,混合使用 conda 和pip 是非常有意义的。
下面给出一个对比的表格:
提供另外几篇讲解虚拟环境的文章:
关闭 vim 的中文拼写检查
在 .vimrc 中加入如下一行即可:
autocmd FileType markdown set spell spelllang=en,cjk "根据文件类型 md 执行 set spell 和 set spelllang=en 命令
清理杂乱的 Python 环境(macOS)
最近因为整理系统环境,发现 Anaconda 已经只吃到了 Python 3.7,而我无论如何也不能通过 $ conda update python
将 Python 升级到 3.7,于是想一探究竟,看看到底发生了什么,结果发现,从拿到手上这台 15 款的 MacBook Pro 开始,我就使用了包括 easy_install、anaconda、source code、homebrew 等在内的各种方式安装过 Python,这就导致我本机的 Python 环境一片混乱,就像下面这样。
为了有一个相对干净、整洁的 Python 环境,我决定将所有的 Python 全部卸载,以后使用虚拟环境来进行工作。
在一台机器上有很多版本的 Python 这种情况非常常见,为了清理所有的 Python,需要执行以下几个步骤:
在 macOS 上,系统自带的 Python 版本是 2.7,可执行的二进制文件位于 /usr/bin/
中(实际上是在 /System/Library/Frameworks/Python.framework/Versions/2.7/bin/
中,但实际上是一回事,如果你执行 $ ls -l | grep python
,你就会看到,前者是后者的一个软链接)。如果你想要一个完全干净的 Python 环境,你需要将除了这个之外的所有的 Python 都删除干净。
那么接下来就需要确定你有多少个 Python 了。执行 $ which -a python
,你会看到像下面类似的信息:
/Users/****/anaconda3/bin/python # <- Anaconda
/usr/local/bin/python # <- brew
/usr/local/bin/python # <- brew
/usr/local/bin/python # <- brew
/usr/local/bin/python # <- brew
/usr/bin/python # <- "native"
~/anaconda3/bin/python3 # <- Anaconda
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3 # <- python3 for OSX
/usr/local/bin/python3 # <- python3 for OSX
这就是你的电脑上所有的 Python 版本,你可以挨个查看这些 Python 的位置和版本。
首先你需要删除 anaconda,根据 Uninstalling Anaconda 来进行相应的卸载:
$ conda install anaconda-clean
$ anaconda-clean
之后按照说明,删除 .bash_profile
或者 .zprofile
中对环境变量进行修改的语句。
删除 /Library/Frameworks/Python.framework/
中所有的内容:
$ sudo rm -rf /Library/Frameworks/Python.framework/
删除 /Applications/Python*/
中的所有内容,这里是你手动安装过的 Python:
$ sudo rm -rf /Applications/Python*
将 /usr/local/bin/
中所有关于 Python 的软链接全部删除:
$ sudo rm /usr/local/bin/python*
将通过 pip
安装的所有 Python 库全部删除:
$ rm -rf ~/Library/Python/
删除使用 Homebrew 安装的 Python 和其他组件,因为这可能会损害其他的通过 Homebrew 安装的软件,所以正确的方式是通过 Homebrew 本身来删除:
$ brew unintsall python
好了,现在你已经有一个干净的 Python 环境了,因为你只有系统自带的 Python 2.7。现在你可以按照自己的喜好去选择一个虚拟环境了,但是我个人(以及 Python 官方)建议使用 Pipenv。你可以在这里找到 Pipenv 的安装教程。