python学习笔记
高阶函数:
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
r = map(function,Iterator) function:方法,Iterator:列表、元组等 map():把function作用于Iterator中的每个元素,并返回一个新的Iterator
list(r) r转化为list
vl = reduce(function,Iterator) ,有点像递归,返回最终的操作结果
>>> def add(x, y):
... return str(x) + str(y) x、y 第一次进来是1,2 后面x是前面一次计算的值,y是list中的下一个值,直到走完list中的每个值,方法执行完毕
...
>>> reduce(add, [1, 3, 5, 7, 9])
"13579"
filter()的作用是从一个序列中筛出符合条件的元素。由于filter()使用了惰性计算,所以只有在取filter()结果的时候,才会真正筛选并每次返回下一个筛出的元素。
list(filter(function,Iterator)) function: 过滤器,需返回True/False决定元素的去留 Iterator:列表、元组等 返回符合要求的元素
sorted() 排序
sorted(list,key=function, reverse=True) list:数组 key不能变,function为排序规则,reverse=True,反序/False,正序
一个函数可以返回一个具体值,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
返回的函数应定义在改函数内部
def f1():
def f2():
return va
return f2
该函数不会立即返回va, 会返回f2整个方法,等需要用f2返回的va时,才会具体去执行。-----称之为"闭包"
每次调用返回的都是一个新的方法,即使传入的参数是一样的
匿名函数:避免命名冲突
lambda表达式:
lambda x: x * x 冒号前面为参数,后面为计算表达式 返回值为表达式计算的结果 (只能有一个表达式)
装饰器:代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)???????????
偏函数:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
>>> import functools
>>> int2 = functools.partial(int, base=2)
IO编程:从内存中输出到硬盘、网络(Output)或者从硬盘网络输入到内存(Input)
同步IO:
异步IO:
CPU与硬件速度不匹配造成
文件读写:
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
f.read()
f.close()
open(文件路径及文件名和后缀,读/写("r:读/w:写文本/wb:写二进制"),encoding取读/写入文件用的编码--写入时会自动转换,errors='ignore'遇到无法识别的忽略)
文件不存在时会报IOError异常
操作完成后,必须关闭文件流
with open('/path/to/file', 'r') as f:
print(f.read())
with代替try fianlly,并且不用再次调用close()
read(size):size一次取读的文件大小,不设默认全部取读
readlines():一次取读一行
f.write(写入内容)
os,os.path:模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中。
os.name --获取操作系统类型
"posix" :Linux、Unix或Mac OS X
"nt" :Windows
os.uname() --获取操作系统类型详情(Windows下无此方法)
os.environ --获取系统中所有的环境变量
os.environ.get('key') --获取系统中某个环境变量的值
os.path.abspath('.') --查看当前目录的绝对路径
os.path.join('绝对路径', '新文件夹名称') 获取这个新文件夹的绝对路径 --主要处理不同操作系统的路径
os.mkdir("绝对路径") 创建文件夹
os.rmdir("绝对路径") 删除一个文件夹
os.path.split("文件绝对路径")--("文件的绝对路径,到文件夹","文件名称跟后缀") 一个元祖
os.path.splitext("文件绝对路径") --获取文件类型 ("文件绝对路径,到文件名","文件后缀")
序列化(pickling):
反序列化unpickling:
object写入文件时,需序列化
pickle.dumps(d):序列化一个对象(序列化为bytes)
pickle.dump(obj,文件IO) 直接把对象序列化后写入一个file-like Object
pickle.loads(文件IO) :反序列化文件
(dumps(d)返回值为标准的json字符串)
import json
json.dumps(d) 把对象序列化为json
json.dumps(s, default=lambda obj: obj.__dict__)) 直接把一个class序列化为json(class不能直接序列化为json,需用lambda,调用obj.__dict__转为dict)
错误处理:
try:
except:
finally:
Python错误也是class 都继承自BaseException
import logging
记录错误信息
调试:
1、print()
2、断言(assert)
3、logging ------王道
4、pdb
5、pdb.set_trace()
6、IDE
import logging
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)
logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
basicConfig()可接收参数
filename 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了
filemode 指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效
format 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。
datefmt 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
level 指定日志器的日志级别
stream 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发ValueError异常
style Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%'
handlers Python 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。
format可定义参数
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs %(msecs)d 日志事件发生事件的毫秒部分
levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname的文件名部分,包含文件后缀
module %(module)s filename的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
process %(process)d 进程ID
processName %(processName)s 进程名称,Python 3.1新增
thread %(thread)d 线程ID
threadName %(thread)s 线程名称
- 点赞
- 收藏
- 关注作者
评论(0)