day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块
本节大纲:
一:双层装饰器:
一个函数可以被多层装饰器进行装饰,函数渲染(编译)从下到上,函数执行从上到下。
如下程序:
#!/usr/bin/env python
#-*-coding:utf-8-*-
# author:liumeide # USERINOF={'islogin':True}
USERINOF={'user_type':'','islogin':True}
def login(func):
def inner_1(*args,**kwargs):
if USERINOF.get('islogin',None):
ret=func()
return ret
else:
print('login first!')
return inner_1
def check_user(func):
def inner(*args,**kwargs):
if USERINOF.get('islogin',None)==True and USERINOF.get('user_type',None)=='':
ret=func()
return ret
else:
print('permission deny!!')
return inner
@login
@check_user
def index():
print('index') index()
多层装饰器该如何理解呢?
上面的函数的可以执行顺序可以理解为:
首先:函数login、check_user、index加载到内存。在调用index函数的时候,执行index函数,因为index函数被check_user函数装饰,所以把check_user函数的内的inner函数体重新赋值给index,index函数体被当做
参数传入check_user函数。当满足inner函数的条件的时候被执行,新的函数index函数的函数体inner被login函数的所装饰,也就是说inner函数被重新赋值给inner_1函数。也就是说最后调用执行index()顺序:
先执行inner_1函数体----->在执行inner函数体-->在执行index原先的函数体。
多层装饰器以此类推,同样的原理。三层以上的装饰器很少使用。
二:字符串格式化:
%[(name)][flags][width].[precision]typecode
%号初始化字符串:
顺序传入参数。
执行名称传入参数
保留小数点后几位
当有占位符的时候 需要%%输出%如果没有占位符需要只写一个%在占位符的时候类似一个转义的意思。
1:
print('name:%s,age:%s'%('evil','')) name:evil,age:
普通字符串的初始化,需要传入的实参和占位符的个数保持一致。
(name):按名字进行取值。
2:可以根据占位的name的key,根据后面的字典对应的value进行传入来进行传入实参。
print("Name:%(name)s"%{'name':'ok'})
Name:ok
3: flags一般和width宽度来一起配合使用,如果单纯的使用flags并没什么效果。很少使用这个功能。
print("qqqq%(name)+s"%{'name':'ok'})
qqqqok
2个一起配合使用:+10表示右对齐,字符串ok占用10个字符。右对齐;正数前加正好,负数前加负号
print("qqqq%(name)+10s"%{'name':'ok'})
qqqq ok
-号表示左对齐。左对齐;正数前无符号,负数前加负号;
空格 右对齐;正数前加空格,负数前加负号; 0 右对齐;正数前无符号,负数前加负号;用0填充空白处;
.precision 可选,小数点后保留的位数
但是没有居中的功能。
print("qqqq%(name)-10sqqq"%{'name':'ok'})
qqqqok qqq
print("%+10d" % )
+
print("%-10d" %)
print("%04d" % )
print("%04d" % -)
-
print("% 4d" % )
print("%.2f" % 1.225)
1.23
typecode表示执行传入的字符串类型。有如下:
s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
o,将整数转换成 八 进制表示,并将其格式化到指定位置
x,将整数转换成十六进制表示,并将其格式化到指定位置
d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
F,同上
g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
%,当字符串中存在格式化标志时,需要用 %%表示一个百分号
但是没有将整数转换成二进制功能。
print('%%%d'%)
%
print('------%c-----%o-------%x'%(,,))
------A------------f
format函数初始化字符串:
[[fill]align][sign][#][0][width][,][.precision][type]
print('adad{0}adadada{0}dada{1}'.format(,))
adad1adadada1dada2
print('adad{name}adadada{age}'.format(name='OK',age=))
adadOKadadada22
居中功能并用a填充宽度为10.
print('adad{name:a^10s}adadada{age}'.format(name='OK',age=))
adadaaaaOKaaaaadadada22
左对齐<
print('adad{name:a<10s}adadada{age}'.format(name='OK',age=))
adadOKaaaaaaaaadadada22
右对齐>
print('adad{name:a>10s}adadada{age}'.format(name='OK',age=))
adadaaaaaaaaOKadadada22
转化百分比
print('this is {:%}'.format(0.2222))
this is 22.220000%
支持整数转化二进制输出:
print("---{0:d}----{0:b}---{0:o}--{1:%}".format(,0.2))
------------20.000000%
三:生成器和迭代器
具有生成一定条件数据的能力的对象叫做生成器。
具有取数据的能力叫做迭代器。
在进行处理大数据的时候,用生成器会降低内存的消耗,每一次取值生成一次,在下次取值的时候,内存会回收该值,避免了浪费内存。
其中filter函数和map函数返回的对象就是生成器。比如xrange函数返回的对象也是生成器。
a=[,,,]
f=filter(lambda a:a>,a) for i in f:
print(i)
print(f) <filter object at 0x004C5B50>
生成器本身由函数创造的,如何把普通的函数转成生成器呢?
如果函数体内包含关键字yield 时这个函数就是生成器。
def fun():
print()
yield 1
fun()
print(fun())
<generator object fun at 0x00584780>
在调用函数的fun()时候并不执行函数。只有去取这个对象的时候进行生成。
def fun():
yield
yield
yield
fun()
for i in fun():
print('__%s'%i)
print(fun())
__1
__2
__3
<generator object fun at 0x004E4780>
当for循环执行时,执行函数体。第一次的时候,去函数func找yield 对应的值1 赋值给i输出,第二次从第一次的位置下一个的yield的值为2取值并赋值给i,直到取到所有的yield的结束循环。每一次取值生成对应的对象。
上面的函数fun是生成器而生成的结果fun()是迭代器,也就说对象具有可以被迭代,在迭代时候执行next方法取值,只能从前往后取值, 练习:基于生成器生成range功能。
def myrange(args):
st=
while True:
if st >args:
return
yield st
st+=
ret=myrange()
for i in ret:
print(i)
四:函数递归。执行本身的函数体,当满足一定条件退出,并把最后执行的结果返回给上个函数,如果没有条件限制会无限执行下去。
def fun(x):
x+=
if x>:
return
return fun(x)
t=fun()
print(t)
执行3次fun(x)函数。循环执行多次相同的函数体。
练习:实现累乘功能,比如输入3 实现3*2*1
def fun(x):
if x==:
return
return x*fun(x-)
print(fun())
五:模块
分类:内置模块、第三方模块、自定义模块。在python中叫模块其他语言叫类库。
使用模块:先import 导入后使用。
存在方式:.py文件。或者一个文件夹里有多个.py文件组成的一个模块。
自定义模块导入:
目录之间用.表示
如果同一级不通模块导入相同的方法该如何区分呢???
1:通过相对路径来区分
aaarticlea/png;base64,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" alt="" />request模块调用上面的2个co模块。如果路径层级不多可以这么写 如果层级过多呢?调用次数过多呢?
import lib.co
import common.co
common.co.login()
lib.co.login()
common OK
lib OK
简单的方法 将导入的模块进行别名操作:
from lib import co as f1
from common import co as f2
f1.login()
f2.login()
lib OK
common OK
下面的方法是我们经常用的。
模块的意义:便于管理代码。不同的功能的代码进行归类。
模块导入的依据:
import sys
print(sys.path)
C:\python2\day6
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\python35.zip
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-
C:\Users\Administrator\AppData\Local\Programs\Python\Python35-\lib\site-packages
sys.path是一个路径的列表。默认python 有限搜索当前py文件的目录依次搜索。所以当我们自定义模块时候可以有2种方式让python 找到我们定义的模块:
1:把自定义模块加入这个列表(append())
2:把自定义的模块加入上面的目录之中。
这样在导入模块的时候不会出现:ImportError: No module named 'xxx'
那怎么找出自己模块所在目录呢?
import os
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__)))
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) C:\python2\day6\s2.py
C:\python2\day6
C:\python2
根据自己需求将自己的变量导入sys.path即可。
模块的名称:不要和系统的内置模块的名字冲突。
第三方模块:1:pip进行安装
2:源码进行安装。
安装第三方模块:requests
pip install requests
常用模块介绍:
json模块:
常用函数dums()、dum();loads()、load()
对于加s参数和不加s参数区别:
加s的是直接可以对python 的数据转换成json串(dums())或者直接将json串转换成python能识别的数据类型。而不加s的是将python的数据转换成json串并将json串写入文件中,或者将文件中的json串转换成python的基本数据。
data=[,,,,(1,2,True)]
obl=json.dumps(data)
with open('data.txt','w') as f1:
f1.write(obl)
<class 'str'> [, , , , [, , true]]
如果需要写入需要操作文件才能写入。
data=[,,,,(,,True)]
obl=json.dumps(data)
t_load=json.loads(obl,encoding='utf8')
print(type(t_load),t_load)
<class 'list'> [, , , , [1, 2, True]]
在将python基本数据类型进行json转换的时候,会将python的一些数据类型或者相应的值进行转换,比如上面的python的元组转换json时候变为列表。True变为 true。
转换表如下:
aaarticlea/png;base64,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" alt="" />
跨语言平台常用该模块。该模块可以将python的基本数据类型(列表、字典)转换成字符串----序列化。也可以将字符串形式的python 类型字符创转换成对应的数据类型(列表、字典)--反序列化。
import json
list_1=[,,,,]
# json.dump(list_1,open('json.txt','w'))
obj=json.load(open('json.txt','r'))
print(obj)
[, , , ]
pickle模块:可以将非python数据类型的数据进行序列化和反序列化。存储方式是二进制。所以要以wb或者rb进行相关的dums和loads
import pickle
a='aa'
pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))
pickle.dumps()将相应的数据类型转换成字节。如果不指定编码,python解释器会用默认编码进行处理。
import pickle
data=[,,,,(,,True)]
t=pickle.dumps(data)
print(t,type(t))
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x01K\x02\x88\x87q\x01e.' <class 'bytes'>
import pickle
a='aa'
# pickle.dump(bytes(a,encoding='utf-8'),open('pickle.txt','wb'))
t=pickle.load(open('pickle.txt','rb'))
s=str(t,encoding='utf-8')
print(s)
aa
import pickle
data=[,,,,(,,True)]
t=pickle.dumps(data)
t_load=pickle.loads(t)
print(t_load,type(t_load))
[, , , , (, , True)] <class 'list'>
在Django中会用到经常用到pickle模块。
requests模块:属于第三方模块需要进行手动安装(pip install requests)
进入python安装目录:E:\python3.6\Scripts
运行:pip.exe install request
import requests
import json
res=requests.get("http://wthrcdn.etouch.cn/weather_mini?city=北京")
res.encoding='utf-8'
print(type(res))
dict_1=json.loads(res.text)
print(dict_1)
time模块和datatime 模块
获取本地准确时间:
1 import time
2 print( time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))
3
4 2016-09-23 21:50:45
time模块:首先了解下
时间戳的概念:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
1:获取本地时间戳
import time,datetime
print(time.time())##获取本地的时间的时间戳。
1465714711.3878157
2:获取本地时间。
import time,datetime
print(time.ctime())
Sun Jun ::
3:获取本地时间的时间struct_time格式。
print(time.localtime())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
4:将时间戳转换成字符串时间
import time,datetime
print(time.ctime(time.time()))
Sun Jun ::
5:将时间戳转成struct_time
格式。time.mktime把struct_time格式的时间转换成时间戳。
print(time.mktime(time.gmtime()))
1465687430.0
struct_time格式是元组,可以进行相关取值。
这种获取的struct_time格式是hour不是本地地时间的hour,查时区的8小时。也就是说time.time()格林威治时间戳。换成time.localtime()
import time,datetime
print(time.gmtime(time.time()))
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=7, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
1 print(time.localtime())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=)
5:将struct_time格式转换成指定字符串时间格式
1 import time,datetime
2 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))
3 2016-06-12 07:14:47
注意:也就是说首先需要获取时间戳然后转换成struct_time格式然后转换成你想要的时间格式。
可以把指定的时间格式字符串转换成struct_time格式然后在转换成时间戳。
print(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S"))
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)
print(time.mktime(time.strptime('2016-06-12 07:14:47',"%Y-%m-%d %H:%M:%S")))
1465686887.0
datetime模块:
返回当前时间格式xx-xx-xx
print(datetime.datetime.today())
-- ::21.323805
可以用切割获取我们想要的格式:
1 TIME=datetime.datetime.today()
2 TIME_INT=str(TIME).split('.')[0]
3 print(TIME_INT)
4 2016-06-12 16:40:00
将时间戳转换成时间字符串
print(datetime.datetime.fromtimestamp(time.time()))
-- ::05.047899
输出当前时间:
print(datetime.datetime.now())
-- ::07.611796
也可以将时间格式的转换成字符换进行进行切割出大约的时间(因为毫秒去掉)
将时间戳转换成struct_time格式 如下输出不存在时区问题。
TIME=datetime.datetime.now()
print(TIME.timetuple())
time.struct_time(tm_year=, tm_mon=, tm_mday=, tm_hour=, tm_min=, tm_sec=, tm_wday=, tm_yday=, tm_isdst=-)
将字符串转化成日期格式。
str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
-- ::
时间的加减:
new_date = datetime.datetime.now() + datetime.timedelta(days=10)##比现在时间加10天。
print(new_date)
2016-06-22 17:29:11.435878
new_date = datetime.datetime.now() + datetime.timedelta(days=-10)## 比现在减10天。
print(new_date)
2016-06-02 17:30:33.124046
new_date = datetime.datetime.now() + datetime.timedelta(hours=-10)#比现在减10小时。
print(new_date)
new_date = datetime.datetime.now() + datetime.timedelta(seconds=120)#比现在加120秒。
print(new_date)
2016-06-12 17:36:07.311463
模块:logging
首先创建logging实例。然后创建handler,分两种 一种输出到文件中 Filehandler,一种输出到终端的Streamhandler.分别为这两种handler指定输出格式setformatter
然后将这2种handler添加(add)到logging实例中。该实例就有输出到文件和终端的日志信息的属性。
实际例子:
import logging
def logsystem(x):
log=logging.getLogger("mylog")##定义一个logging的实例log
log.setLevel(logging.INFO) #设置全局日志级别,如果handler的日志级别低于INFO,不会输出日志信息。 fl=logging.FileHandler(x,encoding='utf-8')##设置一个文件输出的Filehandler.可以指定输出文件的编码,写入方式默认a追加,可以指定。
fl.setLevel(logging.ERROR)#设置输出级别ERROR con=logging.StreamHandler()#设置终端Streamhandler.
con.setLevel(logging.INFO)#设置输出日志信息级别。 Formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))#设置输出日志格式。主要asctime是输出时间。name是上面logging实例名字"mylog"。message是在调用的时候输入的日志信息。
fl.setFormatter(Formate)#分别给各个handler设置日志格式。
con.setFormatter(Formate) log.addHandler(fl)#给logging实例log添加handler属性。
log.addHandler(con)
return log#该函数的返回值是logging实例。
1: logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和log实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。
只要知道name,就能得到 同一个logger实例
2:Log.setLevel(lvl)
设置logger的level, level有以下几个级别:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出
log.debug("foobar") # 不输出
log.info("foobar") # 输出
log.warning("foobar") # 输出
log.error("foobar") # 输出
log.critical("foobar") # 输出
3:Log.addHandler(hdlr)
log可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。
logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler, 设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情
使用basicConfig来配置root logger的输出格式和level:
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
完整的例子:
class Logger:
'''
功能:该类主要是日志实例的创建。
:param:filename:文件名字。
:param:logger:创建日志实例的名字。注意这个是变量。而且必须要有的变量。否则日志文件内容会乱。
:return:Log返回一个创建的log的实例。
'''
def __init__(self,filename,logger):
self.filename=filename
self.logger=logger
def log_in(self):
Log=logging.getLogger(self.logger)
Log.setLevel(logging.INFO)
f1=logging.FileHandler(os.path.join(LOG_DIR,self.filename),encoding='utf-8')
f1.setLevel(logging.INFO)
formate=logging.Formatter(('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
f1.setFormatter(formate)
Log.addHandler(f1)
return Log
day5--<装饰器、模块、字符串格式化、生成器、迭代器>logging模块的更多相关文章
- python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...
- Day5 双层装饰器、字符串格式化、生成器、迭代器、递归
双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} de ...
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...
- python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象
## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
- 学习PYTHON之路, DAY 5 - PYTHON 基础 5 (装饰器,字符格式化,递归,迭代器,生成器)
---恢复内容开始--- 一 装饰器 1 单层装饰器 def outer(func): def inner(): print('long') func() print('after') return ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python函数与模块(装饰器,文件处理,迭代器等)
os模块 os.system('命令') 利用python调用系统命令,命令可以是以列表或者元组内的元素形式* res import os res=os.system('ipconfig') prin ...
- Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)
全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None ...
- 生成器&迭代器,模块
列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...
随机推荐
- c++实现螺旋矩阵分析总结
螺旋矩阵,是这么一个东西: 1 2 3 8 9 4 7 6 5 这是一个,n*n的矩阵,由外向里一次递增,一环一环,就好像一个螺旋一样.不难想象,如果n=5,那么应该是这样的: ...
- mysql 通过IP连接
解决方法如下: 编辑my.ini 在[mysqld]节点下新增或修改如下两行行 skip-name-resolve #忽略主机名的方式访问 lower_case_table_names= #忽略数据库 ...
- 获取ip
需要引用System.Web http://stackoverflow.com/questions/4879837/smart-way-to-get-the-public-internet-ip-ad ...
- C语言位操作(转)
http://www.cnblogs.com/cpoint/category/524132.html
- js获取url中的参数值
在博客园看家一片不错的文章:http://www.cnblogs.com/EnderH/p/5398409.html 在这里记下对自己比较有用的三种: 1.正则 function GetQuerySt ...
- IE浏览器bug罪魁祸首--hasLayout
IE浏览器一直都是前端程序员最头疼的,IE的表现与其他浏览器不同的原因之一就是,显示引擎使用一个称为布局(layout)的内部概念. 认识hasLayout--haslayout是Windows In ...
- 学习mongo系列(十一)关系
准备工作:首先在maxh数据库的address集合中先插入数据 > db.address.insert({child_address:"gansu"}) WriteResul ...
- (六)makefile编程
最简单的makefile: all: gcc server.c -o ser gcc client.c -o cli clear: rm ser cli *.o -rf #rm -rf表示删除文件 ...
- 【更新】【封装必备】封装辅助 - 清理&优化工具 For Win7(IT天空会员专版)
https://www.itsk.com/thread-353560-1-4.html nqawen 发表于 2015-7-9 17:26:37 本帖最后由 Amz 于 2015-11-25 10 ...
- C++类的交叉引用
对于C++中,两个类中相互引用对方,当然只能是在指针的基础上,于是我们知道.也就是说在A类的有一个指针引用B类的成员函数或成员对象,而B类中又有一个指针来访问A中的成员函数或对象.这就是C++中类的交 ...