笔记速记
1.python非常注重缩进,这是它的显著特征之一。
2.import相当于头文件声明模块。
3.利用type函数 type(a)可以查看当前变量类型。 isinstance可以比较两个数据类型并返回一个布尔值。
4.这里面的可直接使用and和or作为一个函数
5.python的算法比较贴合实际,其除法‘/ ’可以直接进行分数运算,要使用整除整舍小数的除法可以用‘// ’同时提供了‘**’ 如 3**2就表示3的平方。
6.python可以直接表达 if 5>=a>3: 不用像c一样5>=a&&a>3 并且它简化了 else if 的表达,可利用elif代替
7.python是直接使用变量,在使用时就要进行赋值,变量名不可以数字开头。
*7.python的文件名有时会与系统有些冲突,这是一个小细节,如命名为random.py就会出现bug
*7.另一个小细节是,想在print中引入’ 如想写出let’s go就要使用转义字符,即print(“let’s go”)
*7.对上一条的优化处理是可以引入 原始字符串,即在变量赋值时加入一个’r’ 如str=r’C:\now’,它可以自动忽略里面的歧义,仅仅当作字符串。(即不会出现\n的换行)
8.当字符串跨越多行时可以利用三引号,这样输出时会保留原格式输出 即"“” “”"
9.for 与range常常配合,用法与c有较大区别。 尤其for的变量更像一个指针,range范围不包括尾部,同时最后一个分支逗号表示间隔。
*9.在数组中的许多函数都是先指定对象,或者说是数组当中的分支函数,一般都是 数组名.函数(函数操作)切勿单独使用!
10.python里的数组更加强大,一般变量可表示数组,中括号初始化,并且元素类型可以混合,用append添加单个元素,extend添加另一个列表(可直接书写列表或者表达式),insert可加入至指定位置(从0计顺序)(可用len函数测量长度)
11.在初始化数组以后,可以之间变量名+[]进行访问,可以完成交换等等操作。
12.删除数组中的元素 可用 remove(直接移除目标) del(全局函数) 后跟要删除的位置,如del a[1]
*12.这里要提到一个较为重要的类似“删除”的函数 叫做’pop’这里译为“弹出”。即对数组使用这个分函数时会弹出(取出)你需要的元素,可以直接进行赋值操作,同时数组里被取出来的值消失。
13.可以对数组进行“切片”,即取一部分数组元素进行使用,原数组不变。 就是 a[上界:下界] 不算末尾值,从0计数 这里可以提到一个小技巧,使用a[:]可以的到原列表的拷贝,即可以在不变化原列表的同时对列表进行操作(仅此方法可以操作,简单的赋值会导致改变,因为在python中数组是通过指针来工作的)
13*这里提到一个函数split()括号中用关键字符进行切割,利用数组的方式访问[-1]表示最末尾的一个元素
14.c语言中对二维数组的访问 如a[1][1],这里是表示访问列表中的列表元素 即层层递进的关系
15.在python中不用再重复的书写逆序,排序,索引,计数操作了。计数:count(计数对象) 索引:index(索引对象,索引范围上界,索引范围下界) 逆序:reverse() 排序:sort(从小到大正序/逆序) 正序:sort() 逆序:sort(reverse=True)
16.这里有一个重要的东西叫做“元组” 元组很像const型的数组,无法改变,书写特征为逗号,一般加上括号表示范围 a=1,2,3 a就为元组。加乘与数组一样 加法拼凑,乘法重复 字符串便可理解为一个元组
17.对于在c语言中学的字符串格式,这里仍旧发挥一定作用,如%d %c %s 等等 我们可以利用这一点对字符串进行处理(格式化) 即可以让字符串在整型,浮点型等等之间转化,% 表示转化操作,具体见例子,同时这里要提到format函数进行对应格式输出(与c语言十分类似)
18.利用help(想要注释的内容) 或者hanshu._doc_来获得英文解释与帮助
19.书写函数可以在形参中使用默认参数,'='赋予默认值即可,实参可以使用特征值参数(就无视了顺序) 函数调用(形参名称=实际参数)
20.lambda是一个很简介舒适的函数定义,可以直接指定参数和函数内容,简介地进行调用 g=lambda x,y: x+y g(1,3)
21.字典当中用copy进行拷贝,b=a.copy(), 它会指向不同的地址(与赋值不同) 字典.clear()来清除字典内容 取字典中的对应内容最好使用get函数 这样不会出现越界报错
22.大括号并不是字典的专利,它可以使用在集合中
23.对于文件的操作,有几个可以连着记。如mkdir(path) 它会创建一级目录,当没有指定全部目录时是当前目录下创建。 makedirs(path)可以创建多级目录 rmdir(path)移除单层目录 目录非空会抛出异常 removedirs(path)多层删除
24.这里介绍一个很有趣的pickle函数 它可以进行‘腌制泡菜’ 对于过大的数据包,便可以进行‘腌制’ 让后续的访问和操作更加容易和优雅 之后便可以理解为一个数据包,通过open+load的形式便可以引用
25.在class中的分支函数要引入参数 self,这相当于区别普通的函数,表示可以通过自身调用该类下的分支函数。在类的方法内使用类的属性变量要使用 self.变量名=…
26.在类的纵向关系中,使用继承来保持一定的常规特征。类的横向关系中,使用"拾遗"(组合)来表示它们之间的一些所属或者横向关系
27.issubclass用于判断是否有类中的继承关系 isinstant用于判断是否为该类下的实例对象
28.(进阶必备)
python中的魔法方法,魔法之处就在于它能够在合适的时候被调用,并不是直接调用访问,一定注意区分,
实例创建和销毁:__init__可以设置该类的一定属性,解决该类的“需求”,一般以self.x=xxx self.y=xxx出现,同时它返回的是null 定义该类的实例化对象时自动调用(传入参数)
__new__一般不会重写,但在继承相关类且想进行一定更改时尤为重要,它会自动 return str.new(cla,string) 同时执行进行修改的操作
__del__所有的实例及引用都被del之后才会自动执行里面的操作
当我们再次审视int list等类时 它们相加时是对象之间的加减 这也就是说我们在书写class时和基本类是一样的 我们可以自定义相关的运算:
与运算符相关的魔法方法:__add__等等 即是在加法时调用,return +相关操作 来进行修改(同时不要在return中出现加法 防止递归) 注意类和魔法方法需要的数据 要正确书写
__setattr__设置类中的属性,__getattr__试图调用不存在的属性的行为,__getattribute__调用已存在属性的时候的行为
29.这里要提到一个其他面向对象的语言中常见的“容器” python中的容器要使用“协议” (与其他编程语言的接口很类似)protocol 在python中没那么正式,更像是“指南”
30.在爬虫中,在urllib.request.urlopen中更改data参数,可以以post的形式进行连接访问,而data的数据就要基于 请求正文中 的date数据,对应相应的格式,基本方法是使用urllib.parse.urlencode()格式
31.更加详细的爬虫 解密还有待学习,还有一个编码
32.更加好的使用爬虫,我们已有了隐藏用户名(head),延迟提交时间(time time.sleep), 代理(ddos的雏形?)
33.从这里开始讲下requests库,requests里的函数十分简洁,基础包括requests.get(对应网页中的get) requests.post(对应网页中的post) requests.delete(对应网页的delete) requests.put(对应网页的put) requests.head(获取网页头信息)
34.get操作完成后可以查看该网页的属性 如:r.text(相应内容的字符串形式) r.headers r.status_code(200/404)(用raise_for_status可以直接判断) r.encoding(返回从header中猜测的编码格式) r.apparent_encoding(返回通过内容猜测的编码格式,更加准确,当encoding不能正确解码时,就用这个) r.content(网页的相应二进制形式)
35.BeautifulSoup可以对网页进行解析,首先要理解网页中的标签树,最基本的soup=BeautifulSoup(‘html’,‘html.pareser()’)可以进行基本的网页解析(用函数prettify打印,可以使用加入.后缀来进行标签的prettify),然后里面还有tag,name,attribute,navigablestring,comment 直接进行属性访问即可 soup.title等等,attrs会返回一个字典,查看字符就soup.string即可
36.对于一个html界面,它由标签树构造,我们要进行上行,下行,平行遍历,详情见tagbianli
37.在网页中信息的标记同样重要,对于一定的信息要进行分类
*37.这里简单介绍一下,html xml json yaml
html:超文本连接,将视频 音效等嵌入文本之中
xml:与html十分相似 同样以<>符号进行数据展示,可以说是html的通用形式
json:javascript object notation即javascript语言面向对象的数据储存方式 是有类型的键值对的表达,与字典比较相似(无法使用注释) 一般用于云端和节点的信息通信
yaml:它是无类型的键值对的表达,利用缩进来进行表达,注意与json的区分 一般为各类系统的配置文件
38.在常规的网页分析上面,我们要灵活应用形式解析及搜索方法 这里使用soup.find_all(name,attrs,recursive,string) 它可以返回一个列表类型 同时传递参数时,若想对一个参数赋予多值,请利用列表传参 直接使用.find_all(True),利用简单的迭代就可以打印所有标签
*38在实际操作中,find_all函数可以省略,即soup(‘a’),直接进行查找
39.接下来是正则表达式,它是一种通用的字符串表达框架,可以表达有一定特征的字符串,同时它非常简洁,同样它可以判断字符串是否符合某种特征, 其用到的re库也是python的标准库,无需额外安装
40.原始字符串是Python中一类比较特殊的字符串,以大写字母R或者小写字母r开始。在原始字符串中,字符“\” 不再表示转义字符的含义。
原始字符串是为正则表达式设计的,也可以用来方便地表示Windows系统下的路径,不过,如果路径以"" 结尾那么会出错。
41.具体的正则表达式语法放在相关图片中。这里额外补充什么是’match’对象,常用的属性有group(0)(返回所以匹配结果),span(表组的开始与结束位置)
*41.这里额外介绍一个函数,叫re.compile(‘正则表达式字符串形式’,flag),它可以对一开始的字符结构进行编译,其结果就是正则表达式对象,可以直接使用re库的各种操作
42.在正则表达式匹配的过程中,可能会出现一个字符串多次匹配,这里默认会是使用’贪婪匹配’(即匹配最长的字符串) 对能够延长字符串的元素进行拓展才能进行最小匹配(如’??‘,’*?‘,’+?',{m,n}?)
43.现在要聊到scrapy框架,不是简单的函数库,它是与request截然不同的两种技术路线,但它们都在爬虫上有着非常好的函数,可用性很强,这里顺便要提到的是,它们都没有应对验证码,提交表单等功能,需要额外拓展。
43*.scrapy可以算是网站级别的爬取,可以批量进行操作,它基于异步结构设计,并发性好,性能高
44.这里对yield函数进行补充,它作为一个生成器要与循环搭配使用,它不会在函数中普通地返回值,在使用一次后会冻结,同时python也鼓励将带yield的函数与for搭配,作为一个生成器,在scrapy中能够生成一系列url链接且占用资源较少