日志
一种可以追踪某些软件运行时所发生事件的方法
可调用日志记录相关的方法来表明发生了某些事情。
日志的作用:
程序调试
了解软件程序运行情况是否正常
软件程序运行故障分析与问题定位
日志等级:通过配置文件指定
Logging模块:
logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。
日志等级(level) | 描述 |
DEBUG | 最详细的日志信息,典型应用场景是问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
#日志
import logging
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(user)s[%(ip)s] - %(message)s"
DATE_FORMAT = "%m/%d/%Y%H:%M:%S %p"
logging.basicConfig(format=LOG_FORMAT, datefmt=DATE_FORMAT)
def test():
try:
a=int(input('请输入一个被除数:'))
b=int(input('请输入一个除数:'))
print(a/b)
return
except(ValueError):
#处理异常
logging.debug('只能输入数字:')
except ZeroDivisionError:
logging.info('除数不能为0')
else:
print('else............')
finally:
print('程序结束')
test()
推导式
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。列表推导式:案例
#推导式:[] #列表、字典、集合 ''' #整除3的列表 numbers=[] for x in range(100): if x%3==0: numbers.append(x) ''' #推导式实现 #列表推导式 numbers=[x for x in range(100) if x%3==0] print(numbers) #2、 def squared(x): return x*x multiples=[squared(i) for i in range(30) if i%3==0] print(multiples)
squares=[] for x in range(10): squares.append(x**2) #使用推导式实现 squares=[x**2 for x in range(10)] #将单词长度大于3的转为大写输出 names=['bob','tom','alice','jerry','wendy','smith'] s=[name.upper() for name in names if len(name)>3] print(s) #求(x,y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表 #嵌套 t=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1] print(t) #求m中斜线1,5,9组成的列表 m=[[1,2,3], [4,5,6], [7,8,9]] k=[m[i][i] for i in range(len(m))] print(k) #求m,n中矩阵和元素的乘积 m=[[1,2,3],[4,5,6],[7,8,9]] n=[[2,2,2],[3,3,3],[4,4,4]] v=[m[i][j]*n[i][j] for i in range(len(m)) for j in range(len(n)) ] #外面循环一次,里面循环三次 v2=[[m[i][j]*n[i][j] for i in range(len(m))] for j in range(len(n))] print(v) print(v2)
字典推导式
字典推导和列表推导的使用方法是类似的,只不中括号该改成大括号
#字典推导式 mcase ={'a':20,'b':30} mcase_frequency={v:k for k,v in mcase.items()} print(mcase_frequency)
集合推导式
跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
#集合推导式 #set集合去重 squared={x**2 for x in [1,1,2]} print(squared) #用集合推导键字符串长度的集合 strings=[] {len(s) for s in strings}#有长度相同的会留一个,实际应用较广泛
迭代器与生成器
from collections import Iterable
迭代是Python最强大的功能之一,是访问集合元素的一种方式。。
字符串,列表或元组对象都可用于创建迭代器:
字符串,列表或元组==>(iterable object)可迭代对象
可记住遍历的位置的对象。
迭代器只能往前不会后退。
迭代器有两个基本的方法:__iter__() 和 __next__()。
__iter__方法:返回迭代器自身。可以通过python内建函数iter()调用。
__next__方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但没有迭代器,就会引发一个StopIteration异常。该方法可以通过 python 内建函数next()调用。
创建一个迭代器的3种方法:
1、为容器对象添加 __iter__() 和 __next__() 方法(Python 2.7 中是 next());__iter__() 返回迭代器对象本身 self,__next__() 则返回每次调用 next() 或迭代时的元素;
2. 内置函数 iter() 将可迭代对象转化为迭代器
3.就是生成器(generator)。生成器通过 yield 语句快速生成迭代器,省略了复杂的 __iter__() & __next__() 方式
生成器:
第一种方式:将列表的[]改为(),里面可写推导
生成器只要调用next()方法即可得到下一个值,到最后一个后异常(StopIteration)退出
第二种方式:
通过裴波那切序列讲解:将print换成yield,每次生成一个值,但是调用方法时没有结果
在方法内使用yield做生成器,这样调用此方法时,会得出一个结果:generator object...
然后也是可以调用next()
每到yield时,就会停止,返回当前这个值,可以重复地next()调用,看看运行过程
生成器可以被循环迭代,直到循环结束练习:将一个普通循环转换为一个生成器,调用__next__不会输出结果
yield可以模拟多任务执行
#迭代器与生成器 ''' 字符串、列表、元组可迭代对象 可记住遍历的位置的对象 迭代器只能往前,不能后退 迭代器有两个基本的方法:iter() 和 next()。 ''' class iteror: def __init__(self,start=0,end=0): self.start=start self.end=end def __iter__(self): return self #返回自己本身 def __next__(self): #得到当前的指针位置,让start位移 if self.start<self.end: i=self.start #当前下标 self.start+=1 return i else: raise StopIteration it=iteror(0,5) #print(it.__next__()) #print(it.__next__()) #print(it.__next__()) for i in it.__iter__(): print(i) #生成器generator:在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, # 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。 #只生成一次,二次循环不输出 #pythhon特有, #实现生成器的方式: #方式一: 将列表[]改写(),里面写推导 test=(x for x in range(10)) print(test.__next__()) print('******************************') #方式二:通过菲波那切数列,print改写成yeild(调用时生成值) list1=[1,1] def feibonaqie(): a=b=1 print(a) print(b) for i in range(7): #print(a+b) #list1.append(a+b) yield (a+b) a,b=b,a+b f=feibonaqie() #生成器 for i in f : print(i) #print(f.__next__()) print(f) #print(list1)