Python3日志、推导式、迭代器、生成器

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)



 
 

猜你喜欢

转载自blog.csdn.net/weixin_42238444/article/details/80588469