亲宝软件园·资讯

展开

懂一点Python系列——快速入门

我没有三颗心脏 人气:3
![](https://upload-images.jianshu.io/upload_images/7896890-71e6f0dcd9d841a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > 本文面相有 **一定编程基础** 的朋友学习,所以略过了 *环境安装*、*IDE 搭建* 等一系列简单繁琐的事情。 # 一、Python 简介 **Python** 英文原意为 **“蟒蛇”**,直到 `1989` 年荷兰人 **Guido van Rossum** (简称 Guido)发明了一种 **面向对象** 的 **解释型** 编程语言,并将其命名为 Python,才赋予了它表示一门编程语言的含义。 ![](https://upload-images.jianshu.io/upload_images/7896890-8cc9b31907c8afca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > 说到 Python 的诞生,极具戏剧色彩,据 Guido 的自述记载,Python 语言是他在圣诞节期间为了打发时间开发出来的,之所以会选择 Python 作为该编程语言的名字,是因为他是一个叫 Monty Python 戏剧团体的忠实粉丝。 ## 解释型 vs 编译型 作为电子元器件的 **计算机**,实际上 **只能** 识别某些 **特定的二进制指令** *(特殊的 `01` 组合)*,但由于 **人类阅读** 这些 **指令** 非常难以阅读,加上使用这些指令编写程序的 **耗时** 太过于 **冗长**,所以,人们在此基础上再次制定了一套规范,采用特定的 **人类可阅读** 的代码编写,待到要执行时再 **翻译** 回特定二进制指令,这样就帮助了人们更加轻松地理解和阅读程序逻辑了。 ![](https://upload-images.jianshu.io/upload_images/7896890-4b5f50ce1ddc7077.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 这也就是所谓现在的 **"高级编程语言"** 了。 上述 **翻译** 这个过程 *(其实相当复杂,涉及语法分析、语义分析、性能优化等等..)* 其实也是由一个特定程序来执行的,那 **什么时候将源代码翻译成二进制指令呢?**,不同的编程语言有不同的规定: - **编译型语言**:必须 **提前** 将所有源代码 **一次性** 转换成二进制指令,生成一个可执行文件 *(例如 Windows 下的 `.exe`)* 比如:C 语言、C++、Golang、汇编等。使用的转换工具我们称为 **编译器**。 - **解释型语言**:允许程序 **一边执行一边转换**,并且不会生成可执行程序,比如 Python、JavaScript、PHP 等。使用的转换工具我们称为 **解释器**。 > **Java** 和 **C#** 是一种比较奇葩的存在,它们是 **半编译半解释型** 的语言,源码需要先转换成一种中间文件 *(字节码文件)*,然后再把中间文件拿到 **虚拟机** 中执行。Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率。 ![](https://upload-images.jianshu.io/upload_images/7896890-e0d8266f6398eb03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) *上图* 就展示了两种不同类型语言的执行流程的不同,两种方式对比起来总结如下: - **编译型语言一般不能跨平台**:对于不同的 CPU 来说,它们的指令集是有差异的,这就导致了 **可执行文件** *(翻译后的指令)* 不能跨平台,另外不同的系统之间的命令也会存在差异,例如 Linux 中睡眠是 `sleep()` 参数是毫秒,而 Windows 中是 `Sleep()` *(首字母大写)* 参数是秒,这就导致了 **源代码也不能跨平台**; - **解释型语言可跨平台**:这一切都归功于 **解释器**,它本身就是一个可执行文件,官方只要针对不同的平台开发不同的解释器,那么解释器就能够根据相同的语法解析出同样功能的指令; - **编译型一般比解释型效率高**:由于解释型是采取一边执行一边翻译的做法,所以会慢上一些,再加上我们强大的 **编译器** 会帮我们做许多代码优化的工作。 #### 关于 Python **Python** 属于典型的解释型语言,所以运行 Python 程序需要解释器的支持,只要你在不同的平台安装了不同的解释器,你的代码就可以随时运行,不用担心任何兼容性问题,真正的 **“一次编写,到处运行”**。 **Python** 几乎支持所有常见的平台,比如 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所写的 Python 代码无需修改就能在这些平台上正确运行。也就是说,Python 的 **可移植性** 是很强的。 ## 面向对象 vs 面向过程 **面向对象** 和 **面向过程** 是我们使用计算机编程解决问题的两种不同方式的方案。 **面向过程** 可以说是一种 **基于事件 or 过程** 来描述的编码方式,譬如「把大象放进冰箱」就可以描述成那经典的三个步骤,「把牛放进冰箱」又是另一个相似的经典三步,只是这样单独的事件 or 过程多了之后,随着项目复杂度的增加,项目会变得非常难以维护。 > 软件危机最典型的例子莫过于 IBM 的 `System/360` 的操作系统开发。佛瑞德·布鲁克斯(Frederick P. Brooks, Jr.)作为项目主管,率领 `2000` 多个程序员夜以继日的工作,共计花费了 `5000` 人一年的工作量,写出将近 `100` 万行的源码,总共投入 `5` 亿美元,是美国的 “曼哈顿” 原子弹计划投入的 `1/4`。尽管投入如此巨大,但项目进度却一再延迟,软件质量也得不到保障。布鲁克斯后来基于这个项目经验而总结的《人月神话》一书,成了史上最畅销的软件工程书籍。 > > - 引用自:http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110880 尽管 **结构化的程序设计** *(将一个大问题逐步划分成一个一个的小问题)* 能够帮助我们解决一部分问题,但 **面向过程** 仍然有一些不符合人类惯有的思考方式,譬如说:我今天想去存钱,我不会说「请拿走我的银行卡和钱,然后在我卡上充值上相应的数目,最后把银行卡还给我谢谢」,而我只会说「存钱,谢谢」,因为人大部分时间都是基于 **对象** *(或者可以说角色)* 来思考的。 对于 **面向过程** 最好的总结可能是:**「程序 = 算法 + 数据结构」**,而对于 **面向对象** 来说则可以更改为:**「程序 = 对象 + 交互」**。 ## Why Python? ![](https://upload-images.jianshu.io/upload_images/7896890-8f4e79f34df177e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 上面的 *漫画* 很好地说明了 Python 快速构建工具的能力,这也是 `Why Python` 的一大理由。下面根据惯例列举一些让我们足以选择 Python 的原因。 #### 初学者友善 | 容易明白且功能强大 Python 的设计足够简单和易于使用,这样使得初学者能够从中不断得获取到乐趣以继续 Python 之旅。 另外作为一种非常高级的语言,Python 读起来像英语,这减轻了编码初学者的许多语法学习压力。Python 为您处理了很多复杂性,因此它非常适合初学者,因为它使初学者可以专注于学习编程概念,而不必担心过多的细节。 Python 还一度被爆纳入高考,收编到小学课本。 ![](https://upload-images.jianshu.io/upload_images/7896890-451180aa92102c5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 非常灵活 作为一种 **动态类型** 的语言,Python 确实非常灵活。这意味着没有关于如何构建特征的硬性规则,并且使用不同的方法来解决问题将具有更大的灵活性 *(尽管 Python 哲学鼓励使用明显的方法来解决问题)*。此外,Python 也更宽容错误,因此您仍然可以编译并运行程序,直到遇到问题为止。 #### 越来越火爆 Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。 随着时代的发展,物理硬件功能不断提高,而软件的复杂性也不断增大,开发效率越来越被企业重视。因此就有了不一样的声音,在软件开发的初始阶段,性能并没有开发效率重要,没必然为了节省不到 `1ms` 的时间却让开发量增加好几倍,这样划不过来。也就是开发效率比机器效率更为重要,那么 Python 就逐渐得到越来越多开发者的亲睐了。 在 `12-14` 年,云计算升温,大量创业公司和互联网巨头挤进云计算领域,而最著名的云核算开源渠道 OpenStack 就是基于 Python 开发的。 随后几年的备受关注的人工智能,机器学习首选开发语言也是 Python。 至此,Python 已经成为互联网开发的焦点。在 *「Top 10 的编程语言走势图」* 可以看到,Python 已经跃居第三位,而且在 `2017` 年还成为了最受欢迎的语言。 ![](https://upload-images.jianshu.io/upload_images/7896890-e92d013f1190a7ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 工作机会 | 薪资待遇高 - 来自 [gooroo.io](gooroo.io) 的薪资信息: ![](https://upload-images.jianshu.io/upload_images/7896890-501633340f69b855.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 在天使榜上,Python 是需求第二高的技能,也是提供最高平均薪水的技能。 随着大数据的兴起,Python 开发人员需要作为数据科学家,尤其是因为 Python 可以轻松集成到 Web 应用程序中以执行需要机器学习的任务。 ## 快速体验 | No Hello World ! `Hello World` 似乎是学习编程绕不过去的东西,但使用 **Python**,我们来换点儿别的,Emmm.. 比如,一个 **查询天气** 的小程序 *(效果如下图)*: ![](https://upload-images.jianshu.io/upload_images/7896890-627c3e77b32f2db0.gif?imageMogr2/auto-orient/strip) #### 源码 & 解释 `http://wthrcdn.etouch.cn/weather_mini?city=xxx` 这个网址可以返回任意城市昨日以及 5 天内的天气预报,包括气温、指数、空气质量、风力等,你可以用浏览器试着访问一下,你会得到一个 `weather_mini` 的文件,里面就包含了我们想要的一些数据。 不过这里由于我们发起了网络请求用到了第三方库 `requests`,所以在运行之前还需要使用 `pip install requests` 命令把该库下载到 Python 的安装目录下。 ```python # -*- coding: utf-8 -*- import requests while True: city = input('请输入城市,回车退出:\n') if not city: break req = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=%s' % city) print(req.text) ``` #### 运行你的代码 你可以在 **当前文件夹** 下执行命令: `python hello_python.py`,或是使用 `python <源文件路径>` 运行也行,例如,如果我是 Windows 用户并且将上述源文件保存在了 `D` 盘下面,那就可以执行 `python D:\hello_python.py`,然后你就可以看到上面的效果了。当然如果使用 IDE 将更加方便。 ## Python vs Java 引入一张比较著名的图吧,可以很明显地感受到 Python 在写法上要简洁一些吧: ![](https://upload-images.jianshu.io/upload_images/7896890-60e9032d6e669f4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 二、Python 基本语法简介 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 `{}` 来控制类,函数以及其他逻辑判断。Python 最具特色的就是用 **缩进** 来写模块。 ## 2.0 注释 ```python # 第一个注释 # 第二个注释 ''' 第三注释 第四注释 ''' """ 第五注释 第六注释 """ print("Hello, Python!") ``` ## 2.1 数据类型 Python 中的变量赋值不需要类型声明。Python 有五个标准的数据类型: 1. **Numbers(数字)**:Python3 中有四种数字类型 *(没有 Python2 中的 Long)*,分别是 `int` 长整型、`bool` 布尔、`float` 浮点数、`complex` 复数 *(1 + 2j)*; 2. **String(字符串)**:Python 中字符串不能改变,并且没有单独的字符类型,一个字符就是长度为 1 的字符串; 3. **Tuple(元组)**:类似于 List,但不能二次赋值,相当于只读列表。eg:`('test1', 'test2')` 3. **List(列表)**:类似 Java 中的 Array 类型。eg:`[1, 2, ,3]` 4. **Dictionary(字典)**:类似于 Java 的 Map 类型。eg:`{a: 1, b: 2}` > `set` 集合也属于数据结构,它是一个 **无序** 且 **不重复** 的元素序列。可以使用大括号 `{ }` 或者 `set()` 函数创建集合,注意:创建一个空集合必须用 `set()` 而不是 `{ }`,因为 `{ }` 是用来创建一个空字典。 ```python str = 'Hello World!' print str[2:5] # 输出字符串中第三个至第五个之间的字符串 list = [ 'runoob', 786 , 2.23, 'john', 70.2 ] print list[1:3] # 输出第二个至第三个元素 tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 ) print tuple[1:3] # 输出第二个至第三个的元素 tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print tinydict['name'] # 输出键为 2 的值 ``` ## 2.2 条件语句 ```python # 当判断条件为 1 个值时 flag = False name = 'luren' if name == 'python': # 判断变量否为'python' flag = True # 条件成立时设置标志为真 print 'welcome boss' # 并输出欢迎信息 else: print name # 条件不成立时输出变量名称 # 当判断条件为多个值时 num = 5 if num == 3: # 判断num的值 print 'boss' elif num == 2: print 'user' else: print 'roadman' # 条件均不成立时输出 ``` ## 2.3 循环 #### while 循环 在 Python 中没有 `do..while` 的循环 ```python count = 0 while count < 5: print (count, " 小于 5") count = count + 1 else: print (count, " 大于或等于 5") ``` #### for..in 循环 `for..in` 适用于 `list/ dict/ set` 数据类型,如果需要遍历数字序列,我们也可以借助 `range(min, max, step)` 函数来生成数列。 ```python sites = ["Baidu", "Google","Runoob","Taobao"] for site in sites: if site == "Runoob": print("菜鸟教程!") break print("循环数据 " + site) else: print("没有循环数据!") print("完成循环!") # 输出 0/ 3/ 6/ 9 for i in range(0, 10, 3) : print(i) # 替换成 range(5) 则输出 0/ 1/ 2/ 3/ 4 # 替换成 range(5,9) 则输出 5/ 6/ 7/ 8 ``` ## 2.4 函数 #### 函数基本定义和使用 ```python # 计算面积函数 def area(width, height): return width * height def print_welcome(name): print("Welcome", name) print_welcome("Runoob") w = 4 h = 5 print("width =", w, " height =", h, " area =", area(w, h)) ``` #### 参数传递 在 Python 中,类型属于对象,变量是没有类型的,例如 `name = "wmyskxz"`,则 `"wmyskxz"` 是 String 类型,而变量 `name` 仅仅是一个对象的引用。 Python 中一切都是对象,严格意义我们 **不能说值传递还是引用传递**,我们应该说传 **不可变对象** *(string、tuples、number 不可变)* 和 **传可变对象** *(list、dict 可变)*。 ```python ############################################ # 传递不可变对象 def ChangeInt(a): a = 10 b = 2 ChangeInt(b) print b # 结果是 2 ############################################ # 传递可变对象 def changeme( mylist ): "修改传入的列表" mylist.append([1,2,3,4]) print ("函数内取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]] return # 调用changeme函数 mylist = [10,20,30] changeme( mylist ) print ("函数外取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]] # 函数内外值一致,因为都同属于同一个引用 ``` ## 2.5 class 类 #### 基本定义 ```python class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) # 实例化类 p = people('wmyskxz', 24, 120) p.speak() # wmyskxz 说: 我 10 岁。 ``` #### 继承 & 多继承 & 方法重写 ```python # 单继承 class DerivedClassName(BaseClassName1): . # 多继承 class DerivedClassName(Base1, Base2, Base3): . . . # 方法重写演示 class Parent: # 定义父类 def myMethod(self): print ('调用父类方法') class Child(Parent): # 定义子类 def myMethod(self): print ('调用子类方法') c = Child() # 子类实例 c.myMethod() # 子类调用重写方法 super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法 # 先输出 "调用子类方法" 再输出 "调用父类方法" ``` ## 2.6 module 模块 一个 `.py` 文件就是一个模块,想要使用其他 `.py` 文件中的方法就需要引入进来。 1. `import [module]` ```python # 导入整个random模块,可以是内置/当前路径 import random # 使用 `random` 模块下的 `randint` 方法 print(random.randint(0, 5)) ``` 2. `from [module] import [name1, name2, ...]` ```python # 从 `random` 模块里导入其中一个方法 `randint` from random import randint # 不一样的是,使用 `randint` 的就不需要先写 `random` 了 print(randint(0, 5)) ``` 3. `import [module] as [new_name]` ```python # 但这个名字可能跟其他地方有冲突,因此改名成 `rd` import random as rd # 使用 `rd` 这个名称取代原本的 `random` print(rd.randint(0, 5)) ``` 4. `from [module] import *` **不推荐**,容易造成名称冲突,降低可读性和可维护性。 ```python # Import 所有 `random` module 底下的东西 from random import * # 使用 `randint` 的时候也不需要先写 `random` print(randint(0, 5)) ``` #### module 搜索路径 当你导入一个模块,Python 解析器对模块位置的搜索顺序是: 1. 当前目录 2. 如果不在当前目录,Python 则搜索在 shell 变量 `PYTHONPATH` 下的每个目录。 3. 如果都找不到,Python 会察看默认路径。UNIX 下,默认路径一般为 `/usr/local/lib/python/`。 ## 2.7 package 包 把两个 module 放在一个新的目录 `sample_package`,再新增 `_init__.py` *(可以是空,但不能没有)*,宣称自己是一个 package : ``` sample_package |-- __init__.py |-- 1.py |-- 2.py ``` ```python # package_runoob 同级目录下创建 test.py 来调用 package_runoob 包 # 导入包 from package_runoob.runoob1 import runoob1 from package_runoob.runoob2 import runoob2 runoob1() runoob2() ``` > 单个py文件就是一个 module,而当多个 `.py` 文件 + `__init__.py` 文件时,就等于 package。 # 三、基本代码规范 **代码规范** 再怎么强调也不为过: ![](https://upload-images.jianshu.io/upload_images/7896890-6467610c0eb161a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - 图片来源:https://codingpy.com/article/programmers-daily-what-idiot-wrote-this-crappy-code/ ## 3.1 命名规范 #### 模块 - 模块尽量使用 **小写命名**,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况) ```python # 正确的模块名 import decoder import html_parser # 不推荐的模块名 import Decoder ``` #### 类名 - 类名使用 **驼峰** (CamelCase)命名风格,首字母大写,私有类可用一个下划线开头 ```python class Farm(): pass class AnimalFarm(Farm): pass class _PrivateFarm(Farm): pass ``` #### 函数 - 函数名 **一律小写**,如有多个单词,用下划线隔开 ```python def run(): pass def run_with_env(): pass ``` - 私有函数在函数前加一个下划线 `_` ```python class Person(): def _private_func(): pass ``` #### 变量名 - 变量名尽量 **小写**, 如有多个单词,用下划线隔开 ```python if __name__ == '__main__': count = 0 school_name = '' ``` - 常量使用以下划线分隔的 **大写** 命名 ```python MAX_CLIENT = 100 MAX_CONNECTION = 1000 CONNECTION_TIMEOUT = 600 ``` ## 3.2 基本编码规范 #### 缩进 - 统一使用 4 个空格进行缩进 #### 行宽 每行代码尽量不超过 `80` 个字符(在特殊情况下可以略微超过 `80` ,但最长不得超过 `120`) 理由: - 这在查看 `side-by-side` 的 `diff` 时很有帮助 - 方便在控制台下查看代码 - 太长可能是设计有缺陷 #### 引号 简单说,自然语言使用双引号,机器标示使用单引号,因此 **代码里** 多数应该使用 **单引号** - **自然语言** 使用双引号 `"..."`,例如错误信息;很多情况还是 unicode,使用u"你好世界" - **机器标识** 使用单引号 '`...'`,例如 dict 里的 key - **正则表达式** 使用原生的双引号 `r"..."` - **文档字符串** (docstring) 使用三个双引号 `"""......"""` #### import 语句 - import 语句应该分行书写 ```python # 正确的写法 import os import sys # 不推荐的写法 import sys,os # 正确的写法 from subprocess import Popen, PIPE ``` - import 语句应该使用 absolute import ```python # 正确的写法 from foo.bar import Bar # 不推荐的写法 from ..bar import Bar ``` - import 语句应该放在文件头部,置于模块说明及 `DocString` 之后,于全局变量之前; - import 语句应该按照顺序排列,每组之间用一个空行分隔 ```python import os import sys import msgpack import zmq import foo ``` - 导入其他模块的类定义时,可以使用相对导入 ```python from myclass import MyClass ``` - 如果发生命名冲突,则可使用命名空间 ```python import bar import foo.bar bar.Bar() foo.bar.Bar() ``` #### DocString DocString 的规范中最其本的两点: 1. 所有的公共模块、函数、类、方法,都应该写 DocString 。私有方法不一定需要,但应该在 `def` 后提供一个块注释来说明。 2. DocString 的结束"""应该独占一行,除非此 DocString 只有一行。 ```python """Return a foobar Optional plotz says to frobnicate the bizbaz first. """ """Oneline docstring""" ``` ## 3.3 注释规范 #### 建议 - 在代码的 **关键部分**(或比较复杂的地方), 能写注释的要尽量写注释 - 比较重要的注释段, 使用多个等号隔开, 可以更加醒目, **突出** 重要性 ```python app = create_app(name, options) # ===================================== # 请勿在此处添加 get post等app路由行为 !!! # ===================================== if __name__ == '__main__': app.run() ``` #### 文档注释(DocString) - 文档注释以 """ 开头和结尾, 首行不换行, 如有多行, 末行必需换行, 以下是Google的docstring风格示例 ```python # -*- coding: utf-8 -*- """Example docstrings. This module demonstrates documentation as specified by the `Google Python Style Guide`_. Docstrings may extend over multiple lines. Sections are created with a section header and a colon followed by a block of indented text. Example: Examples can be given using either the ``Example`` or ``Examples`` sections. Sections support any reStructuredText formatting, including literal blocks:: $ python example_google.py Section breaks are created by resuming unindented text. Section breaks are also implicitly created anytime a new section starts. """ ``` - 不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等 ```python # 不推荐的写法(不要写函数原型等废话) def function(a, b): """function(a, b) -> list""" ... ... # 正确的写法 def function(a, b): """计算并返回a到b范围内数据的平均值""" ... ... ``` - 对函数参数、返回值等的说明采用 `numpy` 标准, 如下所示 ```python def func(arg1, arg2): """在这里写函数的一句话总结(如: 计算平均值). 这里是具体描述. 参数 ---------- arg1 : int arg1的具体描述 arg2 : int arg2的具体描述 返回值 ------- int 返回值的具体描述 参看 -------- otherfunc : 其它关联函数等... 示例 -------- 示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行 >>> a=[1,2,3] >>> print [x + 3 for x in a] [4, 5, 6] """ ``` > 更多细致详细的规范可以参考: > > 1. **Google 开源项目指南** - [https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/) > 2. **官方 PEP 8 代码规范** - [https://www.python.orghttps://img.qb5200.com/download-x/dev/peps/pep-0008/](https://www.python.orghttps://img.qb5200.com/download-x/dev/peps/pep-0008/) # 推荐阅读 1. Redis(9)——史上最强【集群】入门实践教程 - [https://juejin.im/post/5e7429a16fb9a07ccc460fe7](https://juejin.im/post/5e7429a16fb9a07ccc460fe7) 2. React入门学习 - [https://juejin.im/post/5da5e9e8e51d4525292d2ed7](https://juejin.im/post/5da5e9e8e51d4525292d2ed7) # 参考资料 1. WhyStudyPython.md | TwoWater - [https://github.com/TwoWater/Python/blob/master/Article/PythonBasis/python0/WhyStudyPython.md](https://github.com/TwoWater/Python/blob/master/Article/PythonBasis/python0/WhyStudyPython.md) 2. C 语言中文网 | Python 系列教程 - [http://c.biancheng.net/python/](http://c.biancheng.net/python/) 3. Crossin的编程教室 - [http://python666.cn/](http://python666.cn/) 4. 计算机和编程语言的发展历史 - [https://blog.csdn.net/abc6368765/articlehttps://img.qb5200.com/download-x/details/83990756](https://blog.csdn.net/abc6368765/articlehttps://img.qb5200.com/download-x/details/83990756) 5. 面向对象葵花宝典 - [http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110879](http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110879) 6. RUNOOB | Python3 系列教程 - [ttps://www.runoob.com/python3](ttps://www.runoob.com/python3) 7. Python 基础语法 | springleo'sblog - [https://lq782655835.github.io/blogs/tools/python-grammar.html#_1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B](https://lq782655835.github.io/blogs/tools/python-grammar.html#_1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B) > - 本文已收录至我的 Github 程序员成长系列 **【More Than Java】,学习,不止 Code,欢迎 star:[https://github.com/wmyskxz/MoreThanJava](https://github.com/wmyskxz/MoreThanJava)** > - **个人公众号** :wmyskxz,**个人独立域名博客**:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您共同成长! ![](https://upload-images.jianshu.io/upload_images/7896890-fca34cfd601e7449.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 非常感谢各位人才能 **看到这里**,如果觉得本篇文章写得不错,觉得 **「我没有三颗心脏」有点东西** 的话,**求点赞,求关注,求分享,求留言!** 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

加载全部内容

相关教程
猜你喜欢
用户评论