01
描述符
描述符:将某种特殊类型的类的实例指派给另一个类的属性。这个特殊类型需要实现以下三个方法的其中一个
1)__get__(self,instance,onwer)
2)__set__(self,instance,value)
3)__delete__(self,instance)
通过例子可以理解,self就是实例化的描述符对象x,instance就是实例化的Test对象test(也就是被描述的类的self),owner就是Test。描述符定义了属性x的行为。
property实际上就是描述符,通过里层的instance和表层的self将get,set,和del和被实例化的对象的getsize,setsize,delsize关联
一个自动转换华氏度和摄氏度的类:
1)摄氏度和华氏度只要存储其一
2)每个描述符的关键属性就那么几个get是self,instance,owner。set是self,instance,value。当赋值时,value就是被赋值的值
02
容器的魔法方法
协议:协议规定哪些方法必须被定义,但在python协议不那么正式
容器:如列表,元组,字典等可以存放数据的类型
不可变容器只需定义:__len_(self),__getitem__(self,key)
可变容器还需定义:__setitem__(self,key,value),__delitem__(self,key)
定义一个可记录调用次数的列表:
迭代(循环):使用iter()和next()依次迭代:
string = 'abcdefghijklmnopqrstuvwxyz'
it = iter(string)
next(it)
while语句的迭代:
while True:
try:
each = next(it)
except:
break
else:
print(each)
魔法方法:__iter__(),__next__()定义了在迭代时的行为
生成器:通过普通的函数实现,实际是特殊的迭代器,可以用next调用,与return不同的是,当yield执行后函数不会退出而是暂停在语句尾
用生成器实现斐波那契数列
注意细节:逗号的用法
列表推导式,集合推导式和字典推导式,没有字符串推导式和元组推导式:
比如0到99以内的被2整除而不被3整除的数:
numberlist = [ i for i in range(100) if not(i%2) and (i%3)]
显示0到9是否为偶数的字典:
dictlist =
集合:
numberset = (i for i in [1,2,3,3,3,4,4,5,5,6,7,7])
用()的是生成器推导式:可以用next来访问每一个元素,用生成器推导式做函数参数,不用带两层括号,可以直接输入
03
模块与包
每一个.py文件都是python的模块
模块的导入:
import filename //不用加py后缀,模块函数要使用filename.fuc格式
import filename as fn //模块函数使用fn.func格式
import filename as * //函数直接使用fuc格式
导入单个函数:
from filename import fuc as f
from filename import fuc
if __name__ = __main__:,意为当程序不是被导入的模块,而是主程序时才执行的语句
搜索路径:
方案1:导入模块与主程序放在同一个文件夹下,但是会出现一个问题:大型项目开发的模块难道全都放在同一个文件夹下?
方案2:导入的路径是一组路径的列表,位于该列表下的模块都可直接导入,可导路径可以import sys,再用sys.path查看,一般推荐模块放在python\lib\site-package下
方案3:使用sys.path.append()将模块所在的路径导入到可到路径里
包:大型项目要导入成千上万个模块,把他们都放在同一个文件夹下是不现实的。因此包把成千上万个模块分门别类地存放起来,再把模块的位置一一告诉python。
包的制作方法:
1):创建一个文件夹,用于存放模块,文件夹的名字及包的名字
2):在文件夹下创建一个__init__.py的文件,内容可以为空
3):将相关的文件放在文件夹中
包的导入:import packagename.filename as fn
学习python标准库:阅读doc文件夹下的技术文档
04
爬虫(Web Spider)
python访问互联网:
首先,python得知道需要访问的URL
URL由三部分组成:
1):第一部分是协议:https,http,ftp,file,ed2k...
2):第二部分是存放资源的服务器的域名系统或IP地址
3):第三部分是资源的具体地址,比如目录或文件名
python使用urllib包访问网络,它有四个模块分别为request,error,parse,robotparser
response = urllib.request.urlopen(url)
html = response.read() //得到的是二进制文件,需要解码
html = html.decode("utf-8")
使用python得到猫的图片并保存
将response.read()得到的二进制文件写入即将创建的jpg中即可
也可以先将url转变为Request对象再打开:
对urlopen之后的response还可以执行其他操作:
1):response.geturl():得到url
2):response.info():得到httpmessage对象
3):response.getcode():得到状态
使用python访问有道翻译:
point1:urlopen(url,data)中的data如果未赋值则以get形式提交,否则则以 post形式提交
point2:审查元素-->Network-->Headers-->Form Data下的所有数据存储为字典data,之后data需要使用urlencode函数编码为对应的格式,如‘utf-8'格式才能post,urlencode方法是parse模块下的函数,因此先导入parse模块
point3:urlopen之后需要read response,由于urlopen时encode为‘utf-8’,所以此时需要解码,使用decode()为html
point4:得到的html是一个json结构,使用json.load(html)可以载入html使之成为一个字典,然后就可以用字典的输出方式输出我们想要的内容
领取专属 10元无门槛券
私享最新 技术干货