1.loggin介绍
Python的loggin模块提供了通用的日志系统,这个模块提供了不同的日志级别。
Python的日志级别分别是:
默认情况下,logging将日志打印到屏幕,日志级别为WARNING; 日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
简单的实例:
import logging #引入日志模块 LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s" #定义日志输出格式 #定义日志输出在哪个文件中 filename 文件名全路径 level 代表日志输出的等级 #如果不写下面这句话,日志信息默认输出在控制台 logging.basicConfig(filename="aaa.txt",level=logging.DEBUG,format=LOG_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("没有异常") finally: print("程序结束") #调用这个函数
test()
日志文件输出:
2018-06-05 09:39:12,283 - DEBUG - 只能输入数字! 2018-06-05 09:39:43,966 - INFO - 除数不能为0! 2018-06-05 09:42:37,041 - DEBUG - 只能输入数字! 2018-06-05 09:43:36,748 - DEBUG - 只能输入数字!
Python打印直角三角形可以这样写:
row = 5 for i in range(1,row+1): print(" "*(row - i),"*"*(2*i-1))
Python关于推导的使用:
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:
1.列表推导式
2.字典推导式
3.集合推导式
列表推导式:
#原列表 求100以内能被3整除的数 numbers = [] for x in range(100): if x % 3 == 0: numbers.append(x) print(numbers) #推导写法 第一个x代表for循环中x的值,也就是说先执行for循环,再把结果x返回一个列表 tuidao = [x for x in range(100) if x % 3 ==0] print(tuidao)
输出结果为: [0, 3,
6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45,
48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
二、字典推导式
字典推导和列表推导的使用方法是类似的,只不中括号该改成大括号。直接举例说明:
试题:快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)
结果: {10: 'a', 34: 'b'}
三、集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
Demo一:
squared = {x**2 for x in [1, 1, 2]}
print(squared)
输出结果为: {1, 4}
Demo二:
用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception']
strings_len = {len(s) for s in strings} #有长度相同的会只留一个,这在实际上也非常有用
输出结果为: {1,2,4,9}
Demo三:
将单词大于三的转为大写输出
names = ["bob","tom","alice","jerry","wendy","smith"]name = [x.upper() for x in names if len(x) > 3]
print(name)
结果为: ['ALICE', 'JERRY', 'WENDY', 'SMITH']
Demo四:
#求(x,y)其中x是0-5的偶数,y是0-5之间的奇数组成的元组列表
jieguo2 = [(x,y) for x in range(6) if x % 2==0 for y in range(6) if y % 2 !=0]print(jieguo2)
结果为: [(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
Demo五:
求m中斜线1,5,9组成的列表[1,5,9]
m=[[1,2,3],[4,5,6],
[7,8,9]]
jucheng=[m[i][i] for i in range(len(m))]
print(jucheng)
Demo六:
#求m,n中矩阵元素的乘积 m = [[1,2,3],[4,5,6],[7,8,9]] n = [[2,2,2],[3,3,3],[4,4,4]] mn = [[m[row][col]*n[row][col] for col in range(3)]for row in range(len(m))] print(mn)
输出显示为: [[2, 4, 6], [12, 15, 18], [28, 32, 36]]
Python迭代器:
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
__iter__方法:返回迭代器自身。可以通过python内建函数iter()调用。
__next__方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但迭代器没有只可以返回,就会引发一个StopIteration异常。该方法可以通过 python 内建函数next()调用。
迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
X=[1,2,3]
内建函数iter()可以从可迭代对象中获得迭代器。
it = iter(list) # 创建迭代器对象
创建一个迭代器有3种方法,其中前两种分别是:
为容器对象添加 __iter__() 和 __next__() 方法(Python 2.7 中是 next());__iter__() 返回迭代器对象本身 self,__next__() 则返回每次调用 next() 或迭代时的元素;
2. 内置函数 iter() 将可迭代对象转化为迭代器
3.就是生成器(generator)。生成器通过 yield 语句快速生成迭代器,省略了复杂的 __iter__() & __next__() 方式
自定义一个迭代器:
class IteratorDemo(): def __init__(self,start=0,end=0): self.start = start self.end = end def __iter__(self): return self #返回自己对象本身 def __next__(self): #得到当前的指针start,让start位移 if self.start < self.end: i=self.start #当前的下标 self.start += 1 #获取下一次的下标 return i; else: raise StopIteration() it = IteratorDemo(0,10) print(it.__next__()) #0 print(it.__next__()) #1 print(it.__next__()) #2 #也可以使用for循环遍历 for i in it:
print(i)
如果取两个for循环,只会取第一个for循环
for i in it:
print(i) # 不会输出任何东西
Python生成器:
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
第一种方式:将列表的[]改为(),里面可以写推导 生成器只要调用next()方法即可得到下一个值,到最后一个后异常(StopIteration)退出 用表达式做生成器 例: test=(x for x in rang(10)) next(test)或test.__next__()
#第二种实现生成器的方式 #实现斐波那契 def feibonaqie(): a=b=1 print(a) print(b) for i in range(7): yield (a+b) a,b=b,a+b f=feibonaqie() #print(f.__next__()) for i in f: print(i) #循环两遍,第二次循环没有值 for i in f: print(i) print(f)