Python 基础 二

3. 装饰器(decorator):
定义:本质是函数(装饰其他函数)就是为其他函数添加功能
原则: 1. 不能修改被装饰的函数的源代码
2. 不能修改被装饰的函数的调用方式
实现装饰器的只是储备:
1. 函数即“变量”
2. 高阶函数
a. 把一个函数名当做实参传给另一个函数(不修改被装饰函数源代码前天下增加功能)
b. 返回值中包含函数名(不修改函数的调用方式)
3. 嵌套函数
函数嵌套是指在一个函数体内用 def 声明另一个函数,此函数是一个局部变量
高阶函数+嵌套函数 =》 装饰器
# 语法糖(即装饰器):
@ 函数名

# 语法糖可以嵌套多层,每次嵌套可以增加新的功能

10. 生成器(generator):
# 列表生成式:[i*2 for i in range(10)]
相当于:a = []
for i in range(10):
a.append(i*2)
# 生成器:(i*2 for i in range(10))
# 列表与生成器的区别:
列表会提前准备好数据
生成器只有调用时才生成相应的数据,生成器不支持切片,小标,截断等动作
#生成器调用:
a.__next__()
*生成器只记录当前位置
* 只有__next__()方法

# 函数生成器:
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b
a,b = b,a+b
n = n + 10
return 'done'

# 生成器用于 并行 处理

12. 迭代器
* 可用于 for 循环 的对象统称可迭代对象:Iterable
* 可以被 next() 函数调用并不断返回下一个值的对称为迭代器: Iteraor
* 迭代器的对象表示的是一个数据流
* 通过 iter() 方法可以把,列表、字典、字符串等变成一个迭代器

13. 内置函数
源文档链接:https://docs.python.org/3/library/unctions.html?highlight=built#all
abs() 取绝对值
all() 可迭代对象里有0就是False,否则就是True
any() 可迭代对象里有一个真就返回 True,[]返回False
ascii() 把对象变成字符串
bin() 把一个10进制整数变成2进制
bool() 判断真假,0表示False,1表示True。空字典,空列表都返回Fals
bytearray() 变成可修改的二进制
callable() 判断是否可以调用,后面可加()的均为可调用对象
char() 输入一个整数参数,返回ascii码表数字对应的字符
ord() 输入一个字符参数,返回ascii码字符对应的数值
classmethod() 类方法
compile() 可以把代码以字符串形式保存变量中,然后用compile()编译后exec执行
complex() 复数
delattr()
dict() 调用dict()可直接生成一个默认字典
dir() 用dir(dict())查看dict()的所有方法
divmod() 返回商和余数
enumerate() 把一个可迭代对象的元素和编号都迭代出来
eval() 把字符串变成字典或列表等对于格式
exec()
filter() 一组数据中过滤出你想要的数据
例: res = filter(lambda n:n>5,range(10))
for i in res:
print(i)
map() 对后面参数的传入值按 lambda 的表达式处理后返回新的值
例: res = map(lambda n:n*n,range(10))
res = list(res) # 仅python3.0这样写,python2.7直接出结果,不需要通过 list()调用
for i in res:
print(i)
*reduce() 2.7里是内置函数,3.0里需要import functools后才能调用
例: import functools
res = functools.reduce(lambda x,y:x+y,range(10))
print(res)
*** filter(),map(),reduce() 在 2.7里面可以直接打印结果,在python3 里面要使用 list() 调用结果
扩展阅读 :http://www.zhuangling.com/python-filter-map-reduce-lambda.html
# filter(),map(),reduce() 扩展阅读 :https://www.cnblogs.com/apple2016/p/5657698.html
float()
format()
frozenset() 生成一个不可变的集合
getattr()
globals() 以 key:value 形式返回当前程序的变量
hash() 散列,把字符串变成hash值
help()
hex() 把一个数字转换成 16 进制
id() 返回变量内存地址
int() 转换成整型变量
isinstance()
issubclass()
iter() 迭代器
len() 计算长度
list() 转换成列表
locals() 在函数内部使用,返回内部变量
max() 返回列表里面的最大值
min() 返回列表里面的最小值
memoryview()
next() 相当于迭代器里面的 __next__ 方法
oct() 转成8进制
open() 获得文件句柄
pow() 返回一个数的幂
range() 生成一个数字序列的迭代器
repr() 用字符串表示一个对象
reversed() 反转列表序列
round() 保留2位小数
set() 转成集合
setattr()
slice() 列表切片
sorted() 排序:
例: a = {6:2,8:0,1:4,-5:6,99:11,4:22}
print(sorted(a.items())) # 输出一个列表,按key排序
print(sorted(a.items(),key=lambda x:x[1])) # 输出一个列表,按value排序
staticmethod()
str() 变成字符串
sum() 把一个可迭代对象求和
super()
tuple()
type() 所有python的数据结构都是其产生
var() 返回对象的所有属性名
zip()
例: a = [1,2,3,4]
b = ['a','b','c','d']
for i in zip (a,b):
print(i)
_import_()
例: _import_ 'decorator' 等于 import decorator

15. 软件目录开发规范
print(_file_) 返回当前程序的相对路径
print(os.path.abdpath(_file_)) 返回当前程序的绝对路径
BASE_DIR = os.path.dirname(os.path.abdpath(_file_)) 返回当前程序的绝对路径去掉最后的目录或文件
sys.path.append(BASE_DIR) 把路径添加到环境变量里面去

16. 时间模块
improt time # time 模块
print(time.clock()) # 返回处理器时间,3.3开始废弃,time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来
print(time.alticne) # 返回utc(格林威治)时间等,以秒计算
print(time.asctime()) #
print(time.altzone/3600)
print(time.localtime()) # 返回本地时间 print(time.localtime()+3600*3)#往后移3小时
print(t.tm_year,t.tm_yday) #
print(time.time()) # 返回时间戳
print(time.gmtime()) # utc time
print(time.asctime(time.locatime())) # 返回时间格式"Fri Aug 19 11:14:16 2016"
# 将表示时间的字符串转换成时间戳
t2 = time.strptime("2016-11-11 23:30","%Y-%m-%d %H:%M") # 把字符串转化成时间对象
print(time.mktime(t2)) # 把时间对象转换成时间戳,之后可以做加减运算
# 将时间戳转换成字符串
t_stamp = time.mktime(t2)
t3 = time.localtime(t2_stamp)
t3_str = time.strftime("%Y_%m_%d_%H_%M.log",t3)
print(t3_str)
improt datetime # datatime 模块
print(datetime.datetime.now()) # 返回 2016-08-19 12:47:03.941925
print(datetime.datetime.now()+datatime.timedelta(days=3)) # 返回 2016-08-16 12:47:03.941925
now = datetime.datetime.now()
print(now.replace(month=1,day=1)) # 返回 2016-01-01 12:47:03.941925

22 random 模块讲解
print(random.random()) # 打印一个随机小数
print(random.randint(1,5)) # 打印1-5之间的数,包含5
print(random.randrange(1,5)) # 打印1-5之间的数,但不包含5
print(random.sample(range(100),2) # 在range(100)里面随机打印包含2个元素的列表,可用于生成一个随机验证码

# string 模块
import string
print(string.ascii_letters+string.digites) # 所有ascii码英文字符和数字

23 shutil 模块
shutil.copyfileobj(f1,f2) # copy一个文件,需要先打开一个源文件 f1 = open("1.txt") 目标文件 f2 = open("1.txt","w")
shutil.copy(r"c:\123.txt","test") # copy 文件和权限。 把c:\123.txt文件 copy 到 test目录下
shutil.copymode() # 在 linux 上复制权限,内容,组,用户均不变
shutil.copy2() # copy文件和状态信息
shutil.copytree() # copy 一个目录和目录下的文件(递归copy文件)
shutil.rmtree() # copy 递归去删除文件
shutil.move() # 递归移动文件
shutil.make_archive() # python下的压缩打包工具
import zipfile tarfile # python 调用 zipfile tarfile 模块来操实现zip 和 tar 的打包和解包
例:压缩
zip_obj = zipfile.zipFile(r"c:\zip_test.zip","w") #
zip_obj.write("test")
zip_obj.write(r"c:users\administrator")
zip_obj.close()
解压缩
z = zipfile.Zipfile("laxi.zip","r")
z.extractall()
z.close()
* 扩展阅读:
www.cnblogs.com/wupeiqi/articles/4963027.html

24 json and pickle 序列化
# json
import json
json.dumps() # 把python数据结构转换成 字符串,用于保存至文件
json.loads() # 把字符串数据转换成python数据结构,用于读取文件
* json 只能处理字典、列表等简单的数据类型
# pickle
import pickle
例:# 序列化
info = {"a":1,"b":2,"c":3}
f = open("test.txt","rb")
pickle.dump(info,f) # 相当于 f.write(pickle.dump(info))
f.close
# 反向序列化操作
data = pickle.load(f) # 相当于 pickle.loads(f.read())
* pickle 能处理所有python数据类型
* pickle 默认使用 二进制 形式保存文件
* pickle 只能在 python 环境下使用,其他语言例如 java 不能使用
* 不管 json 和 pickle,同一个文件 dump 一次 只能 load 一次

25 shelve模块讲解
持续序列化

26 xml处理模块讲解
例:
import xml.etree.ElmentTree as ET
tree = ET.parse("test.xml") # 打开 xml 文件
root = tree.getroot() # 获取根节点
print(root.tag) # 打印根节点标签

# 遍历 xml 文档
for child in root:
print(child.tag,child.attrib)
for i in child:
print(i.tag,i.text)

27 configparser模块讲解
# 生成
# 读取
# 修改
* 扩展阅读:
https://www.cnblogs.com/alex3714/articles/5161349.html

28 hashlib模块讲解
例:
hash = hashlib.md5()
hash.update(b"admin") # 对 "admin" 字符串做 md5(3.0里只能对 byte做 md5)
print(hash.hexdigest()) # 打印16进制格式
例:
import hmac
h_obj = hmac.new(b"salt",b"hello") # 网络的消息加密传输
print(h_obj.hexdigest())

subprocess 模块

29 logging 模块

30 re正则模块讲解
re.match() # 从头开始匹配,找到第一个匹配的就返回
例:# match
a = re.match("\w+","intet address:192.168.12.55 broadcoast:192.168.12.255")\
a.group()
re.search() # 在整段中匹配,找到第一个匹配的就返回
re.findall() # 在整段中匹配,把所有匹配的都返回
re.split() # 以匹配的表达式为分割符
re.sub() # 匹配字符并替换

re.I # 忽略大小写
M # 匹配多行
S #

'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c


'\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'

'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

# 扩展阅读:
https://www.cnblogs.com/wupeiqi/articles/4963027.html
https://www.cnblogs.com/whatisfantasy/p/6014523.html
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000

posted on 2017-03-22 13:38  beetalker  阅读(203)  评论(0)    收藏  举报