关于我们
-关于FlyPython
FlyPython是提供一站式Python编程学习的组织,我们致力于为用户提供高效,有趣的学习环境,打造专注于Python的中文学习社区。
-联系我们
客服&合作: 微信号 flypython
-公众号二维码
FlyPython
FlyPython训练营
diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ffddd2c Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml new file mode 100644 index 0000000..e5f14bf --- /dev/null +++ b/.github/workflows/hugo.yaml @@ -0,0 +1,78 @@ +# Sample workflow for building and deploying a Hugo site to GitHub Pages +name: Deploy Hugo site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.121.0 + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Install Dart Sass + run: sudo snap install dart-sass + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + - name: Install Node.js dependencies + run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" + - name: Build with Hugo + env: + # For maximum backward compatibility with Hugo modules + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + hugo \ + --gc \ + --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: ./public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v3 \ No newline at end of file diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/archives/2018/01/index.html b/archives/2018/01/index.html deleted file mode 100644 index f91d552..0000000 --- a/archives/2018/01/index.html +++ /dev/null @@ -1,127 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - -
- - 关于飞蟒Python -
-
- - 关于飞蟒Python -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 介绍Python语言新的特性 -
-
- - 介绍Python语言新的特性 -
-
- - Python自然语言处理教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - LeetCode刷题计划启动啦 -
-
- - cs224n解答 -
-
- - cs224n解答 -
-
- - 飞蟒微课堂正式开班 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划第0篇 -
-
- - LeetCode刷题计划启动啦 -
-
- - cs224n解答 -
-
- - cs224n解答 -
-
- - 飞蟒微课堂正式开班 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划第0篇 -
-
- - LeetCode刷题计划启动啦 -
-
- - cs224n解答 -
-
- - cs224n解答 -
-
- - 飞蟒微课堂正式开班 -
-
- - 介绍Python语言新的特性 -
-
- - 介绍Python语言新的特性 -
-
- - Python自然语言处理教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 关于飞蟒Python -
-FlyPython是提供一站式Python编程学习的组织,我们致力于为用户提供高效,有趣的学习环境,打造专注于Python的中文学习社区。
-客服&合作: 微信号 flypython
-FlyPython
FlyPython训练营
你是否在朋友圈看过Python培训的广告? 你在微博是否刷出过大佬在学Python的新闻?你会惊讶,为什么现在都在大肆宣传Python,今天我就给你答案。
-IT行业发展日新月异,每天你都会听到很多新兴技术和编程语言以及他们的最新进展。
-对于那些对学哪种编程语言更适合,感觉困惑的初学者,其实不用担心,FlyPython为你提供了一个计划。我们不用需要学习三大编程语言,五大框架的谎言来骗你。相反,我们将只关注一种语言,那就是Python。
-让我们从一个有趣的事实开始。在现在流行的编程语言中,Python是最受欢迎。你可以通过在各种榜单上来确认这一事实。
-
你可能会想到的第一个问题是“为什么要专门学习Python?”。嗯,这个问题的答案很简单。
-考虑一下要包含在编程语言中的因素。
-Python很难吗?一点也不!Python是很多人的第二语言,现在越来越多人开始作为第一语言学习。Python语言旨在简化了复杂的编程,它削减了所有低级任务,并为你执行所需的任何任务提供了高级抽象。Python基础语法非常简单,你可以通过一个月的练习轻松掌握它。
-学习了编程语言后,打算做什么?你是否要构建应用程序,Web服务,令人兴奋的游戏,自动化重复性任务,执行复杂的科学或数字计算或从某些数据挖掘观点,Python让你无所不能。它是目前最有生产力的语言之一。
-学习Python是你今天可以做出的最好的投资。Python开发人员的薪水很高,尤其是在Web开发,机器学习和数据科学领域。薪资范围从10k起,具体取决于地点和你在行业中的经验。IT行业对Python开发人员的需求很大,因此你在市场上找到Python职位不会有任何麻烦。
-使用Python可以做的事情没有限制,但是在这里我们将向你介绍一些最重要的Python实际应用,以提示你可以在哪里实际使用Python编程语言。
-
Python是快速开发Web应用程序的理想选择。借助Django,Tornado,Flask等许多框架,Python使你可以快速构建Web应用程序。Python用于Web开发的服务器端,你可以使用Python与数据库进行交互并构建REST API服务。
-早期的Python主要用于构建应用程序和编写脚本以自动执行任务,但是现在,数据科学使Python更加流行。数据科学人员非常依赖Python,因为它的优点包括简单,强大的社区以及轻松计算等功能。在数据科学领域流行的Python库和框架是:
-不久的将来将是人工智能时代。过去,计算机被用来以很高的速度执行数学计算,但是现在,许多大型组织和研究人员正在致力于构建可以像人类一样执行任务的智能系统。机器在某种程度上足以理解人类的情感及其自然语言。它们可以模仿人类以前无法完成的某些动作。同样,Python在构建AI系统方面很受欢迎。
-下面列出了一些用于构建智能系统的Python库 :
-有许多重复性的与业务相关的任务。Python可以通过自动执行任务来简化工作,例如,抓取网站来收集数据,编写测试用例,自动化办公任务。
Python可以轻松访问和读取所有类型的文件,这通过自动执行重复任务为节省大量时间提供了机会。用于自动化的框架或库是:
Python在不同领域中的使用增长非常迅速,并且没有停止的迹象。可以肯定地说,Python将在这个瞬息万变的IT行业中会长期坚持下去。
-
你很棒已经读到了这里,现在我知道你对编程感到兴奋,并在思考你想使用Python构建什么样程序。让我们再迈出一步,为自己制定一个计划,以有效地学习Python。
-FlyPython推出了飞蟒微课堂,希望能给学员一些学习Python的路径指导。
-
你的Python学习之路可以遵从以下7个步骤:
-一切都从头开始,了解与编程相关的术语和概念。因此,请在你的计算机上安装Python,然后开始学习Python编程语言的基本语法,变量和数据类型
-熟悉基础知识后,了解了如何使用编程语言进行决策判断。有多种不同的方法,例如if和else语句,可让根据条件进行决策。循环也是所有编程语言的重要组成部分。您可以使用循环轻松地执行重复性任务,并通过实现不同类型的循环(例如For循环,while循环和嵌套循环)来学习概念。
-面向对象编程是一种通过考虑对象和类形式的现实世界实体来解决所有问题的方法。为了成为一名更好的程序员,必须了解面向对象编程的概念和原理。在构建大型应用程序时,,面向对象设计是有益的,它通过重用可用组件来帮助我们编写简洁的代码。它们也易于维护。
-在Web开发环境中,Python用于Web应用程序的服务器端编程。我们使用HTML,CSS和JavaScript来定义网站的外观以及过渡效果和动画。这也称为应用程序的前端。应用程序的后端涉及处理来自浏览器或前端的请求,从数据库检索数据并执行操作。Python管理所有这些与服务器端相关的任务。用于Web开发的最受欢迎的Python框架是Django。另一个流行的框架是Flask。这些框架提供了应用程序的快速开发。因此,你可以选择其中任何一个,并通过创建具有基本CRUD操作的Web应用程序来创建一个小项目。
-数据科学和机器学习的世界在很大程度上取决于Python。我们开始介绍机器学习算法的类型,通过实现不同的机器学习模型来练习编程。使用Pandas库分析数据,使用Numpy库执行数值计算,使用scikit-learn构建机器学习模型,并使用matplotlib或seaborn等库可视化数据。
-环顾四周,思考可以解决哪些问题。创建一个项目构想列表,并从你学到的所有东西中构建出一些东西。通过集成所有内容来进行大型项目。你可以通过向用户提供某种形式的服务来构建机器学习模型并将其与网站集成。
-准备从头开始创建Python项目:
-我们会从最初的数据准备开始,构建机器学习pipeline,教你真正的机器学习项目实战。
-Python面试分为两个部分,第一部分是数据结构算法准备阶段,主要是Leetcode真题解析。第二部分是各大厂面试真题解析,带你实战。
-微课堂推出7个免费的专项课程来对应上面的7个步骤。照顾到不同的同学基础各不相同,课程之间相互独立,我们会同时更新不同的课程,最后把整个课程体系完善。
-目前的计划会同时启动Python面试和Python语法课程,请关注公众号FlyPython和飞蟒官网。
-
我至今面试过几百人,发现很多候选人基础确实有不少的问题,尤其是转专业的同学。
-大多数的公司面试工程师时都会考察这几个方面,
-按照不同的职位,会增加相应的内容。比如算法工程师,会问机器学习与深度学习算法,如果有paper和比赛,也会问一些。但是一般前两轮都是数据结构和算法,所以数据结构与算法是敲门砖,希望同学们能在这方面多下些功夫。
-Python面试专项课程分为两部分,一是刷leetcode,二是公司面试真题。完整的题解目录请在FlyPython公众号菜单上查看,这次主要介绍leetcode,面试真题后面会有具体的介绍。
-那怎么刷LeetCode呢?你可以根据自己的实际情况来决定,如果时间充裕可以通过题型来分类,每个题型都刷10题左右。如果时间紧张,建议刷热门题和公司题库,提高命中率。你也可以每周参加leetcode的周赛,来维持手感。
-真正做到bug free,确实很难,有的时候刷2-3遍也不行,得多做变型题,多想多总结,不断积累基础就变扎实了。难度以中等为主,兼顾hard。
-这次的LeetCode刷题计划,是以leetcode中文站的精选TOP面试题为基础的,题目共145道,希望对同学们有帮助。
-还没有注册LeetCode的同学,先去注册一个并完成下面的的练手题。还没有关注FlyPython的同学长按最后的二维码关注我吧。
-链接:https://leetcode-cn.com/problems/guess-numbers/
难度:简单
--小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
-输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
-示例 1:
-输入:guess = [1,2,3], answer = [1,2,3]
-
输出:3
解释:小A 每次都猜对了。示例 2:
-输入:guess = [2,2,3], answer = [3,2,1]
-
输出:1
解释:小A 只猜对了第二次。限制:
-guess的长度 = 3
-
answer的长度 = 3
guess的元素取值为 {1, 2, 3} 之一。
answer的元素取值为 {1, 2, 3} 之一。
leetcode最简单的练手题,可以循环比较计数,也可以直接三个元素比较。
-

--在cs224n 2019课程中的L1和L2中,我们详细论述了word2vec skip-gram 模型,相信大家都已经掌握了。
-
但这里有一个细节,肯定让不少同学非常疑惑。
视频中提到,一个词有2个向量,总参数是2d*V。

(Lecture 01 Introduction and Word Vectors,ppt第23页)提到了use two vectors per word
-
(Lecture 01 Introduction and Word Vectors,ppt第27页)
-如上图示,在训练过程中是存在2个词向量的。这怎么理解?明明一个词最终输出的时候,只有一个词向量呀。
-在视频中,Manning教授简单提了一嘴,我们这里详细说明一下,word2vec为什么要在训练的时候使用2个词向量,这2个词向量是什么关系,最终输出的是什么词向量。
-这2个词向量一个是词$w$的word representations ($v_w$) 在下图中表示为V,一个是该词w的context representations ($u_w$)在下图中表示为U。
-
(Lecture 02 Word Vectors 2 and Word Senses ppt第4页)
-在我们训练词向量的时候,对于训练语料,使得P(o|c)的概率最大,也就是
J=-logP(o|c)最小(如果没有负号则是求最大,cs224n视频的ppt就没有负号)。
我们是怎么定义P(o|c)的呢?
-定义如下:
-$P(o|c)={exp(u_o^Tv_c)}/{\sum_{w=1}^V exp(u_w^Tv_c)}$
-可以看到,这个条件概率是中心词和上下文词2个词向量的点乘,再取e的指数,并除以所有词的词向量和中心词的点乘取e的指数之和,公式的本质是一个向量点乘+softmax。
-这里当w是o 中心词的时候,使用词的word representations,而w是c上下文词的时候,使用词的context representations。
-答:使用2个词向量的目的是,训练时我们需要让具有相同上下文的词的词向量相互接近,但我们不希望这些词的上下文的词也相互接近。
-以下面2句话的例子讲解一下:
-the dog has a tail
-the cat has a tail
-这里采用word2vec skip-gram ,naive softmax 模型,窗口大小采用k=1。
-对于中心词dog来说,需要计算:
-P(dog|has)
-P(dog|the)
-对于中心词cat来说,需要计算:
-P(cat|has)
-P(cat|the)
-这里的条件概率公式是上面的:
$P(o|c)={exp(u_o^Tv_c)}/{\sum_{w=1}^V exp(u_w^Tv_c)}$
分别把中心词dog/cat 和上下文词has/the带入,就可求出概率。
对于目标函数J=-logP(o|c),我们要求其最小值,那么在word2vec算法中,需要做梯度下降算法。这里使用sgd,只需要对每个样本进行梯度下降,如下公式:
$u_o(new)=u_o(old)-\alpha \partial J/(\partial u_o)$
-$v_c(new)=v_c(old)-\alpha \partial J/(\partial v_c)$
-多次迭代sgd后,会使得J变小,而$u_o$和$v_c$的点乘会变大,进而使得两者余弦距离接近。那么如果dog/cat 分别和has/the 接近了,dog和cat的词余弦距离就会接近。
-假设这里$u_o$和$v_c$都是同一种向量,那么不光dog和cat的词余弦距离接近,cat和has也会相近,连has和the都会相近。
-但是我们希望最后输出的词向量,dog和cat相近,但不希望cat和has相近,也不希望has和the相近。如果都相近,词就没有区分度了。
-所以我们对于每个词采用双词向量,对于dog 这个词,有一个word representations ($v_c$) 用来作为中心词时计算,有一个context representations ($u_o$)作为上下文词时进行计算。
-context representations训练为了使得中心词word representations相近,context representations作为中间结果不输出,而word representations作为最终结果输出。这样就避免了所有中心词的词向量都接近的困境了。
-最终,我们保存中心词的word representations,既公式中的$v_c$ 。
-解释清楚这个问题以后,我们知道最早的算法是否使用2个vec的。
-在word2vec提出者,Tomas Mikolov 的论文Distributed Representations of Words and Phrases and their Compositionality
和他提供的word2vec.c代码里,训练过程中,每个word都存在2个词向量。
如下图
论文Distributed Representations of Words and Phrases and their Compositionality 中截图

word2vec.c代码截图
所以我们清楚了,最早的word2vec算法确实在训练的时候是存在2个vec的。
-https://www.quora.com/Why-does-word2vec-have-two-different-representation-for-words
-论文:Distributed Representations of Words and Phrases
and their Compositionality
--老师,请问共现矩阵奇异值分解后为什么是用U的行来做word embedding呢?
-
cs224n课程第一周里,提到了2种生成word embedding的方法。
一种是基于word2vec的神经网络生成词向量的方法。
另一种是基于统计的词向量生成的方法:使用共现矩阵,再进行SVD分解。

首先要说明,这2种方法输出的word embedding 都是distributed representation(稠密表达)。
-其次值得说的是,这2种方法各有优缺点(可能面试里会问),在glove方法中,综合进行了两种算法,达到最优的效果。
-那么,我们这里详细探讨一下利用SVD生成词向量的过程,解答上面提到的问题。
---共现矩阵奇异值分解后为什么是用U的行来做word embedding
-
构造一个矩阵X,这个矩阵的大小是 $V*V$ ,这里V是词表的长度。这个矩阵称之为共现矩阵。
-我们要统计,每个中心词在左右k个窗口的范围内,上下文词出现的词频。于是这里的共现矩阵,第一个维度(列),代表这个中心词,第二个维度(行)代表这个中心词对应的上下文词。
$X={x_{ij}}$为第i个词作为中心词时,对应第j个词作为其上下文词时候的词频。
我们还是用课上的例子,有3句话:
-1 | I enjoy flying。 |
假设这里k=1,统计的共现矩阵X为:
可以看出,这里的共现矩阵X为对称矩阵,也就是对中心词like,enjoy的出现次数是等于对于中心词enjoy,like的出现次数。
-假设X的size是$VV$,那么U的矩阵是$VK$,奇异值矩阵S是$KK$,而$V^T$的矩阵size 是$KV$.
这里V是词表长度,上面解释了,K是指最后需要输出的词向量维度,一般我们取100-300之间的一个值。
SVD分解公式可以写作
$X=USV^T$
写成分量式为:
$x_{ij}= \sum_{k=1}^n u_{ij}s_kv_{jk}$
-那么从这个公式看出,对于每个样本word $x_{ij}$ 与$u_{ij}$是对于的,而不是与$v^T_j$对应,$v^T_j$与每个维度对应。
由线性代数基本知识可知,对于任意矩阵X(size $V*V$ )来说,我们可以进行奇异值分解,
-$X=U \Lambda V^T$,
-这里, $U, V, \Lambda$都是size $V*V$ 的对角矩阵,并且每个值都是非负实数,按大小从大到小排列。
-
那么我们对$\Lambda$进行降维,只保留前K个值,这样U和V也会跟着变,从维度上看,矩阵U去掉了后面的一些列,变成了$VK$;矩阵$V^T$,去掉了前面的一些行,变成了$KV$(实质上做了空间变换,而不是简单的去除一些数据)。也就是上面的图:
这里就解释了,为什么是用U的行来做word embedding。
-还有一个问题,如果U对应的词向量,那么V对应的是什么呢?对于词共现矩阵来说,V的意义还不是很清晰,我们考虑这样一个矩阵:
-词-文档矩阵 Word-Document Matrix,行是所有的词,维度为V,列是每个文档,维度为M。
-对这样一个矩阵进行SVD分解,并降维到K个奇异值上取值,
-
SVD分解公式可以写作
$X=U\Sigma V^T$
U的矩阵size$V*K$,
-$V^T$的矩阵size 是$K*V$
-写成分量式为:
-$x_{ij}= \sum_{k=1}^n u_{ij}\sigma_kv_{jk}$
-$u_{ij}$ 对应的第i个词和第j个主题的相关度,$u_{i}是词的主题向量$。
-$v_{jk}$ 对应第j个文档和第k个主题的相关度,所以$v_j$是第j个文档的文档向量。
-这样就说明了V在SVD分解的意义。
- -FlyPython推出的《Python面试专项课程》原计划在春节假期后开始更新,考虑到后面刷题的需求可能增多,我们对题目进行了调整并于今天开始更新。
-原先的LeetCode刷题计划中的精选TOP面试题推后,我们先过一遍《程序员面试金典》这本书上的面试题,为基础薄弱的同学夯实基础。
-欢迎关注我们的公众号flypython和网站flypython.com,我们将持续更新这个专项课程。
-今天是这个专项课程的第0课,我们带来算法学习最重要的一个部分:复杂度分析。
-为什么说复杂度分析是最重要呢?因为数据结构和算法其实解决的是”快”和”省”的问题。”快”就是如何让代码运行得更快,”省”就是让代码节约存储空间。怎么样来衡量你编写的算法代码执行效率呢?这里引出来今天要讲的内容:时间、空间复杂度分析。
-你可能会说,不就是执行效率么?我把代码跑一遍,增加cProfile的一些操作,不就得到了执行时间和内存占用么。
-其实你上面说的也是一种方法,叫事后统计法,在做性能优化时会大量采用。但是事后统计法有它的局限性。第一,它依赖测试环境,测试环境不一样,得到的数据会都不一样;第二,它受数据规模的影响大,比如排序,排10个数和排100万个数肯定不一样。所以我们不能以具体测试数据来表示,需要的是一个估算的执行效率的方法。这个方法就是我们要讲的大O复杂度表示法。
-我们从一个例子开始,下面是求1,2,3,…n的累加和的代码
-1 | 1 int cal(int n) { |
我们假设每一行代码的执行时间是相同的,为unit_time,那么这一段代码,第2,3行执行了一次,4,5行执行了n遍,第7行执行了一次,那总共执行的次数2n+3,执行时间为(2n+3)* unit_time。
-可以看出,所有代码的执行时间 T(n) 与每行代码的执行次数成正比。可以用以下公式表示:
-
其中T(n)为所有代码的执行时间
其中f(n)表示每行代码执行的次数总和
公式中的O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。我们的例子中,T(n)=O(2n+3),这就是大O时间复杂度表示法。
-大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
-1 | int a=0; |
O(1) 只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。
-1 | for(int i=1; i<n; i=i*2){ |
对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度。从代码中可以看出,变量 i 的值从 1 开始取,每循环一次就乘以 2。当大于 n 时,循环结束。还记得我们高中学过的等比数列吗?实际上,变量 i 的取值就是一个等比数列
-
通过 2^x = n 求解 x, x=log2n,这段代码的时间复杂度就是 O(log2n),忽略系数,表示为O(logn)。
-1 | for(int i=1; i<=n; i++){ |
for循环代码执行了n遍,因此它消耗的时间是随着n的变化而变化的,所以通过O(n)来表示。如果平行存在一个for循环m遍的,如下:
-1 | for(int i=1; i<=n; i++){ |
那时间复杂度为O(m+n)。
-1 | for(int i=1; i<=n; i++){ |
线性对数O(nlogn)就是将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是n* O(logn),也就是了O(nlogn)
-1 | for(int i=1; i<=n; i++){ |
平方就是O(n)代码再嵌套循环一遍,2层n循环,O(n * n) 为O(n^2)。如果嵌套3层n循环,则为O(n^3),如果嵌套k层,则为O(n^k)。
-如果其中一层循环中的n改为m,如下所示:
-1 | for(int i=1; i<=m; i++){ |
那它的时间复杂度为O(m * n)
-1 | for(int i=1; i<=math.pow(2,n); i++){ |
1 | for(int i=1; i<=factorial(n); i++){ |
以上两个代码例子分别为O(2^n)复杂度和O(n!)复杂度,指数复杂度和阶乘复杂度属于非多项式量级,我们把时间复杂度为非多项式量级的算法问题叫作 NP(Non-Deterministic Polynomial,非确定多项式)问题。
-当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。
-具体增长曲线如下图所示:
-
1 | int i=0; |
代码中的i,j,m不随着处理数据量变化而变化,算法需要的临时空间是固定的,可以表示为空间复杂度O(1)
-1 | int[] m = new int[n]; |
这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-5行,虽然有循环,但没有再分配新的空间,所以这段代码的空间复杂度为O(n)
-平方空间复杂度与O(n)类似,new出来的数组如果是n * n的多维数组,那就是O(n^2)复杂度,如果是m * n的多维数组,那就是O(m * n)复杂度。
-1 | int[][] a = new int[n][n]; |
今天我们学习了复杂度分析的相关基础知识,包括了时间复杂度和空间复杂度,主要是用来分析算法执行效率与数据规模之间的增长关系。
-常见的复杂度,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2),几乎包括了后面学习的所有数据结构和算法的复杂度,希望大家可以好好的掌握。
-
时间复杂度分析还有最好,最坏,平均,均摊时间复杂度等话题需要好好讨论,请关注后续文章,我们会在刷题过程中穿插讲解。
-链接:https://leetcode-cn.com/problems/is-unique-lcci/
难度:简单
--实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
-示例 1:
-输入: s = “leetcode”
-
输出: false
示例 2:输入: s = “abc”
-
输出: true限制:
-0 <= len(s) <= 100
-
如果你不使用额外的数据结构,会很加分。
首先,你得理解题意。不确定的东西,需要问或者尝试验证。
-比如:这里你可以问面试官字符串s是ASCII还是Unicode字符串,如果是编程平台你可以写测试来判断。
-在这里我们假定字符集为ASCII,那如果字符串长度大于128,那肯定是false,不过有限制条件len(s)<=100,那这个判断就不必要了。限制里面还要求不使用额外的数据结构,这就过滤掉了很多的方案。
-比如,使用set就一行代码解决
-1 | class Solution: |
我们很容易想到hash计数的方法,经过测试,字符串中只出现’a’到’z’,26个小写字母,那只需要一个bool数组,直接统计出现的频率,判断是否重复。
-考虑到不使用额外的数据结构,那我们可以尝试使用bitmap,把数组换成一个整型数,按照位上0,1来判断是否重复。
-开始我们算出字符离最开始的字符’a’的距离,然后1移动这个距离来表示这个数。后面用一个测试变量来测试p,如果存在则返回False,如果不存在则写入。
-具体代码:
-def isUnique(self, astr: str) -> bool:
- t = 0
- for c in astr:
- if t & (p := 1 << (ord(c) - ord('a'))):
- return False
- t |= p
- return True在解答中使用了Python3.8的新特性:海象运算符,点击下面的链接,学习使用它。
https://mp.weixin.qq.com/s/3xKdt-26guYHoFb3xP0muw
解法:
-1 | class Solution: |
另外还有三种使用数据结构的解法
-解法1:
-1 | class Solution: |
解法2:
-1 | class Solution: |
解法3:
-1 | class Solution: |
链接:https://leetcode-cn.com/problems/check-permutation-lcci/
难度:简单
--给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
-示例 1:
-输入: s1 = “abc”, s2 = “bca”
-
输出: true
示例 2:输入: s1 = “abc”, s2 = “bad”
-
输出: false说明:
-
0 <= len(s1) <= 100
0 <= len(s2) <= 100
开始,我们还是先理解题意,确定是否区分大小写,是否忽略空白字符等。有了01.01题的hash计数0,1判断的经历,在这里很容易想到使用hash计数。
-因为字符可以重复,需要对字符进行计数,这个时候我们会想到collections库中的Counter。于是有了下面两行代码解决了问题。
-1 | from collections import Counter |
但是上面的方法严格来说算作弊,那我们手写吧。对每个字符进行计数操作并测试是否相等,不相等返回False,全部相等返回True。
-1 | class Solution: |
上面的代码,最容易出问题的是base = set(s1+s2),需要以两个字符串集的唯一字符来进行计数,但这里引入了set。
我们测试了字符范围,发现是’a’到’z’,那么代码可以改成:
-1 | class Solution: |
再进一步,为了直观,我们可以引入string包,代码如下:
-1 | class Solution: |
当然,在这里我们也可以通过排序并比较来解决,代码非常简单:
-1 | class Solution: |
空间复杂度O(nlogn),相比hash计数复杂度要高一些,但是hash计数有空间复杂度。
-在题解中看到一份代码
-1 | class Solution { |
此解法主要是计算s1,s2字符和,比较字符和。这种解法的问题就是忽略了和相同,但数字并不同的情况,比如 3+7 == 2+8。
-除了计算s1,s2的字符和外,计算相对位移和,加s1字符减s2字符等方法都有此问题。
-解法:
-1 | class Solution: |
另外含高级数据结构的三种解法
-解法1:
-1 | class Solution: |
解法2:
-1 | class Solution: |
解法3:
-1 | class Solution: |
上周,Python3.8版本发布,到底带来了哪些新的特性呢?我们应该在哪些场景中使用这些特性呢?本周,我们通过几篇文章来告诉你答案。
-
首先,我们并不推荐安装最新版本到常用的开发环境中,你可以使用虚拟环境或者docker来尝鲜。
-官方安装包
-网址:https://www.python.org/downloads/release/python-380/
也可以使用docker
-拉取镜像命令docker pull python:3.8

赋值表达式被叫做海象运算符,因为它的形状像海象。如果熟悉go语言的话,会对这个表达式会熟悉。
-赋值表达式的语法是
-1 | name := expression |
和赋值语句 = 作用差不多,非必不可少,但可以简化代码。
1 | >>> a = False |
此例子赋值之后,后续还需要使用变量。赋值表达可用于简化代码,提高可读性。
-1 | >>> inputs = list() |
使用赋值操作符时:
-1 | >>> inputs = list() |
此例子,省略了一条语句,可读性上升。
-再来一个例子
-最初版本
-1 | a = [1,2,3,4] |
我们改写为:
-改进版本
-1 | a = [1,2,3,4] |
新特性重写:
重写版本
1 | a = [1,2,3,4] |
从上面可以看到,重写版本和改进版本的不同在于:
-1 | n = len(a) |
与
-1 | if (n:=len(a)) > 3: |
这两个版本的区别在于,:=和=是补充关系并不是替换关系,下面的例子可以看到官方的意图。
1 | x = 5 |
由上面可以看出:=和=是互补关系,在应该使用:=的时候才可以使用:=。
Python语言的一致性,不管是专家还是新手,在同一个问题上都应该有一致的写法,然后这就形成了最pythonic的写法。
-最后带来,新特性带来的最佳实践
-1 | # 简化 os.fork |
Positional-only parameters官方翻译为仅限位置形参,也可以理解为只接受位置参数。意思就是,它只是一个位置参数,不接受关键字传参。
-语法:
-1 | def funx(a,b,/): # / 指明,前面的a,b参数是仅限位置形参 |
函数形参语法/ 用来指明某些函数形参必须使用仅限位置而非关键字参数
其实,Python内置的很多C函数接口都是这种形式,比如
-1 | >>> import builtins |
很多函数后面都有 /来表明,左边的这些参数只接受位置参数。
1 | >>> divmod(1,2) |
指定关键字的参数会报语法错误,它的用途就是强制使用者用位置参数来传参。
-1 | >>> def f(a,b,/,**kwargs): |
由于在 / 左侧的形参不会被公开为可用关键字
这里的a,b 为仅限位置参数,最后a,b会被赋值了两次。
位置参数赋值一次,关键字参数赋值一次,关键字参数以kwargs字典的形式存在,需要通过 kwargs['a'],kwargs['b']访问。
现在我们来看一下,添加了仅限位置形参之后的函数参数形式
-1 | def name(positional_only_parameters, /, positional_or_keyword_parameters, |
包括了仅限位置形参, /, 位置形参或者关键字参数 ,*,仅限关键字参数。

最后,我们可以定义以下形式的函数
-1 | def name(p1, p2, /, p_or_kw, *, kw): |
使用 Python 生成《红楼梦》词云
-
本文介绍如何使用python绘制《红楼梦》的词云。
---“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。
-
“词云”——网络内容发布新招式 .人民网
本文建议在电脑上打开,边阅读边操作。
-可以在cmd窗口输入
-pip install wordcloud matplotlib

文本可以用下面链接下载
-https://github.com/flypythoncom/flypython/blob/master/wordcloud_hlm_seg.txt
或者可以自己写代码,对文本进行清洗,分词。
这里需要安装jieba分词,pip install jieba
1 |
|
1 |
|
结果:
-
后台回复“词云”获得完整运行代码
-人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请加我微信公众号flypython,我们一起探讨python相关问题
- 
--【极简Python 自动化办公】专栏是介绍如何利用python办公,减少工作负荷。篇幅精炼,内容易懂,无论是否有编程基础,都非常适合。
-
在上次文章中,我们学习了【用python读取excel】,这次我们继续学习Python写excel吧!
-
本文大约需要15分钟,建议在电脑上打开,边阅读边操作。
-与上篇文章类似,需要在cmd窗口输入1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 2.准备写入表格内容
这步很简单,只要想好输入内容即可,这里设计了一个简单的表格内容作为写入内容(目前这个内容还不存在)。
| 序号 | 学号 |年龄 |
| --- | --- |--- |
| 张三 | 20190901 |11|
| 李四 |20190902|12 |
| 小明 | 20190903 |13 |
## 3.编写python代码并运行
新建一个writeexcel.py文件,用记事本或其他文本编辑工具打开。
本次写入excel的思路是,新建文件->指定行列->写入内容。
在文本编辑工具中输入如下代码,保存并关闭。
import xlwt
-f = xlwt.Workbook()
sheet1 = f.add_sheet(‘sheet1’,cell_overwrite_ok=True)
column = [“姓名”,”学号”,”年龄”]
name = [“张三”,”李四”,”小明”]
school_code = [20190901,20190902,20190903]
-age = [11,12,13]
-sheet1.write(0,0,column[0])#第1行第1列
sheet1.write(0,1,column[1])#第3行第3列
sheet1.write(0,2,column[2])#第2行第2列
sheet1.write(1,0,name[0])#第2行第1列
sheet1.write(1,1,school_code[0])#第2行第1列
sheet1.write(1,2,age[0])#第3行第1列
sheet1.write(2,0,name[1])
sheet1.write(2,1,school_code[1])
sheet1.write(2,2,age[1])
sheet1.write(3,0,name[2])
sheet1.write(3,1,school_code[2])
sheet1.write(3,2,age[2])
f.save(‘test1.xls’)
-1 |
|
import xlrd
import xlwt
wb = xlrd.open_workbook(“test1.xls”)#打开文件
sheet1 = wb.sheet_by_index(0)#获取第一个表格
column = []#列名
-data=[]
-#获取列名
column.append(sheet1.cell(0,0).value)#姓名
column.append(sheet1.cell(0,1).value)#学号
column.append(sheet1.cell(0,2).value)#年龄
for i in range(1,sheet1.nrows):#sheet1.nrows 行数
coldata=[]
coldata.append(sheet1.cell(i, 0).value)#姓名
coldata.append(int(sheet1.cell_value(i, 1)))#学号
coldata.append(sheet1.cell(i, 2).value)#年龄
data.append(coldata)
f = xlwt.Workbook()
sheetw = f.add_sheet(‘sheet1’,cell_overwrite_ok=True)
sheetw.write(0,0,column[0])#姓名
sheetw.write(0,2,column[2])#学号
sheetw.write(0,1,column[1])#年龄
for i in range(len(data)):
d=data[i]
sheetw.write(i+1, 0, d[0]) # 第2行第1列
sheetw.write(i+1, 1, d[1]) # 第2行第1列
sheetw.write(i+1, 2, d[2]) # 第3行第1列
f.save(‘test2.xls’)
-```
-运行后,会生成一个test2.xls,与test1.xls一模一样。
-人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请加我微信公众号flypython,我们一起探讨python相关问题
- 
--【极简Python 自动化办公】专栏是介绍如何利用python办公,减少工作负荷。篇幅精炼,内容易懂,无论是否有编程基础,都非常适合。
-
在上次文章中,我们学习了【用python写入excel】,这次我们学习Python写word文档吧!
-场景:
有时候,办公室需要按模版生成的固定的文件,模板是固定的,只是每次需要替换信息。如下图的收入证明,模版中所有标黄的都是需要替换的信息:
如果手工来做这个事情,每次至少需要10分钟的时间。假如每天要开15份,则至少要花2个半小时,而且手工编辑word很容易出错。
可不可用python写个程序,解决这个问题呢?
-结论当然是肯定的!
-本文大约需要15分钟,建议在电脑上打开,边阅读边操作。
-与上篇文章类似,需要在cmd窗口输入pip install python-docx。
word模板如上所示,(可以不需要标黄),这里注意,需要替换的文字或数字位置,用”XXXX”来固定替代。保存为个人收入证明.docx。
| 名称 | -内容 | -
|---|---|
| 姓名 | -张三 | -
| 身份证号 | -104111199009103531 | -
| 职务 | -工程师 | -
| 工作年限 | -10 | -
| 月收入 | -10000 | -
| 大写 | -壹万元整 | -
| 联系人 | -李四 | -
| 单位名称 | -格物致知股份有限公司 | -
| 单位地址 | -珠海市横琴新区宝华路6号105室-67425 | -
| 联系电话 | -0756-8627528 | -
在word模板的同级目录,新建一个writeword.py文件,用记事本或其他文本编辑工具打开。
-编程思路:
-在文本编辑工具中输入如下代码,保存并关闭。
-1 | from docx import Document |
在同级目录,打开cmd,运行writeword.py python writeword.py
生成结果如下:张三_个人收入证明.docx
这里生成了对应word文件,但也有几个问题:
-如果您看过我们之前的2篇用python读写excel的文章,您肯定就会想到,可以利用读取excel表格里的内容,批量生成对应的word文档。对,让我们继续吧!
-这里再准备一个excel文件,将需要批量写入的信息写在excel中,并保存为income.xlsx在同级目录,如下图:
-
修改python 文件writeword.py
-1 | from docx import Document |
运行后,输入结果:
-

人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请加我微信公众号flypython,我们一起探讨python相关问题
- 
在工作中,常常会遇到文档格式的转换。如果数据不多,手工转换就可以。如果是大量文档,那我们应该怎么办呢?
-今天我们将使用Python来批量处理文档转换的问题.
-unoconv是一款跨平台的工具,用于格式转换,支持命令行。底层实现是依赖于开源的LibreOffice/OpenOffice。
-项目地址:https://github.com/unoconv/unoconv
-文档地址: http://dag.wiee.rs/home-made/unoconv/
-根据unoconv的文档介绍,支持上百种文档格式的转换,已经覆盖了绝大部分的需求。
-安装unoconv比较繁琐,而且需要针对中文进行进一步的字符集配置。我们可以选择别人已经集成好的服务来进行操作,在这里我们选择了docker-unoconv-webservice项目。
-项目地址为: https://github.com/zrrrzzt/docker-unoconv-webservice
-查看项目的README,接口如下:
-curl --form file=@myfile.docx http://localhost/unoconv/pdf > myfile.pdf
我们使用下列命令,先把项目的镜像pull下来
-docker pull zrrrzzt/docker-unoconv-webservice
然后启动命令如下:
-docker run -d -p 80:3000 zrrrzzt/docker-unoconv-webservice
服务在80端口上提供服务,如果80端口被占用,可以调整为其他的端口
-确认服务正在运行:
-docker ps | grep zrrrzzt/docker-unoconv-webservice
1 | [flypython] docker ps | grep zrrrzzt/docker-unoconv-webservice |
从docx转换为pdf:
-curl --form file=@demo.docx http://localhost/unoconv/pdf > demo.pdf
1 | [flypython] curl --form file=@demo.docx http://localhost/unoconv/pdf > demo.pdf |
Python批量请求的思路是,把需要转换的文档发送到服务器,服务器会返回转换后的格式,我们保存为文件就可以了。
-1 | def post_file(url,path): |
好了,更多类型转换,更完整的应用需要你根据业务来完善,这次的介绍就到这里了。demo完整代码在github上,点击原文可以获取。
-https://github.com/flypythoncom/flypython/blob/master/convert.py
- ---【极简Python 自动化办公】专栏是介绍如何利用python办公,减少工作负荷。篇幅精炼,内容易懂,无论是否有编程基础,都非常适合。
-
在日常的工作中,处理PDF是最平常不过的事情了。今天带来极简Python自动化办公系列之使用Python提取Pdf文字和表格,希望能够在PDF处理上帮到你。
-这次我们准备了一个pdf测试文件,内容如下:
-
pdf中包括了2页,有文字,图片和表格,覆盖了大部分pdf的场景。
-Pdfplumber是一个可以处理pdf格式信息的库。它可以查找关于每个文本字符、矩阵、和行的详细信息,也可以对表格进行提取并进行可视化调试。
-官方repo:
https://github.com/jsvine/pdfplumber
安装:pip install pdfplumber
1 | import pdfplumber |
结果:
-1 | {'fontname': 'CRSMRF+PingFangTC-Semibold', 'adv': Decimal('1.000'), 'upright': 1, 'x0': Decimal('57.000'), 'y0': Decimal('751.840'), 'x1': Decimal('81.000'), 'y1': Decimal('779.776'), 'width': Decimal('24.000'), 'height': Decimal('27.936'), 'size': Decimal('27.936'), 'object_type': 'char', 'page_number': 1, 'text': '关', 'top': Decimal('62.224'), 'bottom': Decimal('90.160'), 'doctop': Decimal('62.224')} |
格式化之后:
-
1 | { |
1 | #!/usr/bin/env python3 |

1 | 关于我们 |
1 | #!/usr/bin/env python3 |

1 | 分类 书名 |
pdfplumber的接口还是很容易的,如果只是需要提取文字,几行代码就可以提取到。如果是表格并没有提取出来或者错误的提取了非表格的内容,你需要在提取表格时加入table_settings参数来指定表格的设置。
这次的demo中,图片并没有提取出来,pdf图片的提取会放到下一篇文章,敬请期待。
-人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,可以长按下列二维码关注我们的公众号。
- 
--【极简Python 自动化办公】专栏是介绍如何利用python办公,减少工作负荷。篇幅精炼,内容易懂,无论是否有编程基础,都非常适合。
-
在上次的文章中,我们从PDF中提取了文字和表格,这次我们需要提取图片。
-还是先来看看我们上次的测试例子
-
这次我们要提取第一页的二维码图片。
-pymupdf是mupdf的Python绑定,而今天我们要使用的fitz是pymupdf的子模块。需要的时候,使用pip安装。
-pip install pymupdf
导入的时使用import fitz导入模块。
更多信息可参考pymupdf的文档:https://pymupdf.readthedocs.io/en/latest/intro/
提取图片的思路是通过正则表达式找到图片对象,然后保存为图片格式。
-1 | #!/usr/bin/env python3 |
运行程序结果:
-1 | [pdf] python3 pdf_img.py |
在img目录中,已经存在了我们需要的文件
-
pymupdf的使用,今天就简单介绍到这里。更多的功能请参考pymupdf文档。
-下一篇,我们将带来pdf转换为图片的讨论。
-人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,可以长按下列二维码关注我们的公众号。
- 

why python?
---你可能听说过python
-Python入门相对容易又可以干很多事(网站,>运维,数据,爬虫等),是一门方便的工具语言。
-
2019年8月TIOBE排名显示Python已经名列第3,仅次于java和c,并且还在快速增长中。
对于数据分析和机器学习,Python是首选编程语言。python有众多数据分析工具,知名数据分析比赛网站kaggle,90%以上的竞赛代码都是用python写成。大数据平台如spark、flink,python有完整的支持api可调用。
-对于网站开发,Python的生态环境也可以支撑起重量级的产品。
国外的Youtube,Instagram,Pinterest,Reddit,Dropbox,Disqus, Quora等知名应用一开始都是基于Python构建,国内的豆瓣,知乎,果壳,饿了么,等初期在也是Python应用的典型。
对于爬虫,则想不到比python更方便、更通用的的语言了。Python极其丰富的生态,诸如Request、Beautiful Soup、Scrapy、PySpider等第三方库,加上简洁易上手的语法,分分钟就能让你写出一个爬虫来。
-此外,还有机器学习、人工智能、科学计算、IT运维等领域,Python都是极其方便顺手的工具,更重要的是,永远开源,免费。
-在it行业飞速发展的今天,在数据成为it命脉的时代,python的重要意义越来越不言自明。学习python,不仅仅是一门可以调用数据结构和算法的语言,在学会python的同时,可以同时学会爬取互联网海量资源,学会自动化分析互联网海量数据,学会制作展示宣传的网站,学会使用人工智能预测和改变世界。
-学习一门语言,得到多种技能,以及大数据的思维方式,何乐而不为呢。
-Python有多火?大多数IT研发岗位,都需要Python程序员;甚至许多非研发岗位,纷纷在JD中给出精通Python技能者优先的字样。
-

对于爱好者来说, python上手非常容易,学习曲线非常平滑。基本的例子,几行代码都能完成。
-python代码环境安装几乎是傻瓜式的,不像java要考虑众多库的配置和解决冲突。如果有编程的基础甚至只需要几小时就能上手,即使没有基础的小白,通过努力,7-10天,每天1小时,也可以快速掌握基本编程技巧。
-Python官网
Python.org
廖雪峰的Python教程
https://www.liaoxuefeng.com/
简明python教程
http://www.kuqin.com/abyteofpython_cn/
重点推荐书籍:《Python 基础教程》
-
知乎评价:
其他入门书籍:
-(我们搜集了一些网上的电子书版本,关注公众号,回复”python”获取)
-当然,英文著作虽然经典,但涉及领域众多,概念多,信息量大,不适合速成。网上的资料丰富,但也鱼龙混杂。
-以 “Python入门” 为关键字搜索出的结果成千上万。不少小白选手难免会东一榔头西一棒槌,最终看了很多文章,却仍没跨过新手那道门槛。
-我们这里有一个python的入门课程,帮你把需要掌握的python基础知识都融汇贯通在小篇幅中。我们提供了很多有趣的实践项目,并且可以进群,互助学习,遇到困难有人来解答。
-加群请关注公众号,并回复“训练营”

--11 月 15 日,SOHO 中国董事长潘石屹在微博上宣布,开始学习一门新的语言 Python,这也是今天给自己人生的礼物。
-

什么鬼?房地产大佬要学python?
-
潘石屹,一位成功的房地产开发商老板,第一专业是石油方面的,63年出生,年龄都超过了55岁,这些描述怎么着都和编程沾不上边啊。然而,最近他非常高调地表示,要学习一款编程语言。
虽然我不同意他的有些观点,不过他的跨界,不给自己设限的态度是还是值得学习的。
大佬都忙着学编程,这让我们35岁左右的专业程序员们非常惭愧啊(难道非得财务自由以后才能学python么)。

潘石屹学python肯定不是为了转行找工作,肯定也不是为了爬取全网美女图片,他在微博里详细阐述了我们为什么要学习Python语言。
-
我们为什么要学习python——使用范围广
01.数据分析
对于数据科学和机器学习,Python是首选编程语言。python有众多数据分析工具,知名数据分析比赛网站kaggle,90%以上的竞赛代码都是用python写成。大数据平台如hadoop、spark、flink、beam,python有完整的支持api可调用。
-02.网站开发
-对于网站开发,Python的生态环境也可以支撑起重量级的产品。国外的Youtube,Instagram,Pinterest,Reddit,Dropbox,Disqus, Quora等知名应用一开始都是基于Python构建,国内的豆瓣,知乎,果壳,饿了么,等初期在也是Python应用的典型。
-03.爬虫
-对于爬虫,则想不到比python更方便、更通用的的语言了。Python极其丰富的生态,诸如Request、Beautiful Soup、Scrapy、PySpider等第三方库,加上简洁易上手的语法,分分钟就能让你写出一个爬虫来。
-此外,还有机器学习、人工智能、科学计算、IT运维等领域,Python都是极其方便顺手的工具,更重要的是,永远开源,免费。
-Python的就业前景
在it行业飞速发展的今天,在数据成为it命脉的时代,python的重要意义越来越不言自明。学习python,不仅仅是一门可以调用数据结构和算法的语言,在学会python的同时,可以同时学会爬取互联网海量资源,学会自动化分析互联网海量数据,学会制作展示宣传的网站,学会使用人工智能预测和改变世界。学习一门语言,得到多种技能,以及大数据的思维方式,何乐而不为呢。
Python有多火?大多数IT研发岗位,都需要Python程序员;甚至许多非研发岗位,纷纷在JD中给出精通Python技能者优先的字样。
-Python的学习曲线
对于爱好者来说, python上手非常容易,学习曲线非常平滑。基本的例子,几行代码都能完成。python代码环境安装几乎是傻瓜式的,不像java要考虑众多库的配置和解决冲突。如果有编程的基础甚至只需要几小时就能上手,即使没有基础的小白,通过努力,7-10天,每天1小时,也可以快速掌握基本编程技巧。
Python的学习资料
-Python官网
-Python.org
-廖雪峰的Python教程
- -简明的python教程
-http://www.kuqin.com/abyteofpython_cn/
-重点推荐书籍:
-《Python 基础教程》
-知乎评价:
-其他入门书籍:
-Head First Python
-Dive Into Python
-Python 核心编程
-深入理解 Python
-Python 标准库
-Python 编程指南
-(我们搜集了一些网上的电子书版本,关注公众号,回复”python”获取)
-当然,英文著作虽然经典,但涉及领域众多,概念多,信息量大,不适合速成。网上的资料丰富,但也鱼龙混杂。
-以 “Python入门” 为关键字搜索出的结果成千上万。不少小白选手难免会东一榔头西一棒槌,最终看了很多文章,却仍没跨过新手那道门槛。
-我们这里有一个python的入门课程,帮你把需要掌握的python基础知识都融汇贯通在小篇幅中。我们提供了很多有趣的实践项目,并且可以进群,互助学习,遇到困难有人来解答。
-加群请加个人微信号flypython。
-人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,动动手指分享给更多人哦。
- -flypython群里有同学问我,如何从大量格式不确定的word文档抽取姓名、电话号码、邮箱等信息存入excel表格。通过之前我们的文章,他已经学会读取和写入文档和表格,但就是无法处理格式不确定的文档。这里介绍的正则方法,可以帮助他解决这个问题。
-15分钟内让你真正明白正则表达式是什么,并且让你可以在自己的python程序里正确使用它。
-你将学会:
-假设程序从word或者excel读取了一串字符串,字符串中有一部分是电话号码,现在需要完整提取这个电话号码。
-1 | import re |
输出:
-
解释:"[0-9]+"是正则表达式,意思是匹配0-9的数字,"+"
表示可以匹配1次-多次,reg.findall表示从后面的字符串里找到所有的匹配值。
字符集,又叫元字符,就是用一些特殊符号表示特定种类的字符或位置。
-| 代码 | -说明 | -
|---|---|
. |
-匹配除换行符以外的任意一个字符 | -
\d |
-匹配数字 | -
\w |
-匹配字母或数字或下划线或汉字 | -
\s |
-匹配任意的空白符 | -
^ |
-匹配字符串的开始 | -
$ |
-匹配字符串的结束 | -
举例
-1 | import re |
输出:
| 代码 | -说明 | -
|---|---|
* |
-重复0次-无数次 | -
+ |
-重复1次-无数次 | -
? |
-重复0次-1次 | -
{m} |
-重复m次 | -
{m,n} |
-重复m-n次 | -
举例
-1 | import re |
输出:
贪婪:匹配尽可能长的字符串
懒惰:匹配尽可能短的字符串
懒惰模式的启用只需在重复元字符之后加?既可。
*? 重复任意次,但尽可能少重复+? 重复1次或更多次,但尽可能少重复?? 重复0次或1次,但尽可能少重复{n,m}? 重复n到m次,但尽可能少重复{n,}? 重复n次以上,但尽可能少重复举例
-1 | import re |
输出
注意:
如果想匹配元字符本身或者正则中的一些特殊字符,使用\\转义。
这里介绍的正则内容是最基础的,想要了解更详细的正则表达式语法,请参考:
-有时候我们想利用正则表达式对用户输入进行判断,比如判断用户输入的身份证号是否符合规则,那么可以这样写:
-1 | import re |
输入结果
说明:^字符表示必须匹配字符串开头;$表示必须匹配字符串结尾。
假设,输出一串文本,只想保留汉字,去除特殊符号。代码如下:
-1 | import re |
输入结果:
查找某个文本在字符串中的位置,一般用于信息提取。
-1 | import re |
输出结果
-
人生苦短,我用python早下班。如果觉得不错,对你工作中有帮助,请长按下面二维码关注我们。(回复训练营加群,一起探讨python问题)
- 
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划第0篇 -
-
- - LeetCode刷题计划启动啦 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划第0篇 -
-
- - LeetCode刷题计划启动啦 -
-
- - 飞蟒微课堂正式开班 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划 -
-
- - LeetCode刷题计划第0篇 -
-
- - LeetCode刷题计划启动啦 -
-
- - cs224n解答 -
-
- - cs224n解答 -
-
- - 飞蟒微课堂正式开班 -
-
- - 介绍Python语言新的特性 -
-
- - 介绍Python语言新的特性 -
-
- - Python自然语言处理教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - Python入门教程 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 极简Python自动化办公系列 -
-
- - 关于飞蟒Python -
-