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)
浙公网安备 33010602011771号