Python记本数据类型
数字(int,long,float,complex),字符串,列表,元组,字典。
Python字符串是可以被索引的,可以根据下标访问子串,列表用[]标志,元祖用()标志(但元祖不能二次赋值,相当于只读列表)。列表是有序的对象集合,可以通过下表索引,字典是无序的,用{}标志。字典中的元素通过键来存取,而不是通过偏移存取。
元组和列表都可以用+进行连接。
二.字符串格式化输出
print “My name is %s and weight is %d kg!” % (‘Zara’, 21)
三.Python函数
函数用def定义,python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如
整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在
fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la
真正的传过去,修改后fun外部的la也会受影响
四.Python模块
Python 模块(Module),是一个 Python 文件。模块定义好后,我们可以使用 import
语句来引入模块,语法如下:import module1[, module2[,… moduleN]。
当你导入一个模块,Python
解析器对模块位置的搜索顺序是:1.当前目录2.如果不在当前目录,Python 则搜索在
shell 变量 PYTHONPATH
下的每个目录。如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。模块搜索路径存储在
system 模块的 sys.path
变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录
想在python模块中运行程序
if _name_ == ‘main‘:
print ‘模块作为主程序运行’
else:
print ‘package_runoob 初始化’
五.类的私有属性和私有方法
都是以两个下划线开始,私有方法和私有变量只能在类的内部访问,在类的外部是无法访问的。foo:
定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。_foo:
以单下划线开头的表示的是 protected
类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import
*。__foo: 双下划线的表示的是私有类型(private)的变量,
只能是允许这个类本身进行访问了。
六.编码问题
例子1:假如我们读取一个文件,文件保存时,使用某种编码格式,决定了我们从文件读取的内容的编码格式。举例,我们从记事本新建一个文本文件test.txt,
编辑内容,保存的时候注意,编码格式是可以选择的,例如我们可以选择gb2312,那么使用python读取文件内容,方式如下:
f = open(‘test.txt’,’r’)
s = f.read()
读取文件内容,如果是不识别的encoding格式(识别的encoding类型跟使用的系统有关),这里将读取失败。假设文件保存时以gb2312编码保存
u = s.decode(‘gb2312’) #以文件保存格式对内容进行解码,获得unicode字符串
‘’’下面我们就可以对内容进行各种编码的转换了’’’
str = u.encode(‘utf-8’)#转换为utf-8编码的字符串str
str1 = u.encode(‘gbk’)#转换为gbk编码的字符串str1
str1 = u.encode(‘utf-16’)#转换为utf-16编码的字符串str1
6.1如果大家在学习过程中,代码中包含中文,就需要在头部指定编码。
- python脚本加上 # -*- coding: UTF-8 -*- 后,在windows
终端下执行输出中文字符串出现乱码。解决方法需要先使用 decode(“utf-8”)
转换成unicode编码,然后使用 encode(“gbk”) 转换成 gbk 编码,才能在 windows
命令提示符下正常输出中文。
例如:
# -*- coding: UTF-8 -*-
s=”我是中文 “
print s.decode(“utf-8”).encode(“gbk”)
原因是 windows 命令提示符的显示编码为 gbk 编码。
解法2:
首先获取系统文件的编码方式,然后再print的地方编码成type的形式。
import sys
type=sys.getfilesystemencoding()
然后在输出乱码的数据的时候在后面加上.decode(‘utf-8’).encode(type)
比如输入ss乱码,就写成print ss.decode(‘utf-8’).encode(type)即可
- 打开文件路径包含中文名
方法1: inpath =
‘D:/work/yuanxx/在线导航/驾车导航/walk_log/20130619_172355.txt’
uipath = unicode(ipath , “utf8”)
然后用”uipath”经过编码后的路径去open()即可:
fin = open(uipath)
方法2:文件头加上这个#!/usr/bin/python #-*- coding:cp936 -*-
- python2中,list若包含中文
整体输出时是以十六进制输出的;即使python2中单独使用for来单独输出也不行,但是python3中是默认解决掉该问题的。
解法一:转为json字符串再输出
解法二:print(json.dumps(weather_list,encoding=”UTF-8”, ensure_ascii=False))
6.5如何处理Json文件包含unicode的16进制中文
str1 = ‘\u4f60\u597d’
print str1.decode(‘unicode_escape’)
#
’\u’开头就基本表明是跟unicode编码相关的,“\u”后的16进制字符串是相应汉字的utf-16编码。Python里decode()和encode()为我们提供了解码和编码的方法。其中decode(‘unicode_escape’)能将此种字符串解码为unicode字符串。
注意:decode括号里表示的是,我们想将unicode_escape解码成unicode编码
s = r’\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8’
s = s.decode(‘unicode_escape’)
print s
七.Python输出数据类型print type(变量名)
八.Python多线程
同时执行多个不同的程序,使用线程可以把占据长时间的程序中的任务放到后台,在一些等待的任务实现上如用户输入,文件读写,网络收发数据等,可以启用线程。线程可以被抢占,其他线程正在运行时,其余线程可以暂时搁置退让(如线程同步)。
如果多个线程共同对某个数据修改,会有问题,解决方法:线程同步。将那些每次只允许一个线程操作的数据,可将其操作放到aquire和release方法之间。举例如下:
每当一个线程比如“set”线程要访问数据时,必先获得锁定,如果有别的线程比如“print”获得锁定,则“set”线程暂时搁置,也就是同步阻塞。等“print”结束后,释放锁,“set”线程再继续执行。
九.Python爬虫
问题一:假设要爬取N个网站,判重的复杂度为:N*log(N),因为所有的网页都要遍历一次,每次判重都要很高的复杂度。解决方法:布隆过滤器。原理如下:使用固定的内存(不随url的数量增长而增长),,以O(1)的效率判断url是否在set中,但问题是,如果url不在set中,BF可以100%肯定这个url没见过。但如果url在set中,会告诉你该url在set中出现过,不过有2%不确定性。注意,这里的不确定性在分配内存足够大时,可以降低到很小。
问题二:一台机子太慢,集群抓取
将100台计算能力较小的计算机当作slave,另一台计算能力大的作为master,将url列表url_queue放到master上,所有机器可通过网络与master联通,每当一个slave完成一个网页的下载,就向master请求一个新的网页抓取,而每次slave转到一个新网页,就把该网页上的所有链接发到master上的url_queue中。同理,BF在master上运行,但现在master只发送确定没有被访问过的url给slave。BF放到master内存,而被访问过的url放到运行在master’的Redis里。
BeautifulSoup4是用来解析爬取到的html的。
findall(pattern,str,re.S):主力部队,把所有满足正则的内容提取出来,用于匹配满足某个条件的大量我们需要的内容。
search(pattern,str,re.S):狙击手,用来匹配第一个找到的元素,它的目标目的就是找到我们明显知道只有一个的元素比如标题什么的,一旦找到就结束,所以它的执行速度很快。re.S的意思是让”.”可以匹配换行符,不然有些标签头和尾是分几行的,就会匹配失败)。
Xpath它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。如果你提取信息就像让你找一栋建筑,那么正则就是告诉你建筑左边是什么,右边是什么,但是全国可能有很多都满足条件的,你找起来还是不方便。