[编程开发] 如何系统地自学 Python?

[复制链接]
cruet 发表于 2023-10-4 18:02:37|来自:北京 | 显示全部楼层 |阅读模式
本题已加入圆桌数据分析入门指南,更多数据分析内容,欢迎关注圆桌>>>
零基础情况下,想学一门语言。另 《Python 编程入门经典》这本书怎么样,是否值得看?
全部回复5 显示全部楼层
ghgh456 发表于 2023-10-4 18:02:56|来自:北京 | 显示全部楼层
0709更:
上周旁听了一个大学学长组织的线上Python交流会,里边不乏充斥着各位行业大牛,讲的内容确实精彩,可能对于Python经验5年+的人来说,是受益匪浅,欢迎程度极高,恨不得跳出屏幕来表示赞同,毕竟很多提到的问题,我在工作中也很常见,但是作为资历一般的程序员,有一些理解起来还是有些困难,评论区里同时也还有另外一种声音:
听不懂啊,还可以再细讲一些吗?
刚毕业,刚开始学Python,可以说说入门的吗?
走了走了,零基础满脸懵……
太难了,放弃Python了
我很能理解“另一种声音”,我当初也是自学Python,刚开始的时候,我连循环结构和分支结构都搞不明白谁是谁,去找有经验的人问,结果问了几回人家就烦了,所以,学习这种事,还是得靠自己。
根据我自己的经验来说,想从零开始学Python,以后也确实想找相关的工作,基本是下边这三种方式:

  • 继续上学。报个这方面的专业,学上两三年,老师就在身边,有啥不懂的问题,直接办公室走一趟,毕业的时候去找工作不成大问题;
  • 看书自学。这块可以看看我之前推荐的GitHub【Python百天之路】-骆昊,对细节把握很到位!
  • 在网上找视频课自学。你可以利用碎片时间去学,时间上会更节省,我为了苦学Python大概买了十多门课吧。
读研读博这件事时间成本比较高,我对自己没有完全的自信,所以我思考再三,还是决定踏入社会浪潮了。(但是对于学习能力强,本科也比较优秀的学生,非常建议继续读研读博,未来踏入社会起薪会非常高,我现在身边就有两个博士大神,我只能膜拜了。。。)
进入社会之后,我基本就是买书和看视频自学,这回给你们来个全方位安利:
一、网站推荐

1、Python
Python初学者的法宝,如果你想下载Python,最好还是在这个网址去下,不要想着用一些不明来源的安装包。在这里,你不仅可以下载各种版本的Python源代码和安装程序,更有各种文献资料、Python交流社区,还会告诉你Python的最新行情,不得不感叹,这功能太强大!


Welcome to Python.org2、菜鸟教程
站内的知识点很全面,无论你想学习哪种领域,都可以轻松在这里找到合适的资料。


菜鸟教程 - 学的不仅是技术,更是梦想!3、Codecademy
这个学习网站很大的优势就是在浏览器上直接编写代码,轻松解决了初学者程序环境安装的困扰。


https://www.codecademy.com/4、Coursera
如果你英文比较好,交流没有问题的话,比较推荐这个网站。这是一个课程学习网站,内容涵盖编程各个领域,目前已经和200+所大学合作课程,还可以在线读学士、硕士学位。


https://www.coursera.org/5、CSDN
如果说你的英文是难题,给你推荐CSDN,是国内老牌程序员社区,里边有各领域博文、资料、课程,基本很多专业问题都可以在这里查。


CSDN学院-IT实战派二、书籍推荐

1、《笨办法学Python》
如果是初学Python的话,没有什么编程基础,还是比较适合从这本开始学的。整体是以习题的方式开始引导初学者学习编程。


笨办法学Python2、《Python Cookbook》
这本书既有知识点的详细讲解,又有更多高阶用法的延伸,对于已经有一定基础但是掌握不牢的同学来说,无疑是值得拥有的好书。


Python Cookbook3、《流畅的Python》
这本书对于Python的高级用法探究很深入,涵盖了数据结构、对象、并行与并发、元编程等多个方向。


流畅的Python三、课程推荐

其实,除了学习网站和书籍,我还在网易云课堂、51、慕课、CSDN学院买了不下10套关于Python入门的课,在得到也买了时间管理课。
我自己的话,因为我是想进行系统学习,也想节省一些学习时间,加上我也比较懒,非得有人督促着才能坚持不懈,所以我选了CSDN的Python训练营。
Python工程师-CSDN学院
最近正在学习Python的进阶领域-AI,这回同样参与了一个训练营,深刻感受到监督使人进步!不为别的,也是希望自己以后的工作范围更广,也能跟上时代的脚步。
CSDN也许有人会问:“你干嘛把自己逼得那么紧,安安稳稳的不就很好了吗?”
作为一个人,如果长期处于一个舒适安逸的环境,慢慢就会被这种安逸笼罩,变得懒惰,原本拥有的能力也会逐步减弱,当有一天危险来临,所在的舒适圈被打破,连生存下去都是个难题!
所以,为了好好活下去,要不跳出舒适圈,要不就扩大你的舒适圈。
跳出舒适圈,意味着你要彻底离开现在的区域,也许是换个城市、换个工作、甚至换个行业,让自己重新拥有危机感,让新环境逼着你去成长;扩大舒适圈,就是让自己能生存的舒适范围更大,主动学习、提升你的能力。
我选择的是从零开始全方向提升,因为我想着,既然要痛苦,就直接痛苦这一次。上边就是我学过的系统课,内容很全,不过价格也相对更贵。
如果有的同学目前是打算一步一步慢慢来,或者之前已经有一些基础,只是想突破单个方向,下边这几门课程我也在刚接触Python的时候买来学的,价格更便宜,内容却丝毫不打折扣,是比较值得学习的!

1、基础知识
如果是毫无基础可言,甚至不知道如何下载Python, 比较推荐齐伟老师的《8小时Python零基础轻松入门》或者是董付国的《Python可以这样学》。细节全面,适合小白入门。
8小时Python零基础轻松入门Python可以这样学(第一季:Python内功修炼)2、爬虫
这回是偏基础点的,之前也分享过两门,都可以进行参考。
150讲轻松搞定Python网络爬虫
3、数据分析
我买过两类数据分析课,零基础入门和多方位学习,现在直接发出来,也是为了方便不同需求的同学。
数据挖掘基础:零基础学Python数据分析2020Python全能型数据分析师技能 - 网易云课堂
4、机器学习
说起人工智能讲的好的老师,必说唐宇迪(感觉真的霸榜各个学习平台)。
他是计算机的博士,好像还参与了挺多国家级项目,我听过几次他的课和直播,老师的讲课风格很幽默,经常会举例子,让你更清晰的搞懂知识点,我觉得自己是在学习中享受。
(基础知识配实战,这样学习起来相对也更容易)
10小时玩转机器学习Python机器学习进阶实战视频教学今天先说到这里,下回我会跟大家细说这回学AI心酸与快乐,满心干货!
我的目标是进阿里,祝我幸运进阶!
<hr/>更新:
有很多朋友私信问我Python学习有没有什么好的资料,我给大家找了几门不错的免费课,想学的可以看看。
《Python入门教程》
Python入门教程--Python视频教程-编程语言-CSDN学院《Python初级入门精讲》
Python初级入门精讲--Python视频教程-编程语言-CSDN学院《Python爬虫开发》
Python爬虫开发--Python视频教程-编程语言-CSDN学院《Python实战编程》
Python实战编程--Python视频教程-编程语言-CSDN学院《1小时掌握Python爬虫+高效学习法则》
1小时掌握Python爬虫+高效学习法则--Python视频教程-编程语言-CSDN学院
————————————————————————————————


更新:说明几个事
1.很多小伙伴纠结于这个一百天的时间,我觉得完全没有必要,也违背了我最初放这个大纲上来的初衷,我是觉得这个学习大纲还不错,自学按照这个来也能相对系统的学习知识,而不是零散细碎的知识最后无法整合,每个人的基础以及学习进度都不一样,没有必要纠结于一百天这个时间,甭管你是用三个月还是用一年来学习这些东西,最后学到了不就是收获吗?何必纠结于这一百天,觉得这一百天学习不完我就放弃了呢?(另,项目后面没有更新完,大家可以按照这个框架去学习,没有更新完的大家可以自行找资料。)

2.还有小伙伴说这是广告,那请这位项目创作者看见这条“广告”给我打钱。真的很没劲,这个项目多少人知道,在github上也非常火,火有火的道理,对于一些学习者来说的确很有参考价值。谁打广告不找个几万分的大V,来找我这个小弟弟?
更搞笑的还有说我是成都某机构培训老师?本人坐标北京谢谢,也不是什么老师,只是一名普普通通的程序员。自认为我的水平还担不起什么老师。

下面是原文:
Github上位名叫骆昊 (jackfrued) 的资深程序员,为大家规划了一条从“从新手到大师”的百天之路!我觉得这个模式你可以参考一下。
现在已经有5w+星了!


给初学者的几个建议:

  • Make English as your working language.
  • Practice makes perfect.
  • All experience comes from mistakes.
  • Don't be one of the leeches.
  • Either stand out or kicked out.


先附上github地址:
https://github.com/jackfrued/Python-100-Day
下面是这个一百天计划里面的学习框架,我在这里放上来。
Day01~15 - Python语言基础
Day01 - 初识Python
Python简介 - Python的历史 / Python的优缺点 / Python的应用领域
搭建编程环境 - Windows环境 / Linux环境 / MacOS环境
从终端运行Python程序 - Hello, world / print函数 / 运行程序
使用IDLE - 交互式环境(REPL) / 编写多行代码 / 运行程序 / 退出IDLE
注释 - 注释的作用 / 单行注释 / 多行注释
Day02 - 语言元素
程序和进制 - 指令和程序 / 冯诺依曼机 / 二进制和十进制 / 八进制和十六进制
变量和类型 - 变量的命名 / 变量的使用 / input函数 / 检查变量类型 / 类型转换
数字和字符串 - 整数 / 浮点数 / 复数 / 字符串 / 字符串基本操作 / 字符编码
运算符 - 数学运算符 / 赋值运算符 / 比较运算符 / 逻辑运算符 / 身份运算符 / 运算符的优先级
应用案例 - 华氏温度转换成摄氏温度 / 输入圆的半径计算周长和面积 / 输入年份判断是否是闰年
Day03 - 分支结构
分支结构的应用场景 - 条件 / 缩进 / 代码块 / 流程图
if语句 - 简单的if / if-else结构 / if-elif-else结构 / 嵌套的if
应用案例 - 用户身份验证 / 英制单位与公制单位互换 / 掷骰子决定做什么 / 百分制成绩转等级制 / 分段函数求值 / 输入三条边的长度如果能构成三角形就计算周长和面积
Day04 - 循环结构
循环结构的应用场景 - 条件 / 缩进 / 代码块 / 流程图
while循环 - 基本结构 / break语句 / continue语句
for循环 - 基本结构 / range类型 / 循环中的分支结构 / 嵌套的循环 / 提前结束程序
应用案例 - 1~100求和 / 判断素数 / 猜数字游戏 / 打印九九表 / 打印三角形图案 / 猴子吃桃 / 百钱百鸡
Day05 - 构造程序逻辑
基础练习 - 水仙花数 / 完美数 / 五人分鱼 / Fibonacci数列 / 回文素数
综合练习 - Craps赌博游戏
Day06 - 函数和模块的使用
函数的作用 - 代码的坏味道 / 用函数封装功能模块
定义函数 - def语句 / 函数名 / 参数列表 / return语句 / 调用自定义函数
调用函数 - Python内置函数 / 导入模块和函数
函数的参数 - 默认参数 / 可变参数 / 关键字参数 / 命名关键字参数
函数的返回值 - 没有返回值 / 返回单个值 / 返回多个值
作用域问题 - 局部作用域 / 嵌套作用域 / 全局作用域 / 内置作用域 / 和作用域相关的关键字
用模块管理函数 - 模块的概念 / 用自定义模块管理函数 / 命名冲突的时候会怎样(同一个模块和不同的模块)
Day07 - 字符串和常用数据结构
字符串的使用 - 计算长度 / 下标运算 / 切片 / 常用方法
列表基本用法 - 定义列表 / 用下表访问元素 / 下标越界 / 添加元素 / 删除元素 / 修改元素 / 切片 / 循环遍历
列表常用操作 - 连接 / 复制(复制元素和复制数组) / 长度 / 排序 / 倒转 / 查找
生成列表 - 使用range创建数字列表 / 生成表达式 / 生成器
元组的使用 - 定义元组 / 使用元组中的值 / 修改元组变量 / 元组和列表转换
集合基本用法 - 集合和列表的区别 / 创建集合 / 添加元素 / 删除元素 / 清空
集合常用操作 - 交集 / 并集 / 差集 / 对称差 / 子集 / 超集
字典的基本用法 - 字典的特点 / 创建字典 / 添加元素 / 删除元素 / 取值 / 清空
字典常用操作 - keys()方法 / values()方法 / items()方法 / setdefault()方法
基础练习 - 跑马灯效果 / 列表找最大元素 / 统计考试成绩的平均分 / Fibonacci数列 / 杨辉三角
综合案例 - 双色球选号 / 井字棋
Day08 - 面向对象编程基础
类和对象 - 什么是类 / 什么是对象 / 面向对象其他相关概念
定义类 - 基本结构 / 属性和方法 / 构造器 / 析构器 / __str__方法
使用对象 - 创建对象 / 给对象发消息
面向对象的四大支柱 - 抽象 / 封装 / 继承 / 多态
基础练习 - 定义学生类 / 定义时钟类 / 定义图形类 / 定义汽车类
Day09 - 面向对象进阶
属性 - 类属性 / 实例属性 / 属性访问器 / 属性修改器 / 属性删除器 / 使用__slots__
类中的方法 - 实例方法 / 类方法 / 静态方法
运算符重载 - __add__ / __sub__ / __or__ /__getitem__ / __setitem__ / __len__ / __repr__ / __gt__ / __lt__ / __le__ / __ge__ / __eq__ / __ne__ / __contains__
类(的对象)之间的关系 - 关联 / 继承 / 依赖
继承和多态 - 什么是继承 / 继承的语法 / 调用父类方法 / 方法重写 / 类型判定 / 多重继承 / 菱形继承(钻石继承)和C3算法
综合案例 - 工资结算系统 / 图书自动折扣系统 / 自定义分数类
Day10 - 图形用户界面和游戏开发
使用tkinter开发GUI
使用pygame三方库开发游戏应用
“大球吃小球”游戏
Day11 - 文件和异常

  • 读文件 - 读取整个文件 / 逐行读取 / 文件路径
  • 写文件 - 覆盖写入 / 追加写入 / 文本文件 / 二进制文件
  • 异常处理 - 异常机制的重要性 / try-except代码块 / else代码块 / finally代码块 / 内置异常类型 / 异常栈 / raise语句
  • 数据持久化 - CSV文件概述 / csv模块的应用 / JSON数据格式 / json模块的应用
Day12 - 字符串和正则表达式

  • 字符串高级操作 - 转义字符 / 原始字符串 / 多行字符串 / in和 not in运算符 / is开头的方法 / join和split方法 / strip相关方法 / pyperclip模块 / 不变字符串和可变字符串 / StringIO的使用
  • 正则表达式入门 - 正则表达式的作用 / 元字符 / 转义 / 量词 / 分组 / 零宽断言 /贪婪匹配与惰性匹配懒惰 / 使用re模块实现正则表达式操作(匹配、搜索、替换、捕获)
  • 使用正则表达式 - re模块 / compile函数 / group和groups方法 / match方法 / search方法 / findall和finditer方法 / sub和subn方法 / split方法
  • 应用案例 - 使用正则表达式验证输入的字符串
Day13 - 进程和线程

  • 进程和线程的概念 - 什么是进程 / 什么是线程 / 多线程的应用场景
  • 使用进程 - fork函数 / multiprocessing模块 / 进程池 / 进程间通信
  • 使用线程 - thread模块 / threading模块 / Thread类 / Lock类 / Condition类 / 线程池
Day14 - 网络编程入门和网络应用开发

  • 计算机网络基础 - 计算机网络发展史 / “TCP-IP”模型 / IP地址 / 端口 / 协议 / 其他相关概念
  • 网络应用模式 - “客户端-服务器”模式 / “浏览器-服务器”模式
  • 基于HTTP协议访问网络资源 - 网络API概述 / 访问URL / requests模块 / 解析JSON格式数据
  • Python网络编程 - 套接字的概念 / socket模块 / socket函数 / 创建TCP服务器 / 创建TCP客户端 / 创建UDP服务器 / 创建UDP客户端 / SocketServer模块
  • 电子邮件 - SMTP协议 / POP3协议 / IMAP协议 / smtplib模块 / poplib模块 / imaplib模块
  • 短信服务 - 调用短信服务网关
Day15 - 图像和文档处理

  • 用Pillow处理图片 - 图片读写 / 图片合成 / 几何变换 / 色彩转换 / 滤镜效果
  • 读写Word文档 - 文本内容的处理 / 段落 / 页眉和页脚 / 样式的处理
  • 读写Excel文件 - xlrd模块 / xlwt模块
  • 生成PDF文件 - pypdf2模块 / reportlab模块
Day16~Day20 - Python语言进阶


  • 常用数据结构
  • 函数的高级用法 - “一等公民” / 高阶函数 / Lambda函数 / 作用域和闭包 / 装饰器
  • 面向对象高级知识 - “三大支柱” / 类与类之间的关系 / 垃圾回收 / 魔术属性和方法 / 混入 / 元类 / 面向对象设计原则 / GoF设计模式
  • 迭代器和生成器 - 相关魔术方法 / 创建生成器的两种方式 /
  • 并发和异步编程 - 多线程 / 多进程 / 异步IO / async和await
Day21~30 - Web前端入门


  • 用HTML标签承载页面内容
  • 用CSS渲染页面
  • 用JavaScript处理交互式行为
  • jQuery入门和提高
  • Vue.js入门
  • Element的使用
  • Bootstrap的使用
Day31~35 - 玩转Linux操作系统


  • 操作系统发展史和Linux概述
  • Linux基础命令
  • Linux中的实用程序
  • Linux的文件系统
  • Vim编辑器的应用
  • 环境变量和Shell编程
  • 软件的安装和服务的配置
  • 网络访问和管理
  • 其他相关内容
Day36~40 - 数据库基础和进阶


  • 关系型数据库MySQL

    • 关系型数据库概述
    • MySQL的安装和使用
    • SQL的使用

      • DDL - 数据定义语言 - create / drop / alter
      • DML - 数据操作语言 - insert / delete / update / select
      • DCL - 数据控制语言 - grant / revoke





    • 相关知识

      • 范式理论 - 设计二维表的指导思想
      • 数据完整性
      • 数据一致性





    • 在Python中操作MySQL



  • NoSQL入门

    • NoSQL概述
    • Redis概述
    • Mongo概述


Day41~55 - 实战Django
Day41 - 快速上手

  • Web应用工作原理和HTTP协议
  • Django框架概述
  • 5分钟快速上手
  • 使用视图模板
Day42 - 深入模型

  • 关系型数据库配置
  • 管理后台的使用
  • 使用ORM完成对模型的CRUD操作
  • Django模型最佳实践
  • 模型定义参考
Day43 - 静态资源和Ajax请求

  • 加载静态资源
  • 用Ajax请求获取数据
Day44 - 表单的应用

  • 表单和表单控件
  • 跨站请求伪造和CSRF令牌
  • Form和ModelForm
  • 表单验证
Day45 - Cookie和Session

  • 实现用户跟踪
  • cookie和session的关系
  • Django框架对session的支持
  • 视图函数中的cookie读写操作
Day46 - 报表和日志

  • 通过HttpResponse修改响应头
  • 使用StreamingHttpResponse处理大文件
  • 使用xlwt生成Excel报表
  • 使用reportlab生成PDF报表
  • 使用ECharts生成前端图表
  • 配置日志和Django-Debug-Toolbar
Day47 - 中间件的应用

  • 什么是中间件
  • Django框架内置的中间件
  • 自定义中间件及其应用场景
Day48 - 前后端分离开发入门

  • 返回JSON格式的数据
  • 用Vue.js渲染页面
Day49 - RESTful架构和DRF入门
Day50 - RESTful架构和DRF进阶
Day51 - 使用缓存

  • 网站优化第一定律
  • 在Django项目中使用Redis提供缓存服务
  • 在视图函数中读写缓存
  • 使用装饰器实现页面缓存
  • 为数据接口提供缓存服务
Day52 - 文件上传和富文本编辑

  • 文件上传表单控件和图片文件预览
  • 服务器端如何处理上传的文件
  • 富文本编辑器概述
  • wangEditor的使用
Day53 - 短信和邮件

  • 常用短信网关平台介绍
  • 使用螺丝帽发送短信
  • Django框架对邮件服务的支持
Day54 - 异步任务和定时任务

  • 网站优化第二定律
  • 配置消息队列服务
  • 在项目中使用celery实现任务异步化
  • 在项目中使用celery实现定时任务
Day55 - 单元测试和项目上线

  • Python中的单元测试
  • Django框架对单元测试的支持
  • 使用版本控制系统
  • 配置和使用uWSGI
  • 动静分离和Nginx配置
  • 配置HTTPS
Day56~60 - 实战Flask
Day56 - Flask入门
Day57 - 模板的使用
Day58 - 表单的处理
Day59 - 数据库操作
Day60 - 项目实战
Day61~65 - 实战Tornado
Day61 - 预备知识

  • 并发编程
  • I/O模式和事件驱动
Day62 - Tornado入门

  • Tornado概述
  • 5分钟上手Tornado
  • 路由解析
  • 请求处理器
Day63 - 异步化

  • aiomysql和aioredis的使用
Day64 - WebSocket的应用

  • WebSocket简介
  • WebSocket服务器端编程
  • WebSocket客户端编程
  • 项目:Web聊天室
Day65 - 项目实战

  • 前后端分离开发和接口文档的撰写
  • 使用Vue.js实现前端渲染
  • 使用ECharts实现报表功能
  • 使用WebSocket实现推送服务
Day66~75 - 爬虫开发
Day66 - 网络爬虫和相关工具

  • 网络爬虫的概念及其应用领域
  • 网络爬虫的合法性探讨
  • 开发网络爬虫的相关工具
  • 一个爬虫程序的构成
Day67 - 数据采集和解析

  • 数据采集的标准和三方库
  • 页面解析的三种方式:正则表达式解析 / XPath解析 / CSS选择器解析
Day68 - 存储数据

  • 如何存储海量数据
  • 实现数据的缓存
Day69 - 并发下载

  • 多线程和多进程
  • 异步I/O和协程
  • async和await关键字的使用
  • 三方库aiohttp的应用
Day70 - 解析动态内容

  • JavaScript逆向工程
  • 使用Selenium获取动态内容
Day71 - 表单交互和验证码处理

  • 自动提交表单
  • Cookie池的应用
  • 验证码处理
Day72 - Scrapy入门

  • Scrapy爬虫框架概述
  • 安装和使用Scrapy
Day73 - Scrapy高级应用

  • Spider的用法
  • 中间件的应用:下载中间件 / 蜘蛛中间件
  • Scrapy对接Selenium抓取动态内容
  • Scrapy部署到Docker
Day74 - Scrapy分布式实现

  • 分布式爬虫的原理
  • Scrapy分布式实现
  • 使用Scrapyd实现分布式部署
Day75 - 爬虫项目实战

  • 爬取招聘网站数据
  • 爬取房地产行业数据
  • 爬取二手车交易平台数据
Day76~90 - 数据处理和机器学习
Day76 - 机器学习基础
Day77 - Pandas的应用
Day78 - NumPy和SciPy的应用
Day79 - Matplotlib和数据可视化
Day80 - k最近邻(KNN)分类
Day81 - 决策树
Day82 - 贝叶斯分类
Day83 - 支持向量机(SVM)
Day84 - K-均值聚类
Day85 - 回归分析
Day86 - 大数据分析入门
Day87 - 大数据分析进阶
Day88 - Tensorflow入门
Day89 - Tensorflow实战
Day90 - 推荐系统
Day91~100 - 团队项目开发
第91天:团队项目开发准备

  • 软件过程模型


  • 经典过程模型(瀑布模型)

    • 可行性分析(研究做还是不做),输出《可行性分析报告》。
    • 需求分析(研究做什么),输出《需求规格说明书》和产品界面原型图。
    • 概要设计和详细设计,输出概念模型图、物理模型图、类图、时序图等。
    • 编码 / 测试。
    • 上线 / 维护。




    • 敏捷开发(Scrum)- 产品所有者、Scrum Master、研发人员 - Sprint

      • 产品的Backlog(用户故事、产品原型)。
      • 计划会议(评估和预算)。
      • 日常开发(站立会议、番茄工作法、结对编程、测试先行、代码重构……)。
      • 修复bug(问题描述、重现步骤、测试人员、被指派人)。
      • 评审会议(Showcase)。
      • 回顾会议(当前周期做得好和不好的地方)。


补充:敏捷软件开发宣言




      • 个体和互动 高于 流程和工具
      • 工作的软件 高于 详尽的文档
      • 客户合作 高于 合同谈判
      • 响应变化 高于 遵循计划






角色:产品所有者(决定做什么,能对需求拍板的人)、团队负责人(解决各种问题,专注如何更好的工作,屏蔽外部对开发团队的影响)、开发团队(项目执行人员,具体指开发人员和测试人员)。
准备工作:商业案例和资金、合同、憧憬、初始产品需求、初始发布计划、入股、组建团队。
敏捷团队通常人数为8-10人。
工作量估算:将开发任务量化,包括原型、Logo设计、UI设计、前端开发等,尽量把每个工作分解到最小任务量,最小任务量标准为工作时间不能超过两天,然后估算总体项目时间。把每个任务都贴在白板上面,白板上分三部分:to do(待完成)、in progress(进行中)和done(已完成)。


  • 项目团队组建


  • 团队的构成和角色
    说明:谢谢付祥英女士绘制了下面这张精美的公司组织架构图。





    • 编程规范和代码审查(flake8、pylint)






    • Python中的一些“惯例”(请参考《Python惯例-如何编写Pythonic的代码》)
    • 影响代码可读性的原因:

      • 代码注释太少或者没有注释
      • 代码破坏了语言的最佳实践
      • 反模式编程(意大利面代码、复制-黏贴编程、自负编程、……)





  • 团队开发工具介绍


  • 版本控制:Git、Mercury
  • 缺陷管理:Gitlab、Redmine
  • 敏捷闭环工具:禅道、JIRA
  • 持续集成:Jenkins、Travis-CI
请参考《团队项目开发》。
项目选题和理解业务


  • 选题范围设定


  • CMS(用户端):新闻聚合网站、问答/分享社区、影评/书评网站等。
  • MIS(用户端+管理端):KMS、KPI考核系统、HRS、CRM系统、供应链系统、仓储管理系统等。
  • App后台(管理端+数据接口):二手交易类、报刊杂志类、小众电商类、新闻资讯类、旅游类、社交类、阅读类等。
  • 其他类型:自身行业背景和工作经验、业务容易理解和把控。


  • 需求理解、模块划分和任务分配


  • 需求理解:头脑风暴和竞品分析。
  • 模块划分:画思维导图(XMind),每个模块是一个枝节点,每个具体的功能是一个叶节点(用动词表述),需要确保每个叶节点无法再生出新节点,确定每个叶子节点的重要性、优先级和工作量。
  • 任务分配:由项目负责人根据上面的指标为每个团队成员分配任务。




  • 制定项目进度表(每日更新)
第92天:Docker的使用

第93天:数据库设计和OOAD

概念模型和正向工程


  • UML(统一建模语言)的类图




  • 通过模型创建表(正向工程)
    python manage.py makemigrations app python manage.py migrate
物理模型和反向工程


  • PowerDesigner


2.通过数据表创建模型(反向工程)
python manage.py inspectdb > app/models.py
第94天:网络API接口设计
第95天:使用Django开发项目
项目开发中的公共问题


  • 数据库的配置(多数据库、主从复制、数据库路由)
  • 缓存的配置(分区缓存、键设置、超时设置、主从复制、故障恢复(哨兵))
  • 日志的配置
  • 分析和调试(Django-Debug-ToolBar)
  • 好用的Python模块(日期计算、图像处理、数据加密、三方API)
REST API设计


  • RESTful架构


  • 理解RESTful架构
  • RESTful API设计指南
  • RESTful API最佳实践


  • API接口文档的撰写


  • RAP2
  • YAPI


  • django-REST-framework的应用
项目中的重点难点剖析


  • 使用缓存缓解数据库压力 - Redis
  • 使用消息队列做解耦合和削峰 - Celery + RabbitMQ
第96天:软件测试和自动化测试

单元测试


  • 测试的种类
  • 编写单元测试(unittest、pytest、nose2、tox、ddt、……)
  • 测试覆盖率(coverage)
项目部署


  • 部署前的准备工作


  • 关键设置(SECRET_KEY / DEBUG / ALLOWED_HOSTS / 缓存 / 数据库)
  • HTTPS / CSRF_COOKIE_SECUR / SESSION_COOKIE_SECURE
  • 日志相关配置


  • Linux常用命令回顾
  • Linux常用服务的安装和配置
  • uWSGI/Gunicorn和Nginx的使用


  • Gunicorn和uWSGI的比较

    • 对于不需要大量定制化的简单应用程序,Gunicorn是一个不错的选择,uWSGI的学习曲线比Gunicorn要陡峭得多,Gunicorn的默认参数就已经能够适应大多数应用程序。
    • uWSGI支持异构部署。
    • 由于Nginx本身支持uWSGI,在线上一般都将Nginx和uWSGI捆绑在一起部署,而且uWSGI属于功能齐全且高度定制的WSGI中间件。
    • 在性能上,Gunicorn和uWSGI其实表现相当。




  • 虚拟化技术(Docker)
性能测试


  • AB的使用
  • SQLslap的使用
  • sysbench的使用
自动化测试


  • 使用Shell和Python进行自动化测试
  • 使用Selenium实现自动化测试


  • Selenium IDE
  • Selenium WebDriver
  • Selenium Remote Control


  • 测试工具Robot Framework介绍
第97天:电商网站技术要点剖析
第98天:项目部署上线和性能调优

  • MySQL数据库调优
  • Web服务器性能优化
3.代码性能调优

  • 多线程
  • 异步化
4.静态资源访问优化


    • 云存储
    • CDN

第99天:面试中的公共问题
第100天:英语面试
作者:骆昊 (jackfrued)
来源:github
github地址:https://github.com/jackfrued/Python-100-Days
<hr/>公号:聊聊Python,感兴趣的可以来找我玩,一起来聊聊Python这点事~

希望能帮到你
无与伦比 发表于 2023-10-4 18:03:40|来自:北京 | 显示全部楼层
最近,GitHub上一个关于Python的工程完工了。
一个名为“暮晨”的贡献者,把一个非常有趣的Python项目,翻译成了中文版。
这个项目是《What the f*ck Python!》,专门介绍 Python 里面那些奇奇怪怪的语言坑。


关于项目

项目的主体构成部分就是示例,一共分为5个部分,分别是:
Strain your brain!/大脑运动!


Appearances are deceptive!/外表是靠不住的!


Watch out for the landmines!/小心地雷!


The Hidden treasures!/隐藏的宝藏!


Miscellaneous/杂项


以上,总计51个示例。
每一个示例的结构都是一样的,以“Mutating the immutable!/强人所难”为例:
首先,会给出代码:
  1. some_tuple = ("A", "tuple", "with", "values")
  2. another_tuple = ([1, 2], [3, 4], [5, 6])
复制代码
然后,给出Output( Python version):
  1. >>> some_tuple[2] = "change this"
  2. TypeError: 'tuple' object does not support item assignment
  3. >>> another_tuple[2].append(1000) # 这里不出现错误
  4. >>> another_tuple
  5. ([1, 2], [3, 4], [5, 6, 1000])
  6. >>> another_tuple[2] += [99, 999]
  7. TypeError: 'tuple' object does not support item assignment
  8. >>> another_tuple
  9. ([1, 2], [3, 4], [5, 6, 1000, 99, 999])
复制代码
然后,对意外输出的结果进行简短的描述,在这个示例中,就是:
我还以为元组是不可变的呢…
接下来,就会对示例进行说明,简要叙述发生了什么以及为什么会发生。如有必要, 也会举例说明。
在这个示例中是这样的:

  • 引用
    https://docs.python.org/2/reference/datamodel.html
不可变序列 不可变序列的对象一旦创建就不能再改变。(如果对象包含对其他对象的引用,则这些其他对象可能是可变的并且可能会被修改; 但是,由不可变对象直接引用的对象集合不能更改。)

  • += 操作符在原地修改了列表. 元素赋值操作并不工作, 但是当异常抛出时, 元素已经在原地被修改了。
有些地方,贡献者还会给出译注,比如整个示例中就是:
对于不可变对象, 这里指tuple, +=并不是原子操作, 而是extend和=两个动作, 这里=操作虽然会抛出异常, 但 extend 操作已经修改成功了。
其他还有50个示例,等你来看~
怎么使用?

当然,要学习一下怎么使用这个资源。项目贡献者在用法部分表示,最好依次阅读下面的示例。
然后,在阅读每一个示例的时候,这样做:
仔细阅读设置例子最开始的代码。
阅读输出结果。
确认结果是否如你所料。
确认你是否知道这背后的原理。
如果不知道, 深呼吸然后阅读说明 (如果你还是看不明白, 别沉默!可以提问题)。
如果知道, 给自己点奖励, 然后去看下一个示例。
此外,还可以在命令行阅读 WTFpython,有 pypi 包 和 npm 包(支持代码高亮),不过都是英文版的。
关于作者

这个项目的原作者,是一个名为Satwik Kansal的印度小哥。


GitHub上的介绍称,在深度学习和去中心化应用方面是一个“老司机”。
目前,英文版资源,标星已经8.3k了。


传送门

中文版:
https://github.com/leisurelicht/wtfpython-cn
英文原版:
https://github.com/satwikkansal/wtfpython

- 完 -
最后,了解更多前沿科技,请关注我们的知乎号:
量子位
czf002 发表于 2023-10-4 18:04:00|来自:北京 | 显示全部楼层
如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是为你写的。




疑问


随着数据科学概念的普及,Python这门并不算新的语言火得一塌糊涂。
因为写了几篇用Python做数据分析的文章,经常有读者和学生在留言区问我,想学习Python,该如何入手?
我经常需要根据他们的不同情况,提出对应的建议。这样针对性虽强,但效率不高。这个问题,我还是写出来,让更多的人一同看到吧。
有几位出版社的编辑,给我发私信,鼓励我赶紧写一本Python教材出来。
我暂时还没有写Python基础教程的计划。因为在我看来,现有的学习资源已经足够好了。
有现成的资源和路径,为什么许多人依然在为学Python犯愁呢?
因为学习有个效率问题。
Python语法清晰明快,简单易学。这是Python如此普及的重要原因。但是,选择合适的Python学习方式,需要跟你自身的特性相结合。
人群划分的标准是什么?不是你是否计算机相关专业,也不是你是否已经工作,而是一个重要的指标——你的自律能力。
你可能觉得我说的话没有信息含量。自律能力强,学得更好,地球人谁不知道?
可是,自律不够强的人,难道就注定什么也不能学了?
当然不是。
每个人的性格都有不同的特点,没有绝对的高下之分。不信你听听刘宝瑞先生的相声《日遭三险》,就明白了。




自律能力也是这样。只要你能清楚认识自己,就能以更高效的方法来学习新知识和技能。
下面我们分类探讨一下,不同自律能力的人,该如何学Python,才能更高效。

路径I


咱们先从自律能力最差的人说起。
这样的同学,往往是三分钟热度。偶然受到了刺激,发奋要学习Python,以便投入数据科学的事业中。
他会立即跑到图书馆或者书店抱回来一本《X天从入门到精通Python》的书开始啃。结果X天还没到,就顺利跑完了从入门到放弃的全过程。
你没能坚持下来,自己肯定是有责任的。但是最大的问题,在于过度高估自己的自律能力。
这样的同学,我推荐你到Coursera平台上,按部就班学习一门非常好的MOOC——“Programming for Everybody”。




推荐这门课,是因为课程质量真是太好了。
首先是教材好。这本教材的来源是有故事的。
先是 Allen B. Downey 写了一本开放书籍 “Think Python: How to Think like a Computer Scientist”。




这本书在Amazon上的评价是这样的:




Charles Severance觉得这本书写得太好了,想把它作为教材。于是征得作者同意,大篇幅借鉴了这本书的内容架构,编写了一本 “Python for Informatics”。




Charles写作这本书的时候,同时开放推出了iBook格式。里面就包含了自己的授课视频,供学生直接观看学习。




后来,Charles用这本书扩展,做成了一门MOOC。2015年上线不久,硅谷资深工程师就都争相学习。
Charles深谙课程迭代的技艺。他不断添加内容,完善课程体系,将一门课发展成一个专项课程(Signature Track),并且将教材升级为 “Python for Everybody: Exploring Data In Python 3”




在目前全球MOOC口碑榜上,Charles的这门课一直名列前茅。




这个专项课程深入浅出讲解Python本来就很简单的语法,而且还用数据科学的一些基础工作任务,带动你去使用Python语言写简单项目。这种扎实的训练过程可以增强你的信心,激发兴趣。
对于自律程度低的同学来说,下面这个特性更重要——一切工作都有时限。
Coursera上的课程,每周的任务很明确。练习题正确率如果不能达到80%,就不能过关。到了截止日期,如果你不能完成全部练习和课程项目,就拿不到证书。




老师在前面引领你,助教在旁边督促你,平台用时间表提醒你,论坛上的同学们在用同侪压力推挤你……
想偷懒?想三天打鱼两天晒网?很难。

路径II


如果你的自律能力中等偏上,那么你可以选择的面就宽了。
这里我给你推荐另一个MOOC平台,叫做Datacamp。




我第一次接触Datacamp,是在2015年初。那时我在Coursera上选修杜克大学的统计学课程 “Statistical Inference”,配套的练习就在Datacamp上。
当时这个平台就给我留下了非常深刻的印象,因为代码的运行都采用了云环境。学习者不需要在本机安装任何环境,一个支持HTML5标准的浏览器就能带给你完整的学习体验。
对初学者来说,这种入门方式太好了。要知道,许多人的学习热情,就是被环境配置和依赖软件包安装的坑埋掉的。
两年之后,Datacamp已经迭代得更为强大。你可以打开首页的Data Scientist with Python这个学习路径,查看其中已经提供的20门课程。




这些课程涵盖了从Python基础,到数据处理,直至人工智能和深度神经网络的方方面面。




所有的课程设计,都是短小精悍的。一般不超过4个小时,就可以完成某一主题的学习。这样你学起来毫不费力,可以在相当短的时间内获得反馈(练习题自动评分)和成就感(证书)。
这个平台的课程,进度完全由学习者自己掌控。所以我把它归纳为适合有一定自律能力的学习者。
它既可以给你即时的回馈,让你时刻了解自己所处的位置进度,不会迷失方向,又能充分体验自主学习的乐趣。
Datacamp的课程,一般都是第一部分免费开放。后面部分购买后才能解锁学习。如果你对自己的学习能力和毅力有信心,可以购买一个完整时间段(例如一年)的课程。在此期间,所有平台上的课程,你都可以学习,并且可以在通过后获取证书。这样的购买方案本身已经有优惠,而且每年都会有特定时段的大幅打折促销,非常划算。建议放到购物车里面多关注。




这是我在Datacamp拿到的深度学习框架Keras课程证书。确实只需要几个小时的时间就能学完。成就感还是蛮强的。

路径III


前面提到的课程费用不菲。Coursera上每门课平均价格在49美元左右。对来自发展中国家的学生群体,Coursera可以提供助学金。你可以根据自己的需求如实填写申请表,来获得资助。
对于自律能力强的同学来说,你的选择可以变得非常简单直接——可以用最受推崇的教材,自己看书学习。
最受推崇的教材,其实是没有的。正如西谚有云:
One man’s meat, is another man’s poison.
这个世界上,就没有哪件东西大家都说好。但口碑非常好的教材是存在的,例如这本起了个怪名字的《笨办法学Python》(Learn Python the Hard Way)。




千万不要被名称迷惑,望文生义觉得这是一本糟糕的Python入门教程。
恰恰相反,这本书的设计,非常适合人们的认知规律。
我们学东西,由浅入深,由易到难,逐步递进。如果一味追求新知,那么之前学的东西会很快遗忘。如果总是原地打转,会带来枯燥和无聊的感觉。还记得高三做的那一年卷子吧?
好的教科书,应该在每一个章节给学习者提供新的知识和内容,提出足够的挑战。但是挑战性不能高到让学习者产生挫败感而放弃。同时也不能忽视在后续内容中把前面所学知识改换面目不断螺旋上升式重复出现。只有这样才能巩固所学,让学习者感受到基础知识的作用,增强学习的愉悦感。
这么说有些抽象,实际上有一本英语教材非常符合上述认知规律。就是我在课堂上和文章里反复推荐过的这一套教材:




《笨办法学Python》也是一本这样的书。你需要做的就是把书打开,同时打开一个好用的代码编辑器,开始按书中要求敲代码、运行代码、改代码……
下图是我当初学习时,照着这本书敲的代码。




书中对Python基础内容训练的完备性,至今无出其右者。
顺便说一句,这本书有中文版哦。所以如果你英语不好,完全不用担心。
嘱咐一句,英语真该好好学。拓宽的不仅是你的眼界,也增加了你可能获得的机会。考虑到仔细阅读这部分的读者都是自律性很强的人,我就不用多说了。

挑战


三条基本的Python入门路径讲完了。通过对自己自律能力的清晰理解,相信你可以找到一种适合自己逐渐学习和掌握Python的方式。
但是完成了读书和听课,是不是就完事大吉了?
当然不是。
许多人在这里犯了错误。他们以为拿到了证书,或学完了教材,就算是真正掌握了Python。然后把这门语言丢弃在一旁,去刷美剧和小说了。
相信我,你会遗忘的。
如果你对于长期不接触的东西从不遗忘……去医院检查一下吧。
大部分人的记忆模式,都是这个样子的:




若不加以干涉,不出一个星期,你就能把学到的新知识几乎忘光。
如果你不希望自己辛苦学来的Python知识被如此轻易浪费掉,怎么办?

实践


你应该实践。
实践Python技能,未必一定要找个世界500强企业的核心技术部门,“996”工作N年才能完成。
你可以从生活中寻找各种有趣的问题,然后思考能否用Python编程来解决它。
我真正觉得自己初步掌握了Python,就是在完成了我的第一个github项目之后。
项目非常简单,就是用Python作为胶水语言,把一系列工具连接在一起。可以把Markdown撰写的内容随心所欲一键变化成各种格式。
格式包括而不限于:



  • PDF/LaTeX;


  • Word;


  • Bitcron文稿;


  • MarkEditor文稿;


  • MWeb文稿;


  • Bear文稿;


  • TextBundle(可以导入MindNode, Ulysses等);


  • Reveal.js幻灯;


  • 发布版本Markdown(图片一键至七牛图床);


  • 本地版本Markdown(简书等远程Markdown同步图片至本地);


  • Day One日记。


其中部分功能我正陆续发布在github公开项目中,地址在这里。相应地,我也撰文做了介绍。




这个小项目,我从2014年开始做。实话实说,现在回头看当时的代码,简直惨不忍睹。但是如果你逐渐对自己的代码有了这种感觉,证明你在进步。
不要指望自己一出手就能写出完美的代码,要把“迭代”两个字时刻装在心里。这样你才能容忍自己的笨拙,不断提高。正如古人说的那句:
勤学似春起之苗,不见其增,而日有所长。
我在做这个项目的过程中,曾经遇到了中文编码、隐私信息存储、文件名空格处理、绝对与相对路径、发布流程划分、功能解耦合、Web图片地址附带参数……等等一系列的问题。




通过回顾用git版本控制工具记载下来的日志,以及版本对比功能,你可以清楚看到自己是在何时利用什么方法解决了这些问题。然后别忘了,给自己工具箱里的新增小技能打个勾。
一个个小问题逐渐被你攻克的时候,你才能真正感受到所学技能的价值,并且点滴积累自信。
讨论


你学会Python了吗?你是用什么方法学会的?可否把你的学习心得体会分享给大家?对本文推荐的资源和路径,你有什么不同的意见,或者更好的建议?欢迎留言,记录下你的思考,我们一起交流讨论。
喜欢请点赞。还可以微信关注和置顶我的公众号<a href="http://link.zhihu.com/?target=http%3A//oejqwrqkh.bkt.clouddn.com/2016-10-11-22-26-16.jpg" class=" wrap external" target="_blank" rel="nofollow noreferrer">“玉树芝兰”(nkwangshuyi)。
如果你对数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。
fkbill 发表于 2023-10-4 18:04:26|来自:北京 | 显示全部楼层
我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架)。相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点。我把我的学习过程写在下面,并附上在每个阶段的学习资料,希望对零基础的Python学习者有所帮助。
注:本文只做经历分享,不是技术探讨。
---
在知乎上常常看到想要转行IT,或者是想学习编程但不知如何开始的朋友。回答这类问题的人往往只是列出书单资源然后给出一个大致的方向。有些朋友一开始就扎入了理论学习的汪洋大海,从苦读类似《算法导论》开始,能够坚持读下来的寥寥无几,学习的积极性也被不断的挫败感消磨的所剩无几。
一直以来,编程对我而言是一种「黑魔法」般的存在。今年阿里月饼门,当很多人都参与到是非之争的时候,我更加着迷于程序员区区几行代码的脚本所展现出的威力,对于外行而言,这是超乎他们想象之外的某种能力——为什么我守在电脑面前盯着秒针然后拼命点击鼠标都不一定能抢到的礼物,程序员只需要提前花5分钟写3行代码就轻松搞定?
所以,我的心底深处一直都想变成这样的一位魔法师。今年的8月,刚好工作上想要开发一个基于微信的英语学习网站,借此机会,我决定好好学习一下编程。在此之前,我所有关于程序的知识仅仅来源于两部分,一是本科时期的C语言必修课,现在已经忘的一干二净,不过好歹我从中明白编程是怎么回事;第二部分是大概两年前由于工作关系学的一些Python,不过只是皮毛,现在忘的七七八八。
简单说,我的目标是建立一个网站,不过这个网站是动态的,也就是说它能识别谁登陆,然后对不同的人显示不同的内容。而当时的现实是,我完全不明白网页是如何显示出来的?譬如每个人登陆知乎的时候看到的是定制化的页面,后台是如何基于每个ID来组织出不同的页面的?所有我们看到的问题,回答,参与的评论在背后的服务器上是以一种什么样的形式存在的?又比如为什么有些页面只能在微信端打开,在电脑上就会出错?(不知道你有没有发现这一点)
当时我的心中充满了无数个类似的问号?当然如果你也是小白,一定有着同样的疑问。
好处是一开始就明确了学习的目的:Web建站。所以我的学习方案基本就是通过做项目学习,哪里不懂就解决哪里,边做边学习,不断推进。另外,由于知道很多成功的网站在用Python做服务器开发,比如知乎,所以我就自然选择了Python。

于是我就开始了我充满着挫败感和成就感的编程之路……
从8月到12月的四个月里,除去本来的工作,为了学习质量,我会保证平均每天4个小时的学习时间,周末也不例外。另外,所有的文档,问答都尽量看英文的,这可以帮你剩下大量的时间。12月13日,我做的网站上线了,3天时间大概有5000人访问了这个网站,我有时在后台看着日志,不免有些心潮喷涌,我想把自己的经验写下来,希望对于那些有心学习编程但无从下手的朋友提供一些帮助和鼓励。

1. 我的自学编程之路

1)基础

刚开始的时候,我对搭建网站一无所知。为了给自己迅速建立一个框架,我在Google上面泡了整整一天,了解了HTML,CSS,JavaScript,Ajax,jQuery,React,SQL,服务器脚本等等知识,不求精通,只是了解每一项技术是干嘛的,另一方面建立起了一个学习的roadmap,这样大概知道做一个Web App需要哪些知识,分别学习的主次顺序。重点推荐两个资源:
Python基础知识:Learn Python the Hard Way
Web App基础知识:@张秋怡的答案写的通俗易懂,极力推荐。
有了这个roadmap,我明白了前端三大必须掌握技能HTML,CSS和JavaScript,花了大概10天左右把W3Schools上的教程全部过了一遍,然后试着写了几个网页,感觉自己写的很没有底气。于是根据知乎和豆瓣上的推荐,买了《JaveScript DOM》和《Head First HTML与CSS》,边看书边把例子过了一遍。
W3Schools: www.w3schools.com/
JavaScript:JavaScript DOM编程艺术
HTML & CSS : Head First HTML与CSS(第2版)
前端是需要慢慢学习的,在看完上面的资料后,虽然能写出来一些挺漂亮的页面,但是我自己知道很多都是不符合标准的,更不要说代码风格什么的。这只能通过不断地积累和增加代码量来提高。由于明白服务器端需要耗费自己大量的时间,所以在发现自己能够按照构思勉强实现网页之后,我就把学习中心放到了服务器端上。不过每天还是会抽空写一写网页,避免手生。
2)服务器端
最先了解的是HTTP协议,也就是浏览器和服务器之间是如何通信的。也就是当你在浏览器里键入网址按下回车直到网页显示在你浏览器的这个过程中,浏览器和浏览器之间发生了什么事情。这是很有意思的内容,我是以读小说的心情了解了这部分内容。了解这部分后,你就会明白类似为什么有时候会有404页面?在百度搜索框里键入的搜索词是如何提交到百度服务器的?为什么重新登录知乎的时候就不用再输入密码了?之类的问题了。
HTTP协议学习资料:In Introduction to HTTP Basics
@Vamei的博客:协议森林
了解了HTTP协议之后,我就多少有些入迷了。看似神秘难懂的现象其实原理并不复杂,你反而会被吸引。接下来就进入到我投入时间最多的部分了——后端开发。记得当时了解Web开发的MVC(Model-View-Controller)模式后,有一种心血喷涌的感觉,觉得太有意思了(程序员别喷,我就是这么没见过世面)。我们以知乎为例子来说明MVC是个啥:



每个人的主页都是相同的布局和风格,例如最上面的菜单搜索栏,颜色分割,左边显示动态等,右边是个人信息等,然后具体的内容却因人而异——每个人的头像,名字,动态都是不一样的。那么知乎是如何保证每一个人看到的都是自己的主页呢?
你可以把这个相同的布局想象成一个模板,里面有一个个空格子,当你用你的账户登陆页面时,想象你的电脑里有无数个小人根据你的账号从知乎后台的数据库里取出你的头像,动态,认证信息等等内容,然后对应着模板上规定好的位置,把对应的内容填进去。这些小人的动作实在是太快了,以至于你觉得这是在瞬间完成的。
上面所说的模板就是MVC中的V,是View的缩写,负责显示。这样做的好处在于,如果知乎有一天突然想改变一下个人主页的风格,那么只需要改变这一个模板,然后几千万注册用户的主页就相应的变化了,因为模板是公用的,是不是省了很多事情?(早期的Web开发可不是这样哟,你可能要一个个用户去改,非常麻烦。)
而这些小人除了摆放内容,它们真正负责的是业务逻辑,我们把他们叫做Controller,也就是MVC中的C。例如当你登陆的时候,这些小人要检查你的用户名是不是准确的,如果准确,它们要去数据库里取出你请求的信息等,如果用户名错误,它们要拦截住你的登陆。它们的职责还有很多,无法一一列举。在实际中,这些小人做的事情其实就是Python(或者其它脚本语言)做的事情。
最后,MVC中的Model其实就是传给View的数据,包括上面的头像,用户名,动态等因人而异的数据。这些数据在知乎服务器上是以数据库表格(table)的形式存在的,你可以把它们想象成很多不同的excel表格,不同的表格储存着不同的信息,有些记录着知乎用户的个人信息,有些记录着回答,有些记录着评论等等,而这些表格之间又彼此联系,当你在知乎的不同网页间跳转的时候,上面说的那些小人就根据你的要求,组合对应的表格取出对应的数据,然后把他们放到模板对应的空格里,发送给浏览器。然后浏览器根据你写的CSS,用不同的颜色,大小等等,将数据很漂亮的显示出来。
这样做的好处是什么呢?虽然你最终在浏览器里看到的是一个完整的页面,但是在后端逻辑上它们都是区分开的——模型(M),视图(V)和控制器(C)的区分就保证了较高的可维护性——我可以随时修改主页的显示并看到效果,同样我可以随时加入一些业务逻辑。
如果你的学习坚持到这里了,首先要恭喜你。其次你可能已经知道一些非常成熟的Python Web框架了,例如Django,Flask等等,并且你可能看到了很多小白教程教你直接使用,毕竟大部分人可能觉得没有必要重复造轮子。
本来为了省事,我也打算直接用框架。我是在设计数据库的时候,当时在看SQLAlchemy文档,觉得相对自己的项目SQLAlchemy太过复杂,所以我决定自己写自己的ORM(名词不懂没关系),这对于当时的我来说是一件难度非常大的事情。于是我投入了极大的精力每天都在看关于SQL和Python相关的教程和资料,Python核心编程(第二版) 给了我很大的启发。在自己完成了ORM后,又写了URL处理函数,同样没有用任何现成的Web框架。
现在回头看,我认为这一段时间的造轮子是提升编程能力最快的时候。比如为了写ORM,就必须去花很多时间学习SQL,去了解Python里面的metaclass,而如果用一个现成的框架,我很有可能偷懒不去关注某些细节。而不出问题还好,一旦出问题,我就只能跪。另外,造轮子迫使我在开始的时候就构思整个框架,因为我必须尽可能的考虑到所有的情况,于是就会不断的强迫自己完善知识体系,和别人的代码作对比从而改进自己的,这个过程充满了无尽的挫败感,但是得来的成就和快乐也是无可比拟的。
SQL书籍:Sams Teach Yourself MySQL in 21 Days
Python:Python核心编程(第二版)
Github上的优质Python资源:CodementorIO/Python-Learning-Resources
过程中还牵涉到部署,我的网站是跑在Linux上的。关于部署网上有非常多的优质教程,一搜一大把。这里就不再赘述。
这些是我学习大致路线,当然过程中充满着小的磕磕绊绊,虽然网站上线了,貌似运行还比较顺利,但是如果以一个程序员的标准来要求自己,自己依然非常菜鸟。不过我并没有以前那样惧怕技术了,就像你明白魔术的背后的原理后,会更多的思考原理本身。
2. 自学编程需要注意的问题

很多人都推荐小白第一门语言选Python,因为语法简单。这句话只说了一半,Python确实容易上手,对初学者的门槛很低。但我发现,对于小白真正的门槛在于系统知识,这就和用什么语言完全没有任何关系了。例如很多人学完了Python的语法,觉得确实简单,但是转头去用Python标准库的时候,却发现自己连文档都看不懂。标准库提供了Python和其它系统功能的接口,最终实现了Python和系统之间的互动。读标准库需要系统知识,比如操作系统,数据库,进程和线程,socket编程,网络协议等等,这些对于编程小白来才构成很高的门槛,但是只有学会这些,才能真正发挥出Python的威力来。
这也是我觉得自己的经历对小白是有价值的一个原因。因为设计一个动态的网页是一个很不错的练手Project。建立网页(Web App)会逼迫你了解从你在浏览器里键入地址按下回车到网页显示在浏览器的过程中,浏览器,网络,服务器都干了些什么。具体到技术上面,你不得不去学习前端的HTML,CSS和JavaScript,后端的脚本,数据库,操作系统等。也就是说,这个过程能够促使你去主动学习上面提到的系统知识,如果你再做另外一个项目,你就不会像现在这样无从下手,而有能力去进行一些技术性的探讨,所以我认为这是一个非常好的练手项目。

1)一定要空出时间补充理论知识
很多人会强调learn by doing,边做项目边学习,这也是我自己采用的方式。在这种方式中,你不断犯错,改正……学习效率非常高。但是,很多人走了极端,最后的结果就是不注意理论知识的学习。你会发现自己Google的能力越来越高,但是真实的编程能力并没有得到提升。如果有这种情况,你需要反思一下。
一种可能是你太过于依赖各种成熟的框架,结果编程就变成了用「胶水」去粘合不同的框架完成需求。就好比你的Web App用了SQLAlchemy,虽然自己不太懂SQL,但是网站跑的也还不错。这时候如果数据库出现了问题,那你就只能跪了。
另外一种可能是你完全沉浸在做项目中,忽略了学习理论知识。做项目虽然充满困难,但回报是强烈的成就感,很容易沉浸其中。我觉得这是极其错误的。首先半路出家的程序员都没有经过系统的学习,没有形成自己的知识体系,如果你不懂数据结构,算法复杂度,操作系统这些理论,那么你能达到的高度就极其有限。所以,在每天做项目的同时,一定要保证抽出一定的时间,恶补理论知识。这部分的书单在豆瓣和知乎上都有很多总结,可以自行搜索。
2)不要太纠结于无意义的问题,比如什么框架好,XX语言比XX语言好啦这种问题。前期确定了练手项目,就去专心积累代码量,积累基础知识。那些你现在还看不懂的炫酷技术你慢慢也就能明白是怎么回事了,反而没有基础,再炫酷的框架对你而言都是天书。
3)学会发问。好问题是建立在你自己已经实践或者思考的基础上问出来的,这是对自己的负责,也是对别人的尊重。不要一遇到困难就喜欢直接上网搜索:「这个问题是怎么回事啊?」,「我不明白你能不能帮我看看……」。
4)学好英语。
THE END

最后,给自己打个广告,如果学英语,一定要关注我。
gomenjay 发表于 2023-10-4 18:05:06|来自:北京 | 显示全部楼层
【实体书】
Python 3版本的实体书:《自学Python 编程基础、科学计算及数据分析 第2版》(李金)【摘要 书评 试读】- 京东图书,京东/淘宝/当当等各平台均可购买,喜欢实体书的可以看看,内容不完全一致。
【Python 3版本】
Python 3版本的笔记已更新完成,链接:

  • Github:
中文Python 3笔记

  • Nbviewer:
Notes-Python3目录:

  • ch00-Python2与3的核心区别

    • 00-01Python2和3的核心区别

  • ch01-Python介绍

    • 01-01Python简介
    • 01-02IPython解释器
    • 01-03Jupyter Notebook
    • 01-04脚本模式与解释器模式

  • ch02-Python基础

    • 02-01Python演示
    • 02-02数字
    • 02-03字符串
    • 02-04索引和切片
    • 02-05列表
    • 02-06可变与不可变类型
    • 02-07元组
    • 02-08字典
    • 02-09集合与不可变集合
    • 02-10Python赋值机制
    • 02-11判断
    • 02-12循环
    • 02-13函数
    • 02-14模块与包
    • 02-15文件读写
    • 02-16异常与警告
    • 02-17常用内置函数

  • ch03-Python进阶

    • 03-01函数进阶
    • 03-02迭代器与生成器
    • 03-03装饰器
    • 03-04上下文管理器
    • 03-05变量作用域

  • ch04-Python面向对象编程

    • 04-01面向对象简介
    • 04-02方法与属性
    • 04-03继承与复用
    • 04-04公有、私有、特殊以及静态方法和属性
    • 04-05多重继承

  • ch05-Python标准库

    • 05-01模块sys:系统相关
    • 05-02模块os:与操作系统进行交互
    • 05-03模块re:正则表达式
    • 05-04模块datetime:日期时间
    • 05-05模块json:处理JSON数据
    • 05-06模块glob:文件模式匹配
    • 05-07模块math:数学
    • 05-08模块random:随机数
    • 05-09模块pathlib:路径操作

  • ch06-NumPy模块

    • 06-01NumPy模块简介
    • 06-02数组基础
    • 06-03数组广播机制
    • 06-04数组操作
    • 06-05数组的读写
    • 06-06数组索引进阶
    • 06-07随机数组

  • ch07-Matplotlib模块

    • 07-01Matplotlib模块简介
    • 07-02基于函数的可视化操作
    • 07-03基于对象的可视化操作
    • 07-04图像中的文本处理

  • ch08-SciPy模块

    • 08-01SciPy模块简介
    • 08-02插值模块
    • 08-03概率统计模块
    • 08-04优化模块
    • 08-05线性代数模块

  • ch09-Pandas模块

    • 09-01Pandas模块简介
    • 09-02一维数据结构Series对象
    • 09-03二维数据结构DataFrame对象
    • 09-04Pandas对象的索引
    • 09-05缺失值的处理
    • 09-06数据的读写

  • ch10-一些好玩的应用

    • 10-01获取必应桌面壁纸


<hr/>【Python 2.7版本】
Python 其实挺简单的,也挺强大的。
我用 Python 做科学计算,自学一年,也记了一年的笔记。
笔记链接(基于Python 2.7):

  • Github:
GitHub - lijin-THU/notes-python: 中文 Python 笔记

  • Nbviewer:
Notes-Python2

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则