python新手入门笔记(十二)——迭代器和生成器

python新手入门笔记(十二)——迭代器和生成器

迭代器

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帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值