Python
现在已经2019年了,不要在问学Python2还是python3了,问就是Python3,毕竟"Python核心团队计划2020年停止支持Python2",而且很多第三方库已经开始停止对python2的兼容了。
当然,如果是要维护旧代码或者是使用一些古董脚本,还是偶尔需要用到python2的(比如本人偶尔还需要维护几个Django 1.6和Django 1.8的项目代码😂)
Python源码目录结构
CPython其实功能已经很强大,如非需要自定义扩展模块或者学习等原因,并无太多场景需要编译Python源码。
重要的几个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
程序分析
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。