Python学习之旅
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习之旅相关的知识,希望对你有一定的参考价值。
前言
偶然看到廖雪峰老师写的《Python教程》被其通俗易懂的语言深深吸引,于是就如饥似渴般沉侵其中。从python简介开始一直到最后完成实战项目差不多半个多月时间,收货颇丰,疑惑也不少,于是希望通过记录的方式梳理一下自己的思路,也算是对自己半个多月学习的总结。以下主要记录自己学习结构,不做详细说明,需要看详细教程可移步(http://www.liaoxuefeng.com)查看原文。
简介
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
Python的缺点:
- 运行速度慢。和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。
- 代码不能加密。如果要发布你的Python程序,实际上就是发布源代码。 这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux一样的开源代码,我们千万不要高估自己写的代码真的有非常大的“商业价值”。那些大公司的代码不愿开放的更重要的原因是代码写得太烂,一旦开源,就没人敢用他们的产品了。
安装
因为Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序,放到Linux上也是能够运行的。要开始学习Python编程,首先就得把Python安装到你的电脑里。安装后,你会得到Python解释器(就是负责运行Python程序的),一个命令行交互环境,还有一个简单的集成开发环境。目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,教程将以最新的Python 3.5版本为基础。
在Mac上安装Python
如果你正在使用Mac,系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7。要安装最新的Python 3.5,有两个方法:
方法一:从Python官网下载Python 3.5的安装程序(网速慢的移步国内镜像),双击运行并安装。
方法二:如果安装了Homebrew,直接通过命令brew install python3安装即可。
在Windows上安装Python
首先,根据你的Windows版本(64位还是32位)从官网下载Python3.5对应的64位安装程序或32位安装程序(网速慢的移步国内镜像),然后运行下载的EXE安装包。
Python语法
语言的学习总离不开语法,无论是英语,法语,德语,西班牙语等的学习都有一套自己的使用约定。我把Python的使用约定也总结出自己的一套语法,即Python语法核心五要素:
- 基本类型:内置常用的基本类型,如int, float, str, list, tuple, dict等
- 逻辑运算:如条件判断,循环等
- 函数/方法:定义,参数
- 面向对象(OOP):一种程序设计思想,核心是继承,封装,多态
- 模块:内建模块和第三方模块
五要素关系:语法中的基本数据类型通过一定的逻辑处理构成函数/方法,对函数/方法、基本数据类型套用面向对象的程序设计思想就能构成丰富的模块。
基本类型
整数
Python可以处理任意大小的整数,包括负整数,在程序中的表示方法和数学上的写法一样,例如:1,100,-8080,0,等等。
浮点数
浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如1.23x109和12.3x108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
字符串
字符串是以单引号或者双引号括起来的任意文本,比如‘abc’。如果字符串内部包含’又包含“时可以使用转义字符\来标识,如:‘I \’m \”OK\”!’
布尔值
一个布尔值只有True、False两种值,在Python中可以直接用True、False表示布尔值(请注意大小写)。
空值
空值是Python里一个特殊的值,用None表示。None不能理解为0
,因为0
是有意义的,而None是一个特殊的空值。
List和Tuple
List
Tuple
切片
迭代
迭代器
生成式
生成器
Dict和Set
Dict
Set
逻辑运算
条件判断
循环/迭代
函数/方法
在Python中,类中定义的函数(方法)第一个参数永远是实例变量self(不能忘记写上),并且调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以你仍然可以使用默认参数、可变参数、关键字参数和命名关键字参数。
函数定义
函数返回
函数参数
参数检查
参数类型
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
位置参数
默认参数
可变参数
关键字参数
命名关键字参数
参数组合
参数小结
- 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
- 要注意定义可变参数和关键字参数的语法:
*args
是可变参数,args接收的是一个tuple;**kw
是关键字参数,kw接收的是一个dict。
- 以及调用函数时如何传入可变参数和关键字参数的语法:
- 可变参数既可以直接传入:
func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
; - 关键字参数既可以直接传入:
func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{‘a‘: 1, ‘b‘: 2})
。
- 可变参数既可以直接传入:
- 使用
*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。 - 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
- 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符
*
,否则定义的将是位置参数。
常用函数
类型转换
递归函数
匿名函数
高阶函数
变量可以指向函数
结论:函数本身也可以赋值给变量,即:变量可以指向函数。
函数名也是变量
传入函数
偏函数
装饰器
Filter函数
Sorted函数
返回函数
面向对象
说到面向对象,就不得不提面向过程。从字面上理解,面向对象针对的是一个事物(比如桌子,椅子,动物等)的研究偏静态,而面向过程则是针对流程或者动作的研究,偏动态。无论是面向过程还是面向对象核心是一种设计思想,指导我们如何进行程序设计。
计算机世界只是我们现实世界的映射,如何实现这种映射就是我们广大程序猿的工作。举个简单例子,“小明骑车去上学”,这是现实世界中小明的一项日常活动,如何把这一日常活动映射到计算机呢?很简单——编程(写代码)。
用面向过程的思想实现上述场景:
# 面向过程设计:小明骑车去上学 def Go2School(name, vehicle): print(‘%s%s去上学!‘% (name, vehicle)) if __name__ == ‘__main__‘: Go2School(‘小明‘,‘骑车‘)
用面向对象思想实现上述场景:
# 面向对象设计:小明骑车去上学 class Student(object): """定义一个学生类""" def __init__(self, name): super(Student, self).__init__() self.__name = name def ByVehicle(self,vehicle): return (self.__name + vehicle) def Todo(self,thing): # 参数self必须写,不写会报错 return thing xiaoMing=Student(‘小明‘) print(‘%s%s!‘ % (xiaoMing.ByVehicle(‘骑车‘),xiaoMing.Todo(‘上学‘)))
现在,该死的产品狗告诉我要实现“小明骑车回家”或者“小明坐车去上学”,那么按照面向过程设计思想,就得再写一个GoHome(name, vehicle)函数;而按照面向对象设计思想,不用做任何更改,直接把传入的参数“骑车”换成“坐车”,把“上学”换成“回家”即可。如果下次产品狗告诉你要实现“小花坐火箭去月球”,你使用面向对象设计的程序根本不用做任何修改,直接使用就行。很明显,面向对象设计提供了更强大的扩展,是一种非常好的设计指导思路。
类和实例
三大特性
继承
封装
多态
模块
使用模块
安装模块
常用模块
内建模块
常用内建模块包括:datetime, collections, base64, struct, hashlib, itertools, contextlib, XML, HTMLParser, Urllib等。在此不做详述。
第三方模块
常用第三方模块有:PIL, Tkinter等。在此不做详述。
Python用法
IO编程
进程和线程
多进程
多线程
进程VS线程
分布式进程
协程
同步IO
文件读写
操作文件和目录
序列化
异步IO
asyncio
async/wait
aiohttp
网络编程
TCP编程
UDP编程
电子邮件
SMTP发送邮件
POP3收取邮件
访问数据库
使用SQLite
使用MySQL
使用SQLAlchemy
Web开发
WSGI接口
使用Web框架
使用模板
以上是关于Python学习之旅的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?