日志:
日志是一种可以追踪某些软件运行时所发生事件的方法。
概念: 用来记录程序中, 你认为重要的消息.
日志的作用 :
可以简单总结为以下3点:
1. 程序调试
2. 了解软件程序运行情况,是否正常
3. 软件程序运行故障分析与问题定位
日志的等级 在python中最常用的有五种等级
日志等级(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
调试 Debug 一般信息Info 警告Warning 错误Error 致命Critical
说明:
上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
一种方法:
#日志的使用
#简单使用,在控制面板输出
import logging #先引入模块logging
logging.debug('this is a debug')
logging.info('this is a info')
logging.warning('this is a warning')
logging.error('this is a error')
logging.critical('this is a critical')
#输出为: WARNING:root:this is a warning
# ERROR:root:this is a error
# CRITICAL:root:this is a critical
'''
只输出三条:
因为logging模块提供的日志记录函数所使用的日志器设置的日志级别是WARNING,
因此只有 WARNING 级别的日志记录以及大于它的 ERROR 和 CRITICAL 级别的日志记录被输出了
而小于它的DEBUG和INFO级别的日志记录被丢弃了。
'''
另一种方法:
#简单使用,在控制面板输出
import logging #先引入模块logging
logging.log(logging.DEBUG,'this is a debug')
logging.log(logging.INFO,'this is a info')
logging.log(logging.WARNING,'this is a warning')
logging.log(logging.ERROR,'this is a error')
logging.log(logging.CRITICAL,'this is a critical')
#输出为三条 同上
# WARNING:root:this is a warning
# ERROR:root:this is a error
# CRITICAL:root:this is a critical
上面输出结果中每行日志记录的各个字段含义分别是:
日志级别 : 日志器名称 : 日志内容
将日志输出到文件中 ,需使用函数 :
logging.basicConfig(**kwargs) 该方法用于为logging日志系统做一些基本配
filename | 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。 |
datefmt | 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别 |
函数说明: 可以内置的参数
#简单使用,在文件中输出 并配置
import logging #先引入模块logging
log_format='%(asctime)s %(levelname)s %(message)s ' # 指定日志格式字符串,
DATE_FORMAT = "%m/%d/%Y %H:%M:%S:%p" #指定时间的输出
logging.basicConfig(level=logging.DEBUG , filename='my.log' , format=log_format , datefmt=DATE_FORMAT)
logging.log(logging.DEBUG,'this is a debug')
logging.log(logging.INFO,'this is a info')
logging.log(logging.WARNING,'this is a warning')
logging.log(logging.ERROR,'this is a error')
logging.log(logging.CRITICAL,'this is a critical')
Random (随机数)
random()是不能直接访问的,需要导入 random 模块
语法: import random
1.random.random()
random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0
import random #注 需要引入模块
print(random.random())
#打印为: 0.6538968726581385 每次打印都不相同
2. random.uniform()
random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限, 一个是下限. 如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。
import random #注 需要引入模块
print( random.uniform(1,9)) #打印为: 1.59368996297742
print( random.uniform(10,20)) #打印为 : 17.90086045138722
#注 每次打印的结果都各不相同
3.random.randint()
random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
import random #注需要引入模块
print( random.randint(1,9)) #打印为: 2
print(random.randint(20,20)) #结果永远是20
#print(random.randint(20, 10)) #该语句是错误的。下限必须小于上限
4.random.randrange()
random.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。
import random
print(random.randrange(10,100,2)) #打印为 :26
print(random.randrange(1,9,6)) #打印为 :1或者7
#每次打印都不相同
5.random.choice()
random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。
import random
print(random.choice("人生苦短,我学python")) #打印为: 我 字符串
print(random.choice(["JGood","is","a","handsome","boy"])) #打印为: is 列表
print(random.choice(("Tuple","List","Dict"))) #打印为: Dict 元组
#每次打印都各不相同
6.random.choices() 扩展
其函数原型为:random.choice(sequence,k=n) 输出结果为列表 n 为
import random
print(random.choices("人生苦短,我学python",k=3)) #打印为: ['p', ',', '苦']
print(random.choices(["JGood","is","a","handsome","boy"],k=2)) #打印为: ['is', 'handsome']
print(random.choices(("Tuple","List","Dict"),k=2)) #打印为: ['List', 'Dict']
#每次打印都会组成列表形式
7.random.shuffle()
random.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱。
import random
lis=["JGood","is","a","handsome","boy"]
print(random.shuffle(lis)) #如果这样则返回None
#正确的使用方法:
random.shuffle(lis)
print(lis) #打印为: ['a', 'handsome', 'JGood', 'boy', 'is']
8.random.sample
random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。
import random
print(random.sample(range(20),6)) #打印为: [19, 11, 18, 17, 10, 9]
print(random.sample(["JGood","is","a","handsome","boy"],3)) #打印为['boy', 'handsome', 'is']
模块:
import sysprint(sys.path)路径。打印后是一个列表,可以向其中追加路径
reload()重新加载路径
from 需要引入的文件路径 import * ( *号表示全部 也可以指定)
模块互相调用不可以,会产生死锁
推 导 :
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:
1.列表推导式
2.字典推导式
3.集合推导式
不多说 , 上干货
1.列表推导式
#例1:整除3的数字列表
number=[]
for i in range(20):
if i%3==0:
number.append(i)
print(number)
#打印为: [0, 3, 6, 9, 12, 15, 18]
# 使用 列表推导式
nums=[x for x in range(20) if x%3==0] #使用中括号
print(nums) #打印为: [0, 3, 6, 9, 12, 15, 18]
#也可以这样
nums=[x+x for x in range(20) if x%3==0] #使用中括号
print(nums) #打印为:[0, 6, 12, 18, 24, 30, 36]
#列表-->可以调方法
def squared(x):
return x*x
numb=[squared(x) for x in range(20) if x%3==0]
print(numb) #打印为: [0, 9, 36, 81, 144, 225, 324]
使用()生成 generator 将列表推导式的 [ ] 改成 ( ) 即可得
到生成器。--yeild
num=(x for x in range(20) if x%3==0)
print(type(num)) #打印为:<class 'generator'>
#如果想打印出来有两种办法:
#办法一:
print(num.__next__()) #使用__next__() 一个个打印 得到 0 想要得到别的数字 可以在继续打印
#方法二:
print([y for y in num]) #使用推导的方法 [3, 6, 9, 12, 15, 18]
2.字典推导式
典推导和列表推导的使用方法是类似的,只不过中括号该改成大括号。
直接举例说明: 快速更换key和value
# #字典推导式
#使用推导的方法
dic={'name':'jock','age':16,'class':'七班'}
new_dic={v:k for k,v in dic.items()}
print(new_dic) #打印为: {'jock': 'name', 16: 'age', '七班': 'class'}
#使用for循环的方法
new_dict={}
for k,v in dic.items():
new_dict[v]=k
print(new_dict) #打印为{'jock': 'name', 16: 'age', '七班': 'class'}
3.集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
# #集合推导式
#求平方:
sets={x**2 for x in range(10)}
print(type(sets)) #打印为:<class 'set'>
print(sets) #打印为:{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
让我们用一些例子,证明推导的简单快捷:
例1: 用集合推导 字符串长度的集合
strings = ['a','is','with','if','file','exception']
len=[len(s) for s in strings]
print(len) #打印为: [1, 2, 4, 2, 4, 9] 有长度相同的会只留一个 ,这在实际上也非常有用
例2: 将单词长度大于3的转为大写输出
#将单词长度大于3的转为大写输出
names = ['bob','tom','alice','jerry','wendy','smith']
name=[name.upper() for name in names if len(name)>3 ]
print(name) #打印为: ['ALICE', 'JERRY', 'WENDY', 'SMITH']
例3:求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表:
# #求(x,y)其中x是0-5之间的偶数 y是0-5之间的奇数组成的元组列表
tup=[(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2==1]
print(tup) #输出为: [(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
勤苦修行得自在,道力有边边亦无边!