date:2018414+2018415 day1+2

一.python基础

#coding=utf-8

#注释

#算数运算 +(加)  -(减)  *(乘)  /(除)  //(取整)  %(取余)

#比较运算 <(小于)  >(大于)  ==(等于)  !=(不等于)

#逻辑运算 and  or  not

 

#查看变量类型 type()

 

#raw_input  使用raw_input方法去输入时,变量里面存的数据都是字符串类型

#逗号是不换行打印,把所有的变量强制显示在一行

#input  只接受0-9 .的输入(python3还如此?)

 

二.if、for、while 

#if

单分支

 

 双分支

 

多分支

 

#for

#break 结束循环,多个嵌套时break只对最近的一层循环起作用  continue 结束本次循环

 

#while

 

三.格式化输出

#  %d:整型  %s:字符串  %f:浮点型

 

Python之基本数据类型与数据结构

四.字符串

# \ 续行符

# len(x)=x.__len__()

#从前往后数,0开始;从后往前数,-1开始

 

#获取多个字符

 

#字符串拼接

 

#字符串切割

 

#字符串查找

 

#字符串计数+字符串转大小写

 

 #字符串遍历+字符串判断

 

#在utf-8模式下,中文占3位 其他编码占2位

# print x[::-1]   逆序输出

 

#字符串替换

 

#总结 字符串是不能够增加 不能删除 不能修改 不能存储其他类型的数据

 

五.列表 list [a,d,"ASD"]

#列表具有 增加 删除 修改 查询功能

增加:

 

插入:

 

删除:

 

修改:

 

#正序、倒序

正序:

 

 倒序:

 

 #获取索引 index()

六.元祖 tuple ()

#元组不能增加 不能修改 不能删除

 

#元祖嵌套

七.字典 dict  {}

#字典是映射关系,一一对应

#字典由key和value组成;两两一对,逗号隔开

#字典可以存储任意长度 任意类型

#字典的key必须是不可变类型(元组 数字 字符串),value任意类型

#字典是无序的,没有下标

#字典所有的操作 都是去操作key

 

#增加 修改 删除 取value 遍历

 

 

 

八.集合

资料:Python中集合(set)类型详解

set是一个无序且不重复的元素集合。

set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此set也有如下特性:

1. 不重复

2. 元素为不可变对象

 

创建set:

本身使用 {} 进行创建,如果 {}里面没有元素,默认表示 dict类型,也就是创建空元素的set集合,不能用{};

如果要创建一个空元素的set,使用 set();

使用{} 里面可以数值型、字符串、元组, 不可以用字典和集合,里面可以放多个元素.

 

如果使用 set,因为set需要对里面的元素做遍历循环,做去重操作,做无序排列,所以要求元素必须可遍历,所以里面可以使用字符串、元组、集合、字典

{}里面不能用 list集合、set里面不能用数值型

 

九.Tips

可更改对象:list dict

不可更改对象:Int String tuple

可变/不可变类型,指的是:内存id不变,type也不变的前提下,value是否是可变的。

不可变:只要改变变量的值,如果变量的地址发生了改变,则认为是不可变 int,str,float,bool,tuple 

可变:变量的内部无论发生怎样的改变,地址都不发生改变,则认为是允许改变,(可变) list set dict

&&&&&&&&&&&&&&&&&&&&&&&&xxxxx·xx&&&&&&&&&&&&&&&&&&&&&&&& 

 

date:2018422 day4 

 

一.模块

模块是函数方法的集合,在python中,一个py文件也是模块

python模块有两种:第一种是安装python自带的内置模块,比如time,os,urllib2 路径为c:\python27\lib;

第二种是需要安装的第三方模块,路径为c:\python27\lib\site-packages

 

①.excel读写

写(cmd→【pip install xlwt】)

读(cmd→【pip install xlrd】)

 

UTF-8解码(decode)→Unicode→编码gbk

Unicode→编码(decode)gbk

Unicode→编码(decode)UTF-8

 

②.读写二进制

③.导入

1.导入模块

 2.导入模块方法

3.导入多个

4.自定义模块

当自定义模块想被别人调用时,需在当前目录下创建一个__init__.py(自定义模块能被导入时,文件夹上会有一个空心圆出现,如下图)

不同层级目录的模块导入要从包开始

④.系统模块(如os,time 不需要pip)

 taskkill /f  /im chrome*  >nul  2>nul

/f force强制性   /im imagename 进程名称   *通配符

>nul 正确执行指令不打印日志   2>nul 不正确执行命令不打印日志

 

 二.异常

 

 

************************************************************************************************************************

date:2018421 day3

一.函数定义

def  函数名(首字母大写)

增加程序可读性

#直接写函数名即可调用函数

 

#参数

①.形参

 

②.实参

 

③.缺省参数

如果有默认值,调用的时候没有传递参数,就会使用默认值;如果传递了参数,就使用新的数据

 

#函数定义了几个参数,调用的时候就要传递几个参数;函数的参数传递是有顺序的(如果按照赋值表达式来传递,就不需要按照顺序,如【 Fun(a=1,b=2)/ Fun(b=2,a=1)】)

 

#函数必须要return,而不是print

 

#一个函数可能有多个return;一次return多个值,返回的多个值是以元祖形式返回

 

#变量作用域 作用范围

①.局部变量

函数内部的变量属于局部变量,作用范围是函数内部。

 

②.全局变量

 

#高级参数

①.可选参数,定义函数不清楚需要多少参数     返回的是元祖数据

 

②.**接受赋值表达式,返回字典

 Python中的*args和**kwargs

 

二.文件读写

 1.写文件

#写了文件名,那么文件创建在 脚本的同级目录
#.代表当前目录,那么文件创建在 脚本的同级目录
#..代表上级目录

追加写入

 

 

2.读文件

 

#读取行

 

 #读取多行,不读取换行符

 

 

#指定读取某一行

 

三.文件修改

#首先读取数据,再修改数据,最后写入数据

 

四.二进制文件读取写入

 

获取当前文件夹所在路径:

import  os

basepath = os.path.dirname(__file__)

拼接路径:

filepath = os.path.join(basepath,"data.txt",filename)

 

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回

列表生成式:

 

map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

a=[1,2,3,4,5,6]

list(map(lambda x:x+1,a))

 

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

from functools import reduce

reduce(lambda x,y:x+y,[2,3,4],1)

 

filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。da 

a=[1,2,3,4,5,6]

list(filter(lambda x:x>2,a))

 

sorted()函数就可以对list进行排序

 

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

lambda x,y:x+y

 

在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。

Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值

装饰器(decorator)可以给函数动态加上功能。对于类的方法,装饰器一样起作用。Python内置的@property装饰器就是负责把一个方法变成属性调用的

 

五、爬虫相关

1.爬虫   WHAT

 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片/视频)爬到本地,进而提取自己所需的数据,存放起来使用。

 

2.爬虫   WAY   

获取网络数据的方式:

①.浏览器提交请求→下载网页代码→解析成网页

②.模拟浏览器发送请求(获取网页代码)→提取有用的数据→存放在数据库或文件中   [爬虫所要做的]

 

发送请求→获取响应内容→解析内容→保存数据

 

发送请求

使用http库向目标站点发起请求,即发送一个Request

Request包含:请求头、请求体等

Request模块缺陷:不能执行JS和CSS代码

 

获取响应内容

服务器正常响应,则会得到一个Responce

Response包含:html,json,图片,视屏等 

 

解析内容

解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等

解析json数据:json模块

解析二进制数据:以wb的方式写入文件

 

保存数据

数据库(MySQL,Mongdb,Redis)

 

 3.爬虫   WHY

Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket sever)

Response:服务器接收请求,分析用户发来的请求信息,然后返回数据

浏览器在接收到Responce后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中有用的数据。

 

Request{

①.请求方式(常见的):GET/POST

 

②.请求的URL:url全球统一资源定位符,用来定义互联网上的一个唯一的资源,如一张图片、一个文件、一段视频都可以用url唯一确定

网页加载过程:加载一个网页,通常都是先加载document文档,在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求

 

③.请求头(一般爬虫都会加上请求头):

User-agent:请求头中如果没有user-agent客户端配置,服务器可能将你当作一个非法用户host;

cookies:cookies用来保存登录信息

请求头需要注意的参数:

1.Referrer:访问源哪里来的(一些大型网站,会通过Referrer做防盗链策略,所有爬虫也要注意模拟)

2.User-agent:访问的浏览器(要加上否则会被当成爬虫程序)

3.cookie:请求头注意携带

 

④.请求体

如果是get方式,请求体没有内容(get请求的请求体放在url后面参数中,直接能看到)

如果是post方式,请求体是format data

ps:登录窗口、文件上传等,信息都会被附加到请求体内;登录,输入错误的用户密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

 

⑤.响应Response

1.响应状态码:

202:代表成功

301:代表跳转

404:文件不存在

403:无权限访问

502:服务器错误

2.response header

响应头需要注意的参数:

Set-Cookies:BDSVRTM=0;path=/:可能有多个,是来告诉浏览器,把cookie保存下来

Content-Location:服务端响应头中包含Location返回浏览器之后,浏览器就会重新访问另一个页面

Preview就是网页源代码 JSON数据 如网页html,图片 二进制数据等

}

 

4.爬虫   总结

爬虫流程:爬取→解析→存储

爬虫所需工具:

请求库:request,selenium

解析库:正则,beautifulsoup,pyquery

存储库:文件,MySQL,Mongdb,Redis

 

Python数据库操作:

一.mysql操作

1.数据库的连接

前置条件:服务器ip  端口号  用户名  密码  数据库名

安装第三方库:MySQLdb(运行MySQL-python-1.2.5.win32-py2.7.exe)

2.创建数据库

a.连接数据库,创建数据库库名

 

b.创建表,插入数据(插入数据要有commit)

 

 c.查询数据、修改数据(修改数据也要commit)

 

d.删除数据库 drop database db1

e.以函数形式操作数据库

 

二.oracle操作

 1.安装第三方库cx_oracle

运行msi文件(cx_Oracle-5.1.2-11g.win32-py2.7.msi);然后将instantclient_11_1.rar解压,将文件夹内的8个以dll为后缀的文件复制粘贴至X:\Python27\Lib\site-packages内

2.操作数据库(oracle没有database)

 

三.Tips

1.各种端口号

mysql:3306

oracle:1521

apache:80

ftp:21

telnet:23

tomcat:8080

ssh:22

 

什么是“堆”,"栈","堆栈","队列",它们的区别

堆、栈、队列之间的区别是?

①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)

③队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

 

函数与方法的区别

 函数(function)是可以执行的javascript代码块,由javascript程序定义或javascript实现预定义。函数可以带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且还可以返回值,以表示计算的结果。【函数名(参)】

  方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。假设有一个函数是fn,一个对象是obj,那么就可以定义一个method【对象名.方法名()】

 

类中的函数称为方法。

函数是一段代码,通过名字来进行调用。它能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。

所有传递给函数的数据都是显式传递的。

方法也是一段代码,也通过名字来进行调用,但它跟一个对象相关联。方法和函数大致上是相同的,但有两个主要的不同之处:

  1. 方法中的数据是隐式传递的;
  2. 方法可以操作类内部的数据(请记住,对象是类的实例化–类定义了一个数据类型,而对象是该数据类型的一个实例化)

以上只是简略的解释,忽略了作用域之类的问题。

 

Python raise用法(超级详细,看了无师自通)

 

********************************************************************************************************************************************************************

一.面向对象编程

1.定义类,类的继承

ps:与普通函数相比,在类中定义的函数第一个参数必须是类的本身实例变量self,在调用时,该参数不用传值

 

2.__init__方法+私有方法

__init__存在的意义:类中有必须要绑定的属性,可以使用python的内置方法__init__

__init__方法无需调用,创建类的实例时自动调用

__init__方法和类中函数一样,第一个参数必须是self,创建类的实例在__init__方法体内,可以将外部传参传递绑定到self,self.name指的是类的变量。需要在实例化的时候传参。

私有方法(方法前有两个下划线,只能类的方法调用,外面对象无法调用);类中私有方法调用,前面要加self

 

3.if __name__ == '__main__'

通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')

if __name__ == '__main__'的意思是:当.py文件被自己直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。

 

如果模块是被导入的,代码块(__name__ == '__main__')下的代码不会被运行;

如果模块是直接运行,代码块(__name__ == '__main__')下的代码会被运行。

参考链接:http://blog.konghy.cn/2017/04/24/python-entry-program/

 

闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
[Python小记] 通俗的理解闭包 闭包能帮我们做什么?

Python装饰器的通俗理解