Python基础day-9[迭代器,生成器,三元表达式,列表解析,生成器解析]

迭代器:

  字符串、列表、元组、字典、集合、文件都是可迭代对象,但是只有文件同时又是迭代器。

  可迭代对象执行的结果就是迭代器。

while捕捉StopIteration异常:

d = {'abc':135,'name':'abc'}
obj = d.__iter__()
while True:
    try:       #被捕捉异常的代码
        i = obj.__next__()
        print(i)
    except StopIteration:      #捕捉异常
        break         #捕捉到后执行的操作

判断是不是可迭代对象或者迭代器:

from collections import Iterable,Iterator       #导入模块
print(isinstance(s, Iterable))       #是否是迭代对象
print(isinstance(s, Iterator))       #是否是迭代器

生成器:

  函数体内包含有yield关键字,该函数执行的结果就是生成器。

  生成器本质就是一个迭代器。

  yield功能:

       1.与return类似,都可以返回值,yield可以返回多次值,return只能返回一次
       2.为函数封装好了 __iter__和__next__方法,把函数执行结果做成迭代器
       3.遵循迭代器的取值方式obj.__next__(),触发函数的执行。函数暂停与再继续都是yield保存的
示例:
def countdown(n):
    print('start')
    while n > 0:
        yield n
        n -= 1
    print('stop')

obj = countdown(5)
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
执行结果:
D:\Python\Python36-32\python.exe E:/Python/DAY-9/day9_笔记.py
start
5
4
3
2

Process finished with exit code 0

模拟 Linux下 tail -f 命令和grep 命令:

import time      
def tail(filepath,encoding = 'utf-8'):       #定义函数名  tail
    with open(filepath,encoding=encoding) as f:  #以只读方式打开文件
        f.seek(0,2)   #光标移动到末尾
        while True:      #进入循环判断
            line  = f.readline()    #从文件中读取内容
            if line:        #判断line是否有内容(所有值都自带布尔值,除了None、0)
                yield line   #如果有内容就 返回这个值
            else:           #如果没有就 睡0.5秒,重新检测
                time.sleep(0.5)

def grep(lines,pattern):    #定义函数 grep
    for line in lines:      #循环读取 lines
        if pattern in line:    #如果 查询的内容在line中
            yield line      #返回 line
t = tail(r'E:\Python\Exercise\a.txt')   #使用 tail 检测 a.txt文件是否有新内容,并把新内容保存给t
g1 = grep(t,'abc')        #传递 tail 检测到的新内容,到grep  并传入 检测内容,保存给g1

for i in g1:     #循环从g1 中打印grep后的结果
    print(i)

三元表达式:

示例:判断x,y的大小
def
max2(x,y): if x > y: #使用if else 的老的写法 return x else: return y return x if x > y else y #使用三元表达式写的方式,两边的 x和y只是代表返回值,可以写成字符串形式,那样返回的就是字符串了 print(max2(10,11))

列表解析:

示例:把hello所有字符转换成大写并生成list
s = 'hello' res = [i.upper() for i in s] print(res) 执行结果: D:\Python\Python36-32\python.exe E:/Python/DAY-9/day9_笔记.py ['H', 'E', 'L', 'L', 'O'] Process finished with exit code 0

示例:打印出list中大于等于50小于70的数值
l = [1,50,2,3,69,47,32,45,78,80]
print([i for i in l if i >= 50 and i < 70 ])
执行结果:

D:\Python\Python36-32\python.exe E:/Python/DAY-9/day9_笔记.py
[50, 69]

Process finished with exit code 0

生成器解析:

print([i for i in range(100)])    #生成列表形式

g = (i for i in range(100))    #生成生成器模式,使用for打印出结果   建议使用这种方式,上面的方法如果数字大了很容易卡死电脑
for x in g:
    print(x)
posted @ 2017-06-16 17:05  neuropathy_ldsly  阅读(172)  评论(0)    收藏  举报