更新了番外篇内容

This commit is contained in:
jackfrued 2025-02-15 01:08:40 +08:00
parent eb96ffdeda
commit a77f01f8c0
23 changed files with 89 additions and 157 deletions

View File

@ -29,7 +29,7 @@
7. 《Flask Web开发基于Python的Web应用开发实战》*Flask Web Development: Developing Web Applications with Python*
8. 《深入理解Flask》*Mastering Flask*
### 爬虫开发
### 数据采集
1. 《用Python写网络爬虫》*Web Scraping with Python*
2. 《精通Python爬虫框架Scrapy》*Learning Scrapy*

View File

@ -2,7 +2,7 @@
Python中提供了非常丰富的容器型数据类型大家最为熟悉的有`list`、`tuple`、`set`、`dict`等。下面为大家分享一些使用这些类型的小技巧希望帮助大家写出更加Pythonic的代码。
### 从字典中取最大
#### 1. 从字典中取最大
假设字典对象对应的变量名为`my_dict`。
@ -46,7 +46,7 @@ Python中提供了非常丰富的容器型数据类型大家最为熟悉的
> return g
> ```
### 统计列表元素出现次数
#### 2. 统计列表元素出现次数
假设列表对象对应的变量名为`my_list`。
@ -72,7 +72,7 @@ from collections import Counter
dict(Counter(my_list))
```
### 截断列表元素
#### 3. 截断列表元素
假设列表对象对应的变量名为`my_list`,通常大家会想到用下面的方式来截断列表。
```Python
@ -87,7 +87,7 @@ del my_list[i:]
del my_list[:j]
```
### 按最长列表实现zip操作
#### 4. 按最长列表实现zip操作
Python的内置函数`zip`可以产生一个生成器对象,该生成器对象将两个或多个可迭代对象的元素组装到一起,如下所示。
@ -115,7 +115,7 @@ list(zip_longest('abc', [1, 2, 3, 4]))
[('a', 1), ('b', 2), ('c', 3), (None, 4)]
```
### 快速拷贝一个列表
#### 5. 快速拷贝一个列表
如果希望快速拷贝一个列表对象,可以通过切片操作来实现,但是切片操作仅实现了浅拷贝,简单的说就是切片创建了新的列表对象,但是新列表中的元素是和之前的列表共享的。如果希望实现深拷贝,可以使用`copy`模块的`deepcopy`函数。
@ -141,7 +141,7 @@ list(zip_longest('abc', [1, 2, 3, 4]))
thy_list = copy.deepcopy(my_list)
```
### 对两个或多个列表对应元素进行操作
#### 6. 对两个或多个列表对应元素进行操作
Python内置函数中的`map`函数可以对一个可迭代对象中的元素进行“映射”操作,这个函数在批量处理数据时非常有用。但是很多人都不知道,这个函数还可以作用于多个可迭代对象,通过传入的函数对多个可迭代对象中的对应元素进行处理,如下所示。
@ -165,7 +165,7 @@ thy_list = [2, 4, 6, 8, 10]
[x + y for x, y in zip(my_list, thy_list)]
```
### 处理列表中的空值和零值
#### 7. 处理列表中的空值和零值
假设列表对象对应的变量名为`my_list`,如果列表中有空值(`None`)和零值,我们可以用下面的方式去掉空值和零值。
@ -179,7 +179,7 @@ list(filter(bool, my_list))
[x for x in my_list if x]
```
### 从嵌套列表中抽取指定列
#### 8. 从嵌套列表中抽取指定列
假设`my_list`是一个如下所示的嵌套列表,该嵌套列表可以用来表示数学上的矩阵,如果要取出矩阵第一列的元素构成一个列表,我们可以这样写。
@ -219,10 +219,4 @@ list(col2)
[1, 6, 3],
[2, 7, 4],
[2, 8, 4]]
```
### 小结
不知道上面的内容有没有触及到大家的知识盲区,如果有的话欢迎在评论区留言讨论。
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 681 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

View File

@ -6,42 +6,42 @@
### Hexo概述
Hexo是一个快速、简洁且高效的博客框架它能够将[Markdown格式](<https://zh.wikipedia.org/zh-hans/Markdown>)的文档渲染成漂亮的网页这样我们就可以在很短的时间内迅速的创建出网站的静态内容而Markdown格式对程序员来说相信并不陌生。要想使用Hexo来搭建自己的博客我实在想不出有什么教程比[官方文档](<https://hexo.io/zh-cn/>)更好强烈建议大家阅读官方文档来了解Hexo下面我只做一个简要的使用说明。
Hexo 是一个快速、简洁且高效的博客框架,它能够将 [Markdown](<https://zh.wikipedia.org/zh-hans/Markdown>) 文档渲染成漂亮的网页,这样我们就可以在很短的时间内迅速的创建出网站的静态内容,而 Markdown 格式对程序员来说相信并不陌生。要想使用Hexo来搭建自己的博客我实在想不出有什么教程比[官方文档](<https://hexo.io/zh-cn/>)更好,强烈建议大家阅读官方文档来了解 Hexo下面我只做一个简要的使用说明。
> 说明:**Markdown**是一种轻量级标记语言它允许人们使用易读易写的纯文本格式编写文档同时也对图片、图表、数学公式提供了支持可以用来书写电子书、软件文档等同时也可以非常方便的转换为HTML页面或者是PDF文档。
> 说明:**Markdown **是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,同时也对图片、图表、数学公式提供了支持,可以用来书写电子书、软件文档等,同时也可以非常方便的转换为 HTML 页面或者是 PDF 文档。
要使用Hexo首先得确保计算机上已经安装了[node.js](<https://nodejs.org/en/>)环境和[git](<https://git-scm.com/>)环境前者是一个能够在服务器端运行JavaScript代码的环境后者是版本控制工具。安装node.js主要是为了使用它的包管理工具npm所以不需要先系统的学习node.js的知识而安装git是为了利用版本控制系统克隆代码已经将博客项目托管到三方平台如果想学习git最好的资料是官方网站上的[*Git Pro*](<https://git-scm.com/book/zh/v2>)和[《Git权威指南》](<http://www.worldhello.net/gotgit/index.html>)。安装完成后我们可以通过下面的命令来确认node.js环境以及它的包管理工具是否安装成功。
要使用 Hexo首先得确保计算机上已经安装了 [node.js](<https://nodejs.org/en/>) 环境和 [git](<https://git-scm.com/>) 环境,前者是一个能够在服务器端运行 JavaScript 代码的环境,后者是版本控制工具。安装 node.js 主要是为了使用它的包管理工具 npm所以不需要先系统的学习 node.js 的知识;而安装 git 是为了利用版本控制系统克隆代码已经将博客项目托管到三方平台,如果想学习 git最好的资料是官方网站上的 [*Git Pro*](<https://git-scm.com/book/zh/v2>) 和[《Git权威指南》](<http://www.worldhello.net/gotgit/index.html>)。安装完成后,我们可以通过下面的命令来确认 node.js 环境以及它的包管理工具是否安装成功。
```Shell
node --version
npm --version
```
可以通过下面的命令来检查是否安装了git环境。
可以通过下面的命令来检查是否安装了 git 环境。
```Shell
git --version
```
我们可以使用npm来安装Hexonpm是node.js的包管理工具跟Python的pip工具作用一样可以用它来安装依赖库和三方工具。在第一次使用npm的时候我们可以先将npm的下载源更换为国内的淘宝镜像这样下载的速度会有非常显著的提升。
我们可以使用 npm 来安装 Hexonpm node.js 的包管理工具,跟 Python pip 工具作用一样,可以用它来安装依赖库和三方工具。在第一次使用 npm 的时候,我们可以先将 npm 的下载源更换为国内的淘宝镜像,这样下载的速度会有非常显著的提升。
```Shell
npm config set registry https://registry.npm.taobao.org
```
接下来我们就通过npm来安装Hexo命令如下所示。
接下来我们就通过 npm 来安装 Hexo命令如下所示。
```Shell
npm install -g hexo-cli
```
安装成功后就可以使用Hexo来创建属于自己的博客啦。
安装成功后,就可以使用 Hexo 来创建属于自己的博客啦。
### 搭建博客
> 说明以下内容基本上来自于Hexo的官方文档推荐大家阅读官方文档。
> 说明:以下内容基本上来自于 Hexo 的官方文档,推荐大家阅读官方文档。
我们先通过下面的命令来创建一个专门保存博客项目的文件夹该命令会从github上克隆博客项目和默认的主题。
我们先通过下面的命令来创建一个专门保存博客项目的文件夹,该命令会从 github 上克隆博客项目和默认的主题。
```Shell
hexo init blog
@ -65,7 +65,7 @@ drwxr-xr-x 3 Hao staff 96 8 8 01:15 source
drwxr-xr-x 3 Hao staff 96 8 8 01:15 themes
```
> 说明Windows环境命令行提示符中可以使用dir命令查看目录结构。需要说明的是`_config.yml`是博客项目的配置文件;`package.json`是项目的依赖项文件;`scaffolds`保存了Markdown文件的模板也就是向新添加的Markdown文件中默认填充的内容`source`目录下有一个名为`_post`的目录我们稍后可以将编写好的Markdown文件放到该目录这样就可以利用Hexo将Markdown文件处理成博客的静态页面生成的静态页面将置于`public`目录下;`themes`文件夹保存了博客使用的主题。
> 说明Windows 环境命令行提示符中可以使用`dir`命令查看目录结构。需要说明的是:`_config.yml`是博客项目的配置文件;`package.json`是项目的依赖项文件;`scaffolds`保存了 Markdown 文件的模板,也就是向新添加的 Markdown 文件中默认填充的内容;`source`目录下有一个名为`_post`的目录,我们稍后可以将编写好的 Markdown 文件放到该目录,这样就可以利用 Hexo Markdown 文件处理成博客的静态页面,生成的静态页面将置于`public`目录下;`themes`文件夹保存了博客使用的主题。
然后我们通过下面的命令来安装项目所需的依赖项(`package.json`文件指明了这些依赖项)。
@ -85,7 +85,7 @@ hexo generate
hexo g
```
之前我们在安装依赖项的时候包括了一个名为`hexo-server`的依赖项该依赖项可以帮助我们启动一个基于node.js的服务器来运行我们的博客项目使用下面的命令即可启动服务器。
之前我们在安装依赖项的时候包括了一个名为`hexo-server`的依赖项,该依赖项可以帮助我们启动一个基于 node.js 的服务器来运行我们的博客项目,使用下面的命令即可启动服务器。
```Shell
hexo server
@ -102,15 +102,15 @@ INFO Start processing
INFO Hexo is running at http://localhost:4000 . Press Ctrl+C to stop.
```
从运行命令的提示信息可以看到服务器已经运转起并使用了4000端口可以通过`Ctrl+C`来终止服务器的运行。如果要修改服务器使用的端口,可以在启动服务器的时候加上`-p`参数;如果希望服务器启动后,自动打开默认的浏览器访问服务器,可以使用`-o`参数,如下所示。
从运行命令的提示信息可以看到,服务器已经运转起并使用了 4000 端口,可以通过`Ctrl+C`来终止服务器的运行。如果要修改服务器使用的端口,可以在启动服务器的时候加上`-p`参数;如果希望服务器启动后,自动打开默认的浏览器访问服务器,可以使用`-o`参数,如下所示。
```Shell
hexo s -p 8000 -o
```
至此我们已经可以看到Hexo在没有配置也没有加入自己的Markdown文件下生成的首页如下图所示。
至此,我们已经可以看到 Hexo 在没有配置也没有加入自己的 Markdown 文件下生成的首页,如下图所示。
![](./res/hexo-default-index.png)
![](res/hexo-default-index.png)
接下来我们修改博客的配置文件。
@ -202,7 +202,7 @@ deploy:
type:
```
下面是YAML文件中相关选项的说明。
下面是 YAML 文件中相关选项的说明。
| 参数 | 描述 |
| ------------------ | ------------------------------------------------------------ |
@ -215,24 +215,24 @@ deploy:
| `timezone` | 网站使用时区,默认使用电脑上设置的时区 |
| `url` | 网址 |
| `root` | 网站根目录 |
| `source_dir` | 资源文件夹这个文件夹用来存放内容默认source目录 |
| `public_dir` | 公共文件夹这个文件夹用于存放生成的站点文件默认public目录 |
| `tag_dir` | 标签文件夹默认tags目录 |
| `archive_dir` | 归档文件夹默认archives目录 |
| `category_dir` | 分类文件夹默认categories目录 |
| `auto_spacing` | 在中文和英文之间加入空格默认false |
| `titlecase` | 把标题转换为首字母大写默认false |
| `external_link` | 在新标签中打开链接默认true |
| `relative_link` | 把链接改为与根目录的相对位址默认false |
| `source_dir` | 资源文件夹,这个文件夹用来存放内容,默认 source 目录 |
| `public_dir` | 公共文件夹,这个文件夹用于存放生成的站点文件,默认 public 目录 |
| `tag_dir` | 标签文件夹,默认 tags 目录 |
| `archive_dir` | 归档文件夹,默认 archives 目录 |
| `category_dir` | 分类文件夹,默认 categories 目录 |
| `auto_spacing` | 在中文和英文之间加入空格,默认 false |
| `titlecase` | 把标题转换为首字母大写,默认 false |
| `external_link` | 在新标签中打开链接,默认 true |
| `relative_link` | 把链接改为与根目录的相对位址,默认 false |
| `default_category` | 默认分类 |
| `date_format` | 日期格式默认YYYY-MM-DD |
| `time_format` | 时间格式默认HH:mm:ss |
| `per_page` | 每页显示的文章数量 默认值100表示不使用分页 |
| `pagination_dir` | 分页目录默认为page目录 |
| `date_format` | 日期格式,默认 YYYY-MM-DD |
| `time_format` | 时间格式,默认 HH:mm:ss |
| `per_page` | 每页显示的文章数量 ,默认值 100 表示不使用分页 |
| `pagination_dir` | 分页目录,默认为 page 目录 |
| `theme` | 当前主题名称 |
| `deploy` | 部署部分的设置 |
我们将编写好的Markdown文件可以拷贝到`source/_posts`目录我们可以在每个Markdown文件的上方添加Front-matter来对文件的布局、标题、分类、标签、发布日期等信息加以说明。所谓Front-matter就是每个Markdown文件最上方以`---`分隔的区域可以在Front-matter中设置以下内容。
我们将编写好的 Markdown 文件可以拷贝到`source/_posts`目录,我们可以在每个 Markdown 文件的上方添加 Front-matter 来对文件的布局、标题、分类、标签、发布日期等信息加以说明。所谓 Front-matter就是每个 Markdown 文件最上方以`---`分隔的区域可以在Front-matter中设置以下内容。
| 参数 | 描述 | 默认值 |
| ------------ | -------------------- | ------------ |
@ -285,13 +285,13 @@ hexo server -p 8000 -o
### 将博客托管到GitHub
我们可以利用GitHub网站提供的[Pages服务](<https://pages.github.com/>)来托管我们的博客。在GitHub Pages的首页上就有一个教程指导我们如何托管自己的网站当然第一步得在GitHub上注册一个属于自己的账号登录成功之后才能进行后续的操作。
我们可以利用 GitHub 网站提供的 [Pages](<https://pages.github.com/>) 服务来托管我们的博客。在 GitHub Pages 的首页上就有一个教程指导我们如何托管自己的网站,当然第一步得在 GitHub 上注册一个属于自己的账号,登录成功之后才能进行后续的操作。
1. 根据自己的用户名创建一个仓库,仓库**一定**要取名为“用户名.github.io”。例如我在GitHub上的用户名是jackfrued那么我的托管博客项目的仓库一定要命名为jackfrued.github.io。
1. 根据自己的用户名创建一个仓库,仓库**一定**要取名为“用户名.github.io”。例如我在 GitHub 上的用户名是 jackfrued那么我的托管博客项目的仓库一定要命名为 jackfrued.github.io。
![](./res/create-new-repo.png)
![](res/create-new-repo.png)
2. 修改博客项目的配置文件`_config.yml`配置使用GitHub来部署该博客项目。
2. 修改博客项目的配置文件`_config.yml`,配置使用 GitHub 来部署该博客项目。
```Shell
vim _config.yml
@ -307,7 +307,7 @@ hexo server -p 8000 -o
branch: master
```
上面的配置中type指定了使用git进行项目部署repo指定了部署项目的git仓库的URL我们这里使用的是HTTPS的地址如果之前配置过密钥对也可以使用SSH的地址branch指定了将代码同步到仓库中的哪一个分支通常master分支就是发布项目最终工作成果的分支也称为项目的主分支。
上面的配置中type 指定了使用 git 进行项目部署repo 指定了部署项目的 git 仓库的 URL我们这里使用的是 HTTPS 的地址,如果之前配置过密钥对也可以使用 SSH 的地址branch 指定了将代码同步到仓库中的哪一个分支,通常 master 分支就是发布项目最终工作成果的分支,也称为项目的主分支。
3. 安装名为`hexo-deployer-git`的部署器插件,通过该插件就能实现一键部署。
@ -315,7 +315,7 @@ hexo server -p 8000 -o
npm install hexo-deployer-git --save
```
4. 可以使用下面的命令来实现一键部署到GitHub。
4. 可以使用下面的命令来实现一键部署到 GitHub。
```Shell
hexo deploy -g
@ -327,30 +327,26 @@ hexo server -p 8000 -o
hexo generate -d
```
5. 接下来在浏览器中输入[jackfrued.github.io](https://jackfrued.github.io)就能够看到自己的博客现在全世界的人都可以通过这个URL来访问你的博客。大家是否注意到访问你博客的这个URL就是刚才我们给仓库起的名字因为你在GitHub上注册的用户名是独一无二的所以这个域名也是全世界独一无二的。
5. 接下来在浏览器中输入 [jackfrued.github.io](https://jackfrued.github.io) 就能够看到自己的博客,现在全世界的人都可以通过这个 URL 来访问你的博客。大家是否注意到,访问你博客的这个 URL 就是刚才我们给仓库起的名字因为你在GitHub上注册的用户名是独一无二的所以这个域名也是全世界独一无二的。
### 将博客绑定到自己的域名
虽然我们已经通过GitHub提供的域名访问到了自己的博客但是如果我们不愿意“寄人篱下”我们在利用GitHub Pages提供的托管服务同时也可以将博客绑定到自己专属的域名。如果暂时还没有购买域名我们可以在提供域名购买服务的网站[万网](<https://www.hichina.com/>)、[GoDaddy](<https://www.godaddy.com/>))上进行购买。
虽然我们已经通过 GitHub 提供的域名访问到了自己的博客,但是如果我们不愿意“寄人篱下”,我们在利用 GitHub Pages 提供的托管服务同时,也可以将博客绑定到自己专属的域名。如果暂时还没有购买域名,我们可以在提供域名购买服务的网站(如:[万网](<https://www.hichina.com/>)、[GoDaddy](<https://www.godaddy.com/>))上进行购买。
![](./res/wanwang.png)
![](res/wanwang.png)
> 说明:目前国内对域名的管理日趋严格,在购买域名时需要填写一大堆的个人信息,进行实名认证后才能获得域名,这一点相信大家能够理解。
> **说明**:目前国内对域名的管理日趋严格,在购买域名时需要填写一大堆的个人信息,进行实名认证后才能获得域名,这一点相信大家能够理解。
比如说我现在已经购买了一个名为“jackfrued.top”的域名如何让它跟“jackfrued.github.io”这个域名做一个绑定呢我们可以利用[阿里云控制台](<https://dns.console.aliyun.com/>)或者[DNSPod](<https://www.dnspod.cn/>)来做一个域名解析服务。在域名解析平台登录成功后可以添加或选择自己的域名来配置域名解析。点击“添加记录”按钮创建一个类型为CNAME的域名解析CNAME类型的解析代表将一个域名解析到另一个域名如下图所示。
比如说我现在已经购买了一个名为“jackfrued.top”的域名如何让它跟“jackfrued.github.io”这个域名做一个绑定呢我们可以利用[阿里云控制台](<https://dns.console.aliyun.com/>)或者 [DNSPod](<https://www.dnspod.cn/>) 来做一个域名解析服务。在域名解析平台登录成功后,可以添加或选择自己的域名来配置域名解析。点击“添加记录”按钮,创建一个类型为 CNAME 的域名解析CNAME 类型的解析代表将一个域名解析到另一个域名,如下图所示。
![](./res/dns-configuration.png)
![](res/dns-configuration.png)
完成这一步后,还不能马上通过自己的域名访问到博客项目,最后需要在博客项目的`source`目录下添加一个名为CNAME的文件请注意这个文件的名字是全大写字母的
```Shell
vim CNAME
```
编辑该文件的内容,如下所示。
完成这一步后,还不能马上通过自己的域名访问到博客项目,最后需要在博客项目的`source`目录下添加一个名为 CNAME 的文件(请注意这个文件的名字是全大写字母的),该文件的内容如下所示。
```
jackfrued.top
```
可以清理一下之前生成的内容然后将项目重新生成并发布到GitHub就大功告成了现在我们已经拥有了独立域名的博客希望大家可以利用它做些有意义的事情记录自己的成长历程、分享自己的工作经验、提升个人的影响力。加油吧程序员
可以清理一下之前生成的内容,然后将项目重新生成并发布到 GitHub 就大功告成了!现在我们已经拥有了独立域名的博客,希望大家可以利用它做些有意义的事情(记录自己的成长历程、分享自己的工作经验、提升个人的影响力)。
加油吧,程序员!

View File

@ -0,0 +1,21 @@
## 分享几张学习路线图
今天逛了一个名为 [Developer Roadmaps](https://roadmap.sh) 的网站,上面就有好多的学习路线图。其中有一张关于 Python 的学习路线图还不错,分享给大家。如果用 Python 做工程化开发(后端开发、接口开发、应用开发等),这张图上的内容基本都是需要涉猎的;如果仅仅是将 Python 作为辅助工具,学习之前给大家整理的[《从零开始学Python》](https://www.zhihu.com/column/c_1216656665569013760)的 20 节课就已经足够了。近期,我也在重置这 20 节课的内容重置后的内容会标记为“2025版”也希望在这个过程中听到大家的意见和建议。
![](res/Python-Roadmap.png)
这里还有三个相关的学习路线图分别是后端开发Backend、开发运维DevOps和数据科学Data Science后端开发的学习路线图如下所示内容比较庞杂核心的编程语言是 Java 或 Go。我个人不推荐大家用 Python 做后端开发,如果 Python 语言已经掌握得很好了,同时也具备了较多的计算机科学相关知识,可以尝试 AI 应用开发这个赛道,我相信你会有更多的收获。大家可以注意下用紫色勾选的项目,这些是作者推荐的选项,大部分也是我想推荐给后端开发者学习的内容。
![](res/Backend-Roadmap.png)
我们再看看开发运维的学习路线图,目前 DevOps 也是招聘市场的热门岗位,有兴趣的小伙伴可以关注下。
![](res/DevOps-Roadmap.png)
如果学过一些 Python 相关知识想以此为基础转行做数据分析可以看看下面这个学习路线图。需要说明的是Python 仅仅是做数据分析的一个工具,要成为一个优秀的数据分析师需要有良好的数据思维,同时还要积累足够的业务知识,这样才能从数据中产生商业洞察,用数据优化产品、驱动业务,真正为决策提供强有力的支撑。
![](res/Data-Analyst-Roadmap.png)
最后,再次提醒大家,想打卡学习的一定记得在评论区给我留言!如果想**入坑数据科学**(数据分析、数据挖掘、数据治理等)也可以给我留言,今年应该会持续输出相关的内容。
![](res/modern-data-scientist.webp)

View File

@ -1,14 +1,14 @@
## 我为什么选择了Python
目前Python语言的发展势头在国内国外都是不可阻挡的Python凭借其简单优雅的语法强大的生态圈从众多语言中脱颖而出如今已经是稳坐编程语言排行榜前三的位置。国内很多Python开发者都是从Java开发者跨界过来的我自己也不例外。我简单的跟大家交代一下我为什么选择了Python。
目前Python 语言的发展势头在国内国外都是不可阻挡的Python 凭借其简单优雅的语法,强大的生态圈从众多语言中脱颖而出,如今已经是稳坐编程语言排行榜前三的位置。国内很多 Python 开发者都是从 Java 开发者跨界过来的,我自己也不例外。我简单的跟大家交代一下,我为什么选择了 Python。
### Python vs. Java
我们通过几个例子来比较一下做同样的事情Java和Python的代码都是怎么写的。
我们通过几个例子来比较一下,做同样的事情 Java Python 的代码都是怎么写的。
例子1在终端中输出“hello, world”。
Java代码
Java 代码:
```Java
class Test {
@ -19,7 +19,7 @@ class Test {
}
```
Python代码
Python 代码:
```Python
print('hello, world')
@ -27,7 +27,7 @@ print('hello, world')
例子2从1到100求和。
Java代码
Java 代码:
```Java
class Test {
@ -42,7 +42,7 @@ class Test {
}
```
Python代码
Python 代码:
```Python
print(sum(range(1, 101)))
@ -50,7 +50,7 @@ print(sum(range(1, 101)))
例子3双色球随机选号。
Java代码
Java 代码:
```Java
import java.util.List;
@ -93,7 +93,7 @@ class Test {
}
```
Python代码
Python 代码:
```Python
from random import randint, sample

View File

@ -1,79 +0,0 @@
## 玩转PyCharm
PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境它最大的优点是能够大大提升Python开发者的工作效率为开发者集成了很多用起来非常顺手的功能包括代码调试、高亮语法、代码跳转、智能提示、自动补全、单元测试、版本控制等等。此外PyCharm还提供了对一些高级功能的支持包括支持基于Django框架的Web开发。
### PyCharm的下载和安装
可以在[JetBrains公司的官方网站](<https://www.jetbrains.com/>)找到PyCharm的[下载链接](https://www.jetbrains.com/pycharm/download/)有两个可供下载的版本一个是社区版PyCharm CE一个是专业版PyCharm Professional。社区版在Apache许可证下发布可以免费使用专业版在专用许可证下发布需要购买授权后才能使用但新用户可以试用30天。很显然专业版提供了更为强大的功能和对企业级开发的各种支持但是对于初学者来说社区版已经足够强大和好用了。安装PyCharm只需要直接运行下载的安装程序然后持续的点击“Next”下一步按钮就可以啦。下面是我在Windows系统下安装PyCharm的截图安装完成后点击“Finish”结束按钮关闭安装向导然后可以通过双击桌面的快捷方式来运行PyCharm。
![](res/pycharm-installation.png)
### 首次使用的设置
第一次使用PyCharm时会有一个导入设置的向导如果之前没有使用PyCharm或者没有保存过设置的就直接选择“Do not import settings”进入下一步即可下面是我在macOS系统下第一次使用PyCharm时的截图。
![](res/pycharm-import-settings.png)
专业版的PyCharm是需要激活的**强烈建议大家在条件允许的情况下支付费用来支持优秀的产品**如果不用做商业用途或者不需要使用PyCharm的高级功能我们可以暂时选择试用30天或者使用社区版的PyCharm。如果你是一名学生希望购买PyCharm来使用可以看看[教育优惠官方申请指南](https://sales.jetbrains.com/hc/zh-cn/articles/207154369)。如下图所示我们需要点击“Evaluate”按钮来试用专业版PyCharm。
![](res/pycharm-activation.png)
接下来是选择UI主题可以根据个人喜好进行选择深色的主题比较护眼而浅色的主题对比度更好。
![](res/pycharm-ui-themes.png)
再接下来是创建可以在“终端”或“命令行提示符”中运行PyCharm的启动脚本当然也可以不做任何勾选直接点击“Next: Featured plugins”按钮进入下一环节。
![](res/pycharm-create-launcher.png)
然后可以选择需要安装哪些插件,我们可以暂时什么都不安装,等需要的时候再来决定。
![](res/pycharm-install-plugins.png)
最后点击上图右下角的“Start using PyCharm”开始使用PyCharm就可以开启你的PyCharm之旅了。
### 用PyCharm创建项目
启动PyCharm之后会来到一个欢迎页在欢迎页上我们可以选择“创建新项目”Create New Project、“打开已有项目”Open和“从版本控制系统中检出项目”Get from Version Control
![](res/pycharm-welcome.png)
如果选择了“Create New Project”来创建新项目就会打一个创建项目的向导页。下图所示是PyCharm专业版创建新项目的向导页可以看出专业版支持的项目类型非常的多而社区版只能创建纯Python项目Pure Python没有这一系列的选项。
![](res/pycharm-project-wizard.png)
接下来我们要为项目创建专属的虚拟环境每个Python项目最好都在自己专属的虚拟环境中运行因为每个项目对Python解释器和三方库的需求并不相同虚拟环境对不同的项目进行了隔离。在上图所示的界面在我们可以选择新建虚拟环境New environment using Virtualenv这里的“Virtualenv”是PyCharm默认选择的创建虚拟环境的工具我们就保留这个默认的选项就可以了。
项目创建完成后就可以开始新建各种文件来书写Python代码了如下图所示。左侧是项目浏览器可以看到刚才创建的项目文件夹以及虚拟环境文件夹。我们可以在项目上点击鼠标右键选择“New”在选择“Python File”来创建Python代码文件下图中我们创建了两个Python文件分别是`poker_game.py`和`salary_system.py`。当然如果愿意也可以使用复制粘贴的方式把其他地方的Python代码文件复制到项目文件夹下。
![](res/pycharm-workspace.png)
在工作窗口点击鼠标右键可以在上下文菜单中找到“Run”选项例如要运行`salary_system.py`文件右键菜单会显示“Run 'salary_system'”选项点击这个选项我们就可以运行Python代码啦运行结果在屏幕下方的窗口可以看到如下图所示。
![](res/pycharm-run-result.png)
### 常用操作和快捷键
PyCharm为写Python代码提供了自动补全和高亮语法功能这也是PyCharm作为集成开发环境IDE的基本功能。PyCharm的“File”菜单有一个“Settings”菜单项macOS上是在“PyCharm”菜单的“Preferences…”菜单项这个菜单项会打开设置窗口可以在此处对PyCharm进行设置如下图所示。
![](/Users/Hao/Desktop/Python-Core-50-Courses/res/pycharm-settings.png)
PyCharm的菜单项中有一个非常有用的“Code”菜单菜单中提供了自动生成代码、自动补全代码、格式化代码、移动代码等选项这些功能对开发者来说是非常有用的大家可以尝试使用这些菜单项或者记住它们对应的快捷键例如在macOS上格式化代码这个菜单项对应的快捷键是`alt+command+L`。除此之外“Refactor”菜单也非常有用它提供了一些重构代码的选项。所谓重构是在不改变代码执行结果的前提下调整代码的结构这也是资深程序员的一项重要技能。还有一个值得一提的菜单是“VCS”VCS是“Version Control System”版本控制系统的缩写这个菜单提供了对代码版本管理的支持。版本控制的知识会在其他的课程中为大家讲解。
下表列出了一些PyCharm中特别常用的快捷键当然如果愿意也可以通过设置窗口中“Keymap”菜单项自定义快捷键PyCharm本身也针对不同的操作系统和使用习惯对快捷键进行了分组。
| 快捷键 | 作用 |
| --------------------------------------------- | -------------------------------------- |
| `command + j` | 显示可用的代码模板 |
| `command + b` | 查看函数、类、方法的定义 |
| `ctrl + space` | 万能代码提示快捷键,一下不行按两下 |
| `command + alt + l` | 格式化代码 |
| `alt + enter` | 万能代码修复快捷键 |
| `ctrl + /` | 注释/反注释代码 |
| `shift + shift` | 万能搜索快捷键 |
| `command + d` / `command + y` | 复制/删除一行代码 |
| `command + shift + -` / `command + shift + +` | 折叠/展开所有代码 |
| `F2` | 快速定位到错误代码 |
| `command+ alt + F7` | 查看哪些地方用到了指定的函数、类、方法 |
> **说明**Windows系统下如果使用PyCharm的默认设置可以将上面的`command`键换成`ctrl`键即可,唯一的例外是`ctrl + space`那个快捷键因为它跟Windows系统切换输入法的快捷键是冲突的所以在Windows系统下默认没有与之对应的快捷键。

View File

@ -1,6 +1,6 @@
## 知乎问题回答
### Python学习完基础语法知识后如何进一步提高
#### Python学习完基础语法知识后如何进一步提高
如果你已经完成了Python基础语法的学习想要知道接下来如何提高那么你得先问问自己你要用Python来做什么目前学习Python后可能的就业方向包括以下几个领域我把每个领域需要的技术作为了一个简单的关键词摘要。

View File

@ -38,7 +38,7 @@ if __name__ == '__main__':
上面代码的部分运行结果如下图所示。这个结果是因为CPython出于性能优化的考虑把频繁使用的整数对象用一个叫`small_ints`的对象池缓存起来造成的。`small_ints`缓存的整数值被设定为`[-5, 256]`这个区间也就是说如果使用CPython解释器在任何引用这些整数的地方都不需要重新创建`int`对象,而是直接引用缓存池中的对象。如果整数不在该范围内,那么即便两个整数的值相同,它们也是不同的对象。
![](./res/int-is-comparation.png)
![](res/int-is-comparation.png)
当然仅仅如此这个坑就不值一提了,如果你理解了上面的规则,我们就再看看下面的代码。
@ -69,7 +69,7 @@ dis.dis(main)
代码的执行结果如下图所示。可以看出代码第6行和第7行也就是`main`函数中的257是从同一个位置加载的因此是同一个对象而代码第9行的`a`明显是从不同的地方加载的,因此引用的是不同的对象。
![](./res/result-of-dis.png)
![](res/result-of-dis.png)
如果还想对这个问题进行进一步深挖,推荐大家阅读[《Python整数对象实现原理》](https://foofish.net/python_int_implement.html)这篇文章。
@ -127,9 +127,9 @@ for row, name in enumerate(names):
如果对内存的使用不是很理解,可以看看[PythonTutor网站](http://www.pythontutor.com/)上提供的代码可视化执行功能,通过可视化执行,我们可以看到内存是如何分配的,从而避免在使用嵌套列表或者复制对象时可能遇到的坑。
![](./res/python-tutor-visualize.png)
![](res/python-tutor-visualize.png)
![](./res/python-tutor-visualize2.png)
![](res/python-tutor-visualize2.png)
### 坑3 - 访问修饰符的坑