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