迭代器
for i in [1,2,3]:
print(i)
# 遍历 迭代
# 可迭代对象
上述是一种遍历,也是迭代,in后面的叫可迭代对象,for循环就叫迭代器.
可迭代对象:list、str、tuple、
判断可迭代对象的方法:isinstance()
from collections import Iterable
print(isinstance([1,2,3],Iterable))
print(isinstance({},Iterable))
print(isinstance((1,),Iterable))
print(isinstance('100',Iterable))
print(isinstance(100,Iterable)) # False
决定一个容器是否能被迭代。
一个容器想成为可迭代对象,必须有iter方法,并且返回一个迭代器。
class MyList:
def __init__(self):
self.container = []
def add(self, item):
self.container.append(item)
def __str__(self):
return f'{self.container}'
# iter方法是关键
def __iter__(self):
'''返回一个迭代器'''
pass
myList = MyList()
myList.add(1)
myList.add(2)
myList.add(3)
print(myList)
print(isinstance(myList,Iterable))
一个对象实现了__iter__
和__next__
方法,就是迭代器。
li = [11,22,33,44,55]
li_iter = iter(li)
print(next(li_iter))
list1 = [1,2,3,4,5]
li_iter = iter(list1) # 通过iter方法拿到列表的迭代器
while 1:
try:
print(li_iter.__next__()) # 循环调用列表迭代器的next方法
except StopIteration as e:
break
定义一个迭代器
class MyIterator:
'''自定义迭代器'''
def __init__(self,mylist):
self.mylist = mylist
# cur 用来记录当前访问到的位置
self.cur = 0
def __next__(self):
# 当前位置,小于容器长度时
if self.cur < len(self.mylist.container):
# 返回位置所对应的元素
item = self.mylist[self.cur]
# 位置加1
self.cur += 1
return item
else:
# 如果已经取完,再次调用next则抛出异常
raise StopIteration
def __iter__(self):
# 迭代器本身也是一个可迭代对象,自身也需要实现__iter__方法
# 也需要一个迭代器,返回自身即可
myIterator = MyIterator(self)
return myIterator
for 循环的本质
我们在进行迭代的时候,实际上是在对一个迭代器进行操作。
生成器
列表有推导式,元组也可以做推导式。它们都是生成器。
以下是第一种生成器。
x = (i for i in range(10))
print(x)
while True:
try:
print(next(x))
except:
break
第二种生成器:一个函数只要使用了yield关键字,就不再是函数,而是生成器。
def fib(n):
if n<=2:
return 1
a,b = 0,1
for _ in range(n):
a,b = b,a+b
yield a
g = fib(6)
print(g)
while True:
try:
print(next(x))
except:
break
yield
1、相当于return,将后面的值返回
2、函数运行暂停在当前位置,使用next从当前暂停位置继续执行。
3、除了可以使用next唤醒重新执行外,还可以使用send来唤醒。使用send唤醒时,哈可以传入数据。
文件读写拓展
os模块
import os
# rename重命名
os.rename('test1.txt','666.txt')
# remove删除文件
os.remove('test.txt')
# mkdir创建文件夹(目录)
os.mkdir('py')
# rmdir删除单级空文件夹(目录)
os.rmdir('py')
# 获取当前目录
print(os.getcwd())
makedirs,创建有多层递归原则,如os.mkdir('a/b')
创建二级目录,a目录下有b目录。
mkdir不能创建已存在的目录,否则会报错。所以我们需要加上这么一句话:
if not os.path.exists('py'):
os.mkdir('py')
sys模块
在命令行中执行命令时,由sys模块以列表的形式接收参数。
sys.argv:
import sys
print('参数个数为:', len(sys.argv), '个参数。')
print('参数列表:', str(sys.argv))
sys.argv 只提供了比较简单的命令参数获取方式,并没有提供命令提示。无法做到像linux命令一样,可以给使用者提供help帮助。