Python

现在已经2019年了,不要在问学Python2还是python3了,问就是Python3,毕竟"Python核心团队计划2020年停止支持Python2",而且很多第三方库已经开始停止对python2的兼容了。

当然,如果是要维护旧代码或者是使用一些古董脚本,还是偶尔需要用到python2的(比如本人偶尔还需要维护几个Django 1.6和Django 1.8的项目代码😂)

Python源码目录结构

CPython其实功能已经很强大,如非需要自定义扩展模块或者学习等原因,并无太多场景需要编译Python源码。

Python-2.5.1源码编译举例

重要的几个python2源码目录(Python3可能会有变化)

Include:包含了Python提供的所有头文件,若用户想自定义扩展模块,就要放到这个目录下

Lib:包含了Python自带的所有标准库

Modules:包含了所有用C语言编写的模块,如:random,cStringIO等,对速度要求非常严格的模块

Parser:包含了Python解释器中的Scanner和Parser部分以及其他工具

Objects:包含了Python所有的内建对象,如:整数、list、dict等

Python:包含了Python解释器中的compiler和执行引擎部分,是Python运行的核心

Python进阶建议

某乎这个问题中的回答Python进阶之路写得很不错,因为作者禁止转载,我就简单概括下核心内容。

Python进阶可分为4个阶段

入门阶段、进阶阶段、细化阶段、悟道阶段

0)第1阶段入门阶段不用书

(个人推荐 A Byte of Python或廖雪峰blog中Python3的部分,大约1个月,不建议学习周期拖太长)

1)进阶阶段:Google高级软件工程师Brett Slatkin的Effective Python:编写高质量Python代码的59个有效方法

(时间紧张的话优先学习这本,个人另外安利一本Python Cookbook)

建议学习时间:1-2个月(看书+代码实践)

2)细化阶段:编写高质量代码:改善Python程序的91个建议

建议学习时间:2-4个月(看书+代码实践)

3)悟道阶段:PSF研究员Luciano Ramalho的流畅的Python

(我的前辈也是全力推荐这本书的,想要在Python开发中深耕的朋友推荐认真学习)

建议学习时间:4个月及以上(看书+代码实践+工程实践)

Django

Django数据模型中 null=True 和 blank=True的区别

null 是针对数据库而言,如果null=True, 表示数据库的该字段可以为空,即在Null字段显示为YES。(即是数据库创建时该字段可不填,用NULL填充)
blank 是针对表单的,如果blank=True,表示前端表单填写该字段的时候可以不填,但是对数据库来说,没有影响(因为数据库是看根据是否是null=True来决定创建数据库记录时该字段可传空白)

利用Django ORM生成数据库表但不使用migrate来管理数据表

python manage.py makemigrations business_gifts    # 这里的business_gifts是app name

当makemigrations之后产生了0001_initial.py 文件,你可以查看下该migrations会对应于什么样子的SQL命令

python manage.py sqlmigrate business_gifts 0001

看到如下内容,这就是存储过程的语句:
BEGIN;

CREATE TABLE `sys_business_gifts` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(50) NULL, `tel` varchar(20) NULL, `industry` smallint NULL, `scene` smallint NULL, `gift_feature` smallint NULL, `budget` smallint NULL, `amount` smallint NULL, `status` smallint NOT NULL, `create_time` datetime NULL, `last_edit_time` datetime NULL, `remarks` longtext NULL);

COMMIT;

然后python manage.py dbshell,进入数据库,执行存储过程。

MySQL在已有的mysql上加字段和外键关联

比如:让sys_business_gifts中的last_edit_user_id列引用auth_user表中的id。

BEGIN;

/* 新增字段 */
ALTER TABLE `sys_business_gifts` ADD COLUMN `last_edit_user_id` integer NULL;

/* 加外键 alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称(列名) */
ALTER TABLE `sys_business_gifts` ADD CONSTRAINT `sys_business__last_edit_user_id_fk` FOREIGN KEY (`last_edit_user_id`) REFERENCES `auth_user` (`id`);

COMMIT;

如果两张表的ENGINE要一致,否则无法创建外键关联。

Django-admin

raw_id_fields属性的作用显示外键的详细信息,如果没有注释掉,支持外键字段搜索。参考这里

Django项目的重构参考

Flask

速成推荐--Flask入门教程

程序分析

cProfile

cProfile用法:
cd ~/pw_python/imooc

# 分析结果在test_thread.out
python -m cProfile -o test_thread.out thread_safe.py   

# 展示分析结果
python -c "import pstats; p=pstats.Stats('test_thread.out'); p.print_stats()"   

# 查看排序后的运行结果
python -c "import pstats; p=pstats.Stats('test_thread.out'); p.sort_stats('time').print_stats()"  

相关分析参数的意义:

ncalls : 函数的被调用次数
tottime :函数总计运行时间,除去函数中调用的函数运行时间
percall :函数运行一次的平均时间,等于tottime/ncalls
cumtime :函数总计运行时间,含调用的函数运行时间
percall :函数运行一次的平均时间,等于cumtime/ncalls
filename:lineno(function) 函数所在的文件名,函数的行号,函数名

ref: 这个例子是python2的,但是基本python3可以参考 python程序之profile分析

pyenv常用命令

0.显示pyenv已安装的python版本

ubuntu@xxx:/data/web/auto_post_event_v2$ pyenv versions
* system (set by /home/ubuntu/.pyenv/version)
  3.6.5
  3.6.5/envs/academic_spider_admin_env   # 这个是指定创建的,不用管
  academic_spider_admin_env    # 这个是指定创建的,不用管

1.创建虚拟环境

ubuntu@xxx:/data/web/auto_post_event_v2$ pyenv virtualenv 3.6.5 auto_post_event_v2
Requirement already satisfied: setuptools in /home/ubuntu/.pyenv/versions/3.6.5/envs/auto_post_event_v2/lib/python3.6/site-packages
Requirement already satisfied: pip in /home/ubuntu/.pyenv/versions/3.6.5/envs/auto_post_event_v2/lib/python3.6/site-packages

ubuntu@xxx:/data/web/auto_post_event_v2$ pyenv versions
* system (set by /home/ubuntu/.pyenv/version)
  3.6.5
  3.6.5/envs/academic_spider_admin_env
  3.6.5/envs/auto_post_event_v2
  academic_spider_admin_env
  auto_post_event_v2

2.激活虚拟环境

ubuntu@xxx:/data/web/auto_post_event_v2$ pyenv activate auto_post_event_v2

pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(auto_post_event_v2) ubuntu@xxx:/data/web/auto_post_event_v2$

Python基础

22.说说python的asyncio

ref: asyncio

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。