python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5
1、模块3
time,datetime, json,pickle
2、双层装饰器
3、字符串格式化
4、生成器
5、递归
6、模块倒入
7、第三方模块倒入
8、序列化反序列化
9、日志处理
1、模块
1、time
time:
time.time()
1465120729.18217 1987.1.1 0:0分 开始以秒计时 time.ctime()
Mon Jun 6 22:56:53 2016 当前系统时间
time.ctime(time.time()-86400)
Sun Jun 5 22:58:27 2016 | Mon Jun 6 22:58:27 2016 ctime模块支持传入参数,传入一个减去一天的秒数,获得的就是昨天的日期时间
time.gmtime(time.time()-86640) gmtime 得到的是utc时间
time.struct_time(tm_year=2016, tm_mon=6, tm_mday=5, tm_hour=14, tm_min=56, tm_sec=53, tm_wday=6, tm_yday=157, tm_isdst=0)
#将时间戳转换为struct 模式 ,也支持传值 #作用是可以拿到里面每一个值
time_obj = time.gmtime()
print(time.obj.tm_mon,tome.obj.tm_yday)
6 157
time.localtime(time.time()-86400) #这个得到的 是本地时间,也可以加方法
#得到的也是一个 struct 对象
time.struct_time(tm_year=2016, tm_mon=6, tm_mday=6, tm_hour=23, tm_min=11, tm_sec=41, tm_wday=0, tm_yday=158, tm_isdst=0) time.mktime(time.localtime()) #将struct_time 模块转变成时间戳
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()/time.gmtime) #将struct 转换成自定义格式
time.strptime("2016-01-28","%Y-%m-%d") #将2016-01-28 转换成 struct模式
time.struct_time(tm_year=2016, tm_mon=1, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=28, tm_isdst=-1)
time.strptime("2016-01-28 15:06","%Y-%m-%d %H:%M")
time.struct_time(tm_year=2016, tm_mon=1, tm_mday=28, tm_hour=23, tm_min=36, tm_sec=0, tm_wday=3, tm_yday=28, tm_isdst=-1)
需求:将字符串格式的时间转换成时间戳:
2015-06-06 05:23:40 转为1348129312.12 这种时间戳
a = time.strptime("2016-06-06 23:47:60","%Y-%m-%d %H:%M:%S")
b = time.mktime(a)
· 1465228080.0
time.sleep(4) #使程序睡眠4秒钟,可使用程序的阻塞 datetime: datetime.date.today() #显示当前的日期
2016-06-07
datetime.date.fromtimestamp(time.time()-864400) #将时间戳转换成日期格式,并且可以再time的时间戳出进行计算
2016-05-28
current_time = datetime.datetime.now() #返回当前时间以
print(current_time)
2016-06-20 13:30:25.719642
print(current_time.timetuple()) #将当前时间转换为struct_time 格式
time.struct_time(tm_year=2016, tm_mon=6, tm_mday=20, tm_hour=13, tm_min=31, tm_sec=52, tm_wday=0, tm_yday=172, tm_isdst=-1)
str_to_date = datetime.datetime.strptime("20/06/16 16:30","%d/%m/%y %H:%M") #将字符串转换成日期格式
print(str_to_date)
2016-06-20 16:30:00 时间的加减
new_date = datetime.timedelta(days=10)
print(new_date)
10 days, 0:00:00
new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在的时间多10天
print(new_date)
2016-06-21 15:00:17.295504
new_date = datetime.datetime.now() + datetime.timedelta(hours=1) #比现在多一小时
print(new_date)
2016-06-20 16:00:17.295504
new_date = datetime.datetime.now() + datetime.timedelta(seconds=1) #比现在多一120s
print(new_date)
2016-06-20 16:00:17.295504
new_date = datetime.datetime.now()
a = new_date.replace(year=2016,month=9, day=22) + datetime.timedelta(days=20) #把当前你时间datetime.datetime.now() 替换成 2016-9-22日,然后在往后加20天
print(a)
2016-10-12 14:34:46.644348
time模块常用取时间戳,datetime取日期
2、json
特点:支持python基本数据类型,list dict tuple set str int float True Fales
可以再跨语言,跨平台进行数据的传输交互
json.dumps #将python的基本类型转换成字符串 import json li = [12,33,22]
r = json.dumps(li)
print(r,type(r))
[12, 33, 22] <class 'str'>
json.loads #将字符串形式的列表反序列化成为python的基本数据类型 反序列化时 [] 里面要用 “” 双引号,这样在跨语言传输时才不会出错 r_li = json.loads(r)
print(r_li,type(r_li))
[12, 33, 22] <class 'list'> json.dump #将字符串进行序列化后再存入文件
li = [12,33,22]
json.dump(li,open("json.db","w")) json.load #读取文件中序列化
r = json.load(open("json.db",'r'))
print(r)
[12, 33, 22]
3、pickle
特点,pickle序列化只能python自己使用,但是pickle可以支持任何数据类型
可以对python所有类型做操作,比如可以存储类,函数
在python版本不同可能pickle反序列化失败
import pickle
pickle.dumps #将字符串序列化后存入内存 li = [11,22,33] r = pickle.dumps(li)
print(r)
b'\x80\x03]q\x00(K\x0bK\x16K!e.'
pickle.loads #读取序列化后的内容
a = pickle.loads(r)
print(a)
[11, 22, 33] #就是原来的列表
pickle.dump #系列化后存入文件
li = [11,22,33]
pickle.dump(li,open("db","wb"))
pickle.load #读取文件中的序列化字符串
a = pickle.load(open("db","rb"))
print(a)
[11, 22, 33]
4、requests
获取页面信息的
r = requests.get("http://wthrcdn.etouch.cn/weather_mini?city=北京")
r.encoding = "utf-8"
print(r.text)
拿到的r.text 就是json字符串格式
就可以对json后的dict进行处理了。
2、双层装饰器
更牛逼的装饰器
http://www.cnblogs.com/wupeiqi/articles/4980620.html
3、字符串格式化
format & %
特点:占位符填充任何字符,%,可以居中,#可以显示出来二进制 十进制的标志位
1、 s2 = "------{name:*^30,d}========".format(name=12344321)
-----**********12,344,321**********========
2、 s2 = "------{test:#b}========".format(test=123) #将10进制转换成2进制 #就是在二进制数字前面加上0b标志
------0b========
3、s2 = "------{test:.2%}========".format(test=0.123)
------12.30%========
填充:只能用一个字符填充
^:内容靠中间对其
<:内容左对齐
>:内容右对齐
=:内容右对齐,将符号放置在填充字符的左侧,且只能对数字类型有效。即:符号+填充物+数字
sign:有无符号
+:正好加正,符号加负
—:正好不变,符号加负
空格,正好空格,负号加负
#:对于二进制,八进制,十六进制 如果加上#,会显示 0b/0o/0x,否则不显示
,: 位数字添加分隔符
.precison : 小数保留精度
type 格式化类型
format支持直接传入一个列表
a = ["han",123]
s2 = "my name is {} my age is {} ".format(*a)
my name is han my age is 123
a = ["han","shi"]
b = ["28",""]
s2 = "my name is {0[]} my age is {1[]} ".format(a,b) my name is shi my age is 31
format还支持传入一个字典
c={"name":"han","age":123}
s2 = "my name is {name} my age is {age} ".format(**c)
my name is han my age is 123
4、生成器
li = [11,22,33,44]
result = filter(lambda x : x>22,li)
result 的结果再2.7中直接是一个列表,但是在3.0中是一个可迭代的对象
还有
range(10) 直接生成 [0,1,2,3,4,5,6,7,8,9]
a = xrange(10) a 是一个课得迭代对象
上面两个例子有什么区别?
直接生成所有数字的会占用大量内存,但是生成一个可迭代对象的占用的很小,在你需要他的时候去循环遍历它就可以了
生成器是使用函数创造的
普通函数:
def fun():
return 123
ret = func()
具有生成能力的函数
def func():
print("start")
yield 1
yield 2
yield3
func() 此时却不执行
此时func是一个对象
a = func()
print(a,type(a))
<generator object f1 at 0x000000DF258F1A40> <class 'generator'>
是一个生成器对象
for i in a:
print(i)
start
1
2
3
过程:在for的时候每次都会进入这个函数里面去取yiled后面的值,并且赋值给for的参数,下次循环再到函数中找到上次的位置向下再找一个yield。
r1 = a.__next__() ,进入函数中找到yield,获取yield后面的数据 ,并且出来
print(r1)
def f1():
print(111)
yield 1
print(222)
yield 2
print(333)
yield 3
a = f1()
a1 = a.__next__()
print(a1)
a2 = a.__next__()
print(a2)
a3 = a.__next__()
print(a3) 111
1
222
2
333
3
#每次__next__时都会去f1函数中执行里面的操作,并去找yield后面的值,一旦遇到yield就会取到后面的值退出,
yield __next__ 生成器原理
9、日志处理:
import logging
logging.warning("user[xxx]attempted wrong password more than 3 time")
logging.critical("server is down")
这样就把 warning 和 critical中的信息输出到了屏幕上
WARNING:root:user[xxx]attempted wrong password more than 3 time
CRITICAL:root:server is down
但是info debug都不能输出
默认是用管理员权限输出的日志
日志级别:
DEBUG
INFO
WARNING
ERROR
CRITICAL 如果想把日志输出到文件中
import logging
logging.basicConfig(filename='test.log',level=logging.INFO)
注册日志的格式,等级,日志名称(也可以设置时间,一会再说) logging.debug("debuy")
logging.info("info")
logging.warning("wraning")
这样输出的日志的等级就要在info以上,所以此时的debug不会输出
此时日志输入没有日期。
怎么加日期哪??
logging.basicConfig(filename='test.log',level=logging.INFO,format='%(asctime)s %(name)s %(message)s',datefmt='%m-%d-%Y %I:%M:%S %p')
#这样就把更多的信息注册到了basicconfig中了
#filename = 定义日志输出到日志中,如果没有这个就会把日志输出到屏幕上。
level = 设置日志输出的等级
format = 设置日志输出内容的格式 asctime 时间的占位符 name用户名的占位符 message 信息的占位符
datefmt = format中asctime时间输入的格式 %H:24小时制 %I:8小时制 logging.debug("==debuy==")
logging.info("==info==")
logging.warning("==wraning==")
06-11-2016 10:39:31 AM root ==info==
06-11-2016 10:39:31 AM root ==wraning==
format中的参数:
%(name)s Name of the logger (logging channel)
%(levelno)s Numeric logging level for the message (DEBUG, INFO,
WARNING, ERROR, CRITICAL)
%(levelname)s Text logging level for the message ("DEBUG", "INFO",
"WARNING", "ERROR", "CRITICAL")
%(pathname)s Full pathname of the source file where the logging
call was issued (if available)
%(filename)s Filename portion of pathname
%(module)s Module (name portion of filename)
%(lineno)d Source line number where the logging call was issued
(if available)
%(funcName)s Function name
%(created)f Time when the LogRecord was created (time.time()
return value)
%(asctime)s Textual time when the LogRecord was created
%(msecs)d Millisecond portion of the creation time
%(relativeCreated)d Time in milliseconds when the LogRecord was created,
relative to the time the logging module was loaded
(typically at application startup time)
%(thread)d Thread ID (if available)
%(threadName)s Thread name (if available)
%(process)d Process ID (if available)
%(message)s The result of record.getMessage(), computed just as
the record is emitted
混合模式,既输出到屏幕上,又放到文件中
log模块中包含了:loggers , handlers,filters,formatters
loggers,是应用程序直接调用的
handlers:把日志发送到不同的地方
filters:过滤 提供了一些日志过滤的功能(日志中包括了什么特殊字符,就把日志输出出来)
formatters: 格式化输出
import logging #create logger logger = logging.getLogger('TEST-LOG')
#指定谁发的日志,默认是root的位置
#先获取到logger对象 logger.setLevel(logging.DEBUG)
#设置全局的日志级别 # create console handler and set level to debug
#把设置好的等级和位置就可以注册给后面的 handler 了
ch = logging.StreamHandler()
#StreamHandler把日志打印到屏幕,如果想往屏幕输出,
ch.setLevel(logging.DEBUG)
#设置往屏幕输入时候的级别 # create file handler and set level to warning
#往文件中输出
fh = logging.FileHandler("access.log",encoding="utf-8")
fh.setLevel(logging.WARNING)
#设置往文件中输出的等级
# create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#设置输出的格式 # add formatter to ch and fh
#定义往屏幕输出的格式
ch.setFormatter(formatter)
#定义往问价你输出的格式
fh.setFormatter(formatter) # add ch and fh to logger logger.addHandler(ch)
#将往屏幕输出的格式赋值给logger logger.addHandler(fh)
#将往文件输出的格式赋值给logger # 'application' code logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message') 全局日志级别和局部日志级别这两个级别以全局日志为底线,局部的日志日志级别不能低于全局。
python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理的更多相关文章
- python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
- python- 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fa ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
- 模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器
一.python模块(导入,内置,自定义,开源) 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python ...
- Day5 双层装饰器、字符串格式化、生成器、迭代器、递归
双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} de ...
- Python装饰器、迭代器&生成器、re正则表达式、字符串格式化
Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法
python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...
- Python学习基础(三)——装饰器,列表生成器,斐波那契数列
装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...
随机推荐
- oracle 序列 ,check约束
====================序列 //查询当前用户序列 select * from user_sequences //查询所有序列 select * from all_sequences; ...
- 获取url中的参数\+发送ajax请求根路径|+获取复选框的值
//获取url中的参数function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=( ...
- Notepad++编辑Pyhton文件的自动缩进的问题(图文)
转自:http://www.xuebuyuan.com/1102224.html 这个问题一直困扰我很久,Python对缩进很敏感,一般建议缩进用空格,而 Notepad++的自动缩进是用的TAB,g ...
- sql回滚
rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollback,建议你还是想别的办法吧,事务语句如下(sqlserver的给你借鉴):--开启事务begin tran --执 ...
- iOS 处理多个网络请求的并发的情况
如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...
- Linux批量修改用户密码
对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用passwd user这样的命名来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect这样的 ...
- iOS:UITableView 方法 属性
参考:https://developer.apple.com/library/iOS/documentation/UIKit/Reference/UITableView_Class/Reference ...
- AtomicInteger类保证线程安全的用法
J2SE 5.0提供了一组atomic class来帮助我们简化同步处理.基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增.减.赋值(更新)操作 ...
- ACM题目————中缀表达式转后缀
题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...
- poj3263 Tallest Cow
题意略去. 考虑给定的R对pair(A, B). 即A能看见B,这意味着B不比A低,并且区间内部的所有元素的高度严格小于A的高度. 我们规定区间的方向:若A > B,为反方向,反之称为正方向. ...