Python学习
2019-01-04 10:36:30 0 举报
AI智能生成
Python基础知识
作者其他创作
大纲/内容
认识Python
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。
由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。
由于它可以将其他各种编程语言写的模块粘接在一起,因此被称为"胶水语言"。
由于它可以将其他各种编程语言写的模块粘接在一起,因此被称为"胶水语言"。
语言优势
优雅、简单、易学
具有丰富和强大的库
主要特点
解释型
Python在执行时,首先会由解释器将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。基于C的Python编译出的字节码文件,通常是.pyc格式。
解释器
Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。
CPython(ClassicPython,也就是原始的Python实现,由C语言实现)
PyPy(使用Python语言写的Python)
IronPython(面向.NET和ECMA CLI的Python实现)
Jython(原名JPython,Java语言实现的Python)
面向对象
具有面向对象语言的基本特性,同时也支持面向过程
动态类型
不需要指定变量的数据类型,与Javascript和lua等语言一样
可动态为对象添加属性和方法
跨平台
它可以支持在各种主流操作系统Windows、Linux、Mac系统中运行,只需要安装对应平台的解释器即可。
开发工具
PyCharm
Sublime Text
Pydev Eclipse插件
......
主要应用领域
数据分析
数据获取
公开数据集
网络爬虫
requests、xpath库
urllib、Beautifulsoup库
pyquery(HTML解析,语法与jQuery十分类似)
应对反爬虫机制
(设置headers)
(设置headers)
User-Agent
Cookie
使用代理IP
浏览器抓包
获取ajax加载的数据
应对动态网站
Selenium模拟浏览器
工程化爬虫
框架Scrapy安装及基本使用
分布式爬虫
Scrapy-Redis使用
Scrapy分布式部署
相关项目实践
爬取并解析豆瓣短评
爬取知乎用户信息
爬取淘宝商品信息
爬取58同城租房信息
数据存储、提取
csv、excel文件
pandas文件保存
数据库
MongoDB
pymongo库
MySQL
pymysql库
SQLite
......
数据预处理
数据清洗
pandas库
Pandas基于两种数据类型:Series与DataFrame
Series:一维数据类型,其中每一个元素都有一个标签
DataFrame:二维表结构数据类型
数据建模及分析
统计学基础知识
概率论
回归分析方法
分类、聚类算法
......
数据可视化
将数据转换成可视化图表
Matplotlib、Seaborn、ggplot(基于R语言) 等常用库
计算机视觉与图像识别
cv2模块
自然语言处理(Natural Language Processing),简称NLP
语音识别
Web开发
Django框架
Flask框架
Tornado框架
......
脚本编程及系统处理
代替shell进行脚本编程
语法基础
数据类型
数值型
int整型
long(Python3.X中没有)
float浮点型
complex复数
由实部和虚部构成
可以用a + bj或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
bool
布尔类型,取值True或False
str
字符串,用''(单引号)或""(双引号)表示
属于不可变(Imutable)对象
list
列表,相当于数组,如[1,2,4]
tuple
元组,相当于不可变的list
用()表示,如(1,3,4)
当tuple中只有一个元素时,要写作(1,),其中的,不能省略
dict
dictionary,字典,相当于Javascript中的Map类型,如{x:1, y:2}
set
Set集合,其中的元素不能重复
用{}表示,如{1,2,4}
None
相当于其它语言(如Java)中的null
运算符
算术运算符
+、-、*、/(除)、%(取模)、**(幂运算,x**y -> 返回x的y次幂)、//(整除)
比较运算符
==、!=(<>,不等于,Python3.X中没有)、>、<、>=、<=
赋值运算符
=、+=、-=、*=、/=、%=、//=、**=
位运算符
&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)
逻辑运算符
and、or、not
成员运算符
如果在指定的序列中找到值返回 True,否则返回 False
in、not in
身份运算符
判断两个标识符是不是引用自同一个对象,返回 True或 False
is、is not
优先级
幂运算(**) > [~ + -(取反和正负号)] >[* / % // ] > [+ -(加减)] > [>> <<(左移右移)] > &(位与)> ^|(位异或、或)
> 比较运算符 > 赋值运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
> 比较运算符 > 赋值运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
注意!!!Python中没有++(自增)、--(自减)运算符
pass语句
空语句,一般用做占位语句
函数
使用def关键字定义
参数
默认参数
又称为位置参数,参数值要一一对应
定义默认参数要牢记一点:默认参数必须指向不变对象(通常是None)!
可变参数
在参数前面加一个
*
号 *args
是可变参数,args接收的是一个tuple 如def func(*args),调用时func('Tom', 20)
关键字参数
**kwargs
是关键字参数,kwargs接收的是一个dict 如def func(**kwargs),调用时func(a=1, b=2)
命名关键字参数
和关键字参数
**kwargs
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数 如
def person(name, age, *, city, job)中city和job即为命名关键字参数
注意:
1、如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
2、命名关键字参数必须指定传入的参数名称,否则会报错
1、如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
*
了,如def person(name, age, *args, city, job)
;2、命名关键字参数必须指定传入的参数名称,否则会报错
参数的组合
各种形式的参数定义可以自由组合,但是定义的先后顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
常用内置函数
print()函数
用于向控制台输出
range(start,stop[,step])函数
start默认从0开始,step默认为1
返回的结果是一个整数序列的对象,而不是列表。可以用for...in...遍历
input([hintmsg])函数
接受用户输入,返回输入的字符串
type()函数
返回参数的类型,不考虑继承的情况
参数可以是变量或表达式
id(obj)函数
返回对象的内存地址
locals()函数
返回所有局部变量
globals()函数
dir()函数
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;
带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。
如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
条件语句
if...elif...else...
循环语句
while循环
for循环
for...in...
不仅可以用于迭代list或tuple中的元素,还可以用于其它可迭代对象,比如str、set、dict类型
默认情况下,dict迭代的是key,可以使用 for v in d.values()来迭代值。同时迭代key和value,可以用
for k, v in d.items()
for i, value in enumerate(['A', 'B', 'C'])可实现下标迭代效果
for...in...if语法
print([x for x in range(10) if x % 2 == 0])
与
for x in range(10):
if x % 2 == 0:
print(x, end = ',')
效果类似,但是前者返回的是一个list对象
与
for x in range(10):
if x % 2 == 0:
print(x, end = ',')
效果类似,但是前者返回的是一个list对象
命名空间namespace
Namespace(只)是 从名字到对象的一个映射(a mapping from name to objects) 。大部分namespace都是按Python中的字典dict来实现的。有一些常见的namespace:built-in中的集合( abs() 函数等)、一个模块中的全局变量等。
变量作用域scope
Scope是Python程序的一块文本区域。在该文本区域中,对namespace可以直接访问,而不需要通过属性来访问。
Scope是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。
Scope是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。
分类
1、Local(innermost):包含局部变量。比如一个函数/方法内部。
2、Enclosing:包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。
3、Global(next-to-last):当前脚本的最外层。比如当前模块的全局变量。
4、Built-in(outtermost):Python __builtin__ 模块。包含了内建的变量/关键字等。
2、Enclosing:包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。
3、Global(next-to-last):当前脚本的最外层。比如当前模块的全局变量。
4、Built-in(outtermost):Python __builtin__ 模块。包含了内建的变量/关键字等。
作用域链
类似JavaScript,当Python代码执行时,会在作用域中从内到外寻找该变量定义,如果没找到则报错
寻找顺序:Local -> Enclosing -> Global -> Built-in
注: 全局变量默认是全局可读的,但是如果需要在函数内部改变全局变量的值,必须使用global重新声明为全局变量
包及模块
常用模块
sys
提供了一系列有关Python运行环境的变量和函数,如sys.path表示Python环境变量
os/os.path
包含了文件和目录操作,以及环境变量操作
比如os.remove(path)、os.rename(src, dst)、os.mkdir(path)、os.rmdir(path)等
os.getenv('PATH')获取PATH环境变量的值
string
字符串操作相关
json
处理json相关操作
json.dumps(obj)函数将json对象转换为json字符串
json.loads(json_str)函数将字符串转换为json对象
json.loads(json_str)函数将字符串转换为json对象
time/datetime
时间处理模块
time.time()获取当前时间
标准库
第三方库
面向对象
封装
类
使用class关键字声明
分类
经典类
没有继承object类
新式类
显示继承object类
Python 2.x中默认类为经典类;Python 3.x默认即为新式类,已经默认继承于object类
与C++类似,其中包含__new__(构造函数)、__del__(析构函数)、另外还包含__init__(初始化函数)、__str__(相当于其它语言中(如Java中的toString()函数)等函数
方法
实例方法
与类的某个实例变量相关
第一个参数必须是当前对象,通常写作self,相当于其它面向对象语言(如C、C++、Java)中的this
类方法
与类对象相关,且第一个参数必须是类对象,通常写作cls。因为在调用时会自动将当前类对象作为第一个参数传进去
使用@classmethod装饰器声明
静态方法
与类相关,但不需要任何类或实例变量
使用@staticmethod装饰器声明
属性
实例属性
在实例方法中定义的属性,通过实例访问
类属性
直接在类中定义(不在方法内)的属性,可通过类名直接访问
私有属性
变量名前加"__"两个下划线
公有属性
默认定义的就是公有属性
继承
Python中继承的语法:class SubClass(SuperClass)
Python支持多继承,如class SubClass(SuperClass1, SuperClass2)
与C++ 、Java等语言相似,在子类中调用父类的方法使用super关键字
多态
子类重写父类的方法
异常处理
捕获异常
try...eccept...、try...finally、try...except...finally...
抛出异常
raise
单元测试
unittest库
高级特性
lambda
函数的简化写法
如lambda x: x + 1,其中:左侧代表函数的参数,右侧是函数体。
该表达式返回一个函数,可以直接调用:lambda x: x+1(2),结果为3
如lambda x: x + 1,其中:左侧代表函数的参数,右侧是函数体。
该表达式返回一个函数,可以直接调用:lambda x: x+1(2),结果为3
切片
用于获取一个list或tuple中的部分元素
如:
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
1、L[0:3]表示从索引为0开始截取3-0个元素,可简写为L[:3];
2、索引为负数表示倒数第几个,其中-1表示倒数第一个,如L[-1:]表示取最后一个元素;
3、
L[:10:2]表示从前十个元素中每隔2个取一个
迭代
也称为遍历,在Python通过for...in...循环来实现迭代
用于可迭代(Iterable)对象,分为两类
1、集合数据类型,如list
、tuple
、dict
、set
、str
等;
2、generator
类型,包括生成器和带yield
的generator function
可以使用
isinstance()
判断一个对象是否是Iterable
对象 isinstance([], Iterable)
列表生成式List Comprehensions
比如要生成list [1*1, 2*2, 3*3, 4*4, 5*5, 6*6, 7*7, 8*8, 9*9, 10*10] 可以用 [x * x for x in range(1, 11)]
用于简化传统for...in...循环代码
生成器 generator
解决了列表生成式在处理大序列时占用内存大问题;
同时方便创建可迭代对象,因为其返回值就是一个可迭代对象
同时方便创建可迭代对象,因为其返回值就是一个可迭代对象
它就是一个能够创建迭代器对象的函数,该函数与普通函数的不同在于:函数定义中包含
yield
关键字。 生成器不会把结果保存在一个序列中,而是通过yield声明来保存生成器的状态;
在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。
在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。
yield关键字
2、而且,一旦一个generator 执行到yield语句,generator函数将会暂停执行,然后返回一个迭代器对象;
3、当使用for循环进行迭代的时候,函数中的代码才会开始被执行;
最终,generator函数终止,再调用generator将会引发StopIteration异常
1、yield
是一个类似 return
的关键字,只是return的是个迭代器;2、而且,一旦一个generator 执行到yield语句,generator函数将会暂停执行,然后返回一个迭代器对象;
3、当使用for循环进行迭代的时候,函数中的代码才会开始被执行;
最终,generator函数终止,再调用generator将会引发StopIteration异常
迭代器Iterator
凡是可作用于
凡是可以被
next()
函数调用并不断返回下一个值的对象就称为迭代器 凡是可作用于for
循环的对象都是Iterable(可迭代对象)
类型;
凡是可作用于
next()
函数的对象都是Iterator
类型;集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的
for
循环本质上就是通过不断调用next()
函数实现的 闭包
如果函数出现了嵌套,即在一个外层函数内部定义了一个内层函数,内层函数里运用了外层函数中的临时变量,并且外层函数的返回值是内层函数的引用。这样就构成了一个闭包。
如:
def outer():
a = 2
def inner():
print(a)
return innner
func = outer()
func()
def outer():
a = 2
def inner():
print(a)
return innner
func = outer()
func()
装饰器
装饰器本质上是一个Python函数(闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。
其返回值也是一个函数对象。
其返回值也是一个函数对象。
运用了面向切面编程(Aspect Oriented Programming)的思想。通常用于日志记录、事务处理、权限验证等场景。
定义方式如:
def decorate(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
print('the result is', ret)
return ret
return inner
使用:
@decorate
def foo():
.....
def decorate(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
print('the result is', ret)
return ret
return inner
使用:
@decorate
def foo():
.....
内置装饰器
@staticmethod
用于声明类中的方法为静态方法
@classmethod
声明类中的方法为类方法
@property
简化变量的getter、setter以及deleter的调用,当给变量赋值时会自动调用其setter方法,同样当获取变量值时则会自动调用其getter方法
其getter、setter的函数名,须与属性名一致
0 条评论
下一页