首页 > 编程语言 >python之迭代

python之迭代

时间:2023-03-24 17:01:35浏览次数:43  
标签:__ 迭代 python iter next funa print

一、可迭代对象

可迭代对象:

窄义来讲:能够通过for…… in这种方式,把元素一个个取出来的,这个对象叫可迭代对象。

lst = [1, 2, 3, 5]
for i in lst:
    print(i)

python之迭代_迭代器

广义来讲:对象实现了__iter__()方法 ,返回了一个迭代器对象 (iter())

  • 可迭代对象:列表、元组、字典、字符串、集合
  • 不可迭代对象:整数、浮点数、布尔值


2、判断对象是否可迭代 isinstance()

from collections.abc import Iterable          #  Iterable 可迭代对象
print(isinstance([1, 2], Iterable))            # True   列表是可迭代对象
print(isinstance((12,3),Iterable))             # True
print(isinstance({'name':'rose'},Iterable))    # True


二、迭代器

1、迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器:

iter() 和next() / __iter__() 和 __next__()

2、迭代器特性:
  • 1、访问者不需要关心迭代器内部结构,只需不断执行next()方法获取下一个内容;
  • 2、不能随机访问集合中的某个值,只能从头到尾顺序的读取;
  • 3、访问到一半时不能回退,不能访问之前的值;
  • 4、适合遍历很大的数据集合,节省内存,提升速度。


for i in 100:
    print(i)

s = '100'
for i in '100':
    print(i)

python之迭代_迭代_02

3、原理:

1.通过__iter__()方法可将迭代对象转化成一个迭代器对象(s.__iter__()) / iter(可迭代对象);

2.迭代对象.__next__()获取下一值 / next(迭代器)

3.循环步骤2,直到抛出StopIteration的异常,for循环会在捕捉异常后结束


验证for循环的工作原理

lst = [1, 2, 3, 4, 5] # 列表是可迭代对象

创建迭代器对象

it = iter(lst)         # iterator 迭代器
 print(it)   # <list_iterator object at 0x000002417AFD8A30>
 # # 输出迭代器的下一个元素
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))    # 元素取完后会报StopIteration


it = lst.__iter__()         # iterator 迭代器
print(it)   # <list_iterator object at 0x000002417AFD8A30>
输出迭代器的下一个元素
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())

python之迭代_迭代器_03

4、可迭代对象和迭代器 ---- 迭代器是可迭代对象
lst = [1,23,4]
s = iter(lst)
from collections.abc import Iterator,Iterable
print(isinstance(lst, Iterable))   # True lst是可迭代对象
print(isinstance(s, Iterator))    # True   s是迭代器
print(isinstance(s, Iterable))    # True   s是可迭代对象

python之迭代_迭代器_04

案例

class Person:
    def __init__(self):
        self.n = 1
    def funa(self):
        self.n += 1
        return self.n
p = Person()
print(p.funa())
print(p.funa())
print(p.funa())
print(p.funa())
from collections.abc import Iterator,Iterable
print(isinstance(p, Iterable))  # False
for i in p:
    print(i)    # TypeError: 'Person' object is not iterable

python之迭代_迭代_05

5迭代器 ---拥有__iter__() 和 __next__()
from collections.abc import Iterator,Iterable
class Person:
    def __iter__(self):
        self.n = 1
        return self
    def __next__(self):
        self.n += 1
        return  self.n
p = Person()
print(isinstance(p, Iterable))  # True
print(isinstance(p, Iterator))  # True
it = iter(p)
print(it)
print(next(it))
print(next(it))
print(next(it))


三、生成器

生成器是特定的迭代器

生成器用于"凭空”生成(yield)元素,它不会一次性将所有元素全部生成,而是按需一个个地生成。所以从头到尾都只需占用一个元素的内存空间。

yield 效果是使函数中断,并保存中断的状态

1.生成器函数
from collections.abc import Iterator,Iterable,Generator
def funa():
    yield 1
f = funa()
print(next(f))
# print(next(f))
print(isinstance(f, Iterator))   # True
print(isinstance(f, Generator))  # True

python之迭代_迭代器_06


2.如果在return后返回一个值,这个值是StopIteration异常的说明 ,而不是程序的返回值
def funa():
    yield 1
    return '哈哈,出现异常啦'
f = funa()
print(f)        # <generator object funa at 0x000002E161049430>
print(next(f))
print(next(f))   # StopIteration: 哈哈,出现异常啦

python之迭代_生成器_07

3.生成器函数的表达式
def funa(n):
    for i in range(n):
        yield i*5
f = funa(3)
print(next(f))
print(next(f))
print(next(f))
print(next(f))

python之迭代_生成器_08

4.多个yield
def funa():
    yield 'a'
    yield 'b'
f = funa()
print(next(f))
print(next(f))
print(next(f))

python之迭代_生成器_09

定义一个函数

处理文件,用户指定要查找的文件和内容

将文件中包含要查找内容的每一行都输出到屏幕

def funa(fname):
    with open(fname, encoding='utf-8') as f :
        print(f.read())
funa(r'C:\Users\运营\Desktop\小故事.txt')

python之迭代_迭代_10

5、按行读取
def funa(fname):
    with open(fname, encoding='utf-8') as f:
        for i in f:
            print(i, end='')   # i表示文件内容的某一行
funa(r'C:\Users\运营\Desktop\小故事.txt')

python之迭代_迭代_11

6、在每一行里,判断是否有指定关键字
def funa(fname, word):
    with open(fname, encoding='utf-8') as f:
        for i in f:
            # print(i, end='')   # i表示文件内容的某一行
            if word in i:  # 判断该行有这个关键字
                print(i)
funa(r'C:\Users\运营\Desktop\小故事.txt', '兄弟')

python之迭代_迭代_12

7、改成生成器函数
def funa(fname, word):
    with open(fname, encoding='utf-8') as f:
        for i in f:
            # print(i, end='')   # i表示文件内容的某一行
            if word in i:  # 判断该行有这个关键字
                yield i
a = funa(r'C:\Users\运营\Desktop\小故事.txt', '兄弟')
print(next(a))
print(next(a))

python之迭代_迭代器_13


8、创建生成器
lst = [i*2 for i in range(3)]
print(lst,type(lst))
tt = (i*2 for i in range(3))  # 把中括号变成小括号 ,生成器
print(tt)  # <generator object <genexpr> at 0x00000201CC054F90>
print(next(tt))
print(next(tt))
print(next(tt))

python之迭代_迭代器_14


四、pip

  • pip -V 版本
  • pip install 包名/模块名
  • pip install -U 包名
  • pip uninstall 卸载包名
  • pip freeze 安装包信息
  • pip show 包名 显示详细信息
  • pip install --upgrade pip pip自身更新
  • pip --help 查看帮助信息

标签:__,迭代,python,iter,next,funa,print
From: https://blog.51cto.com/u_15397018/6147467

相关文章

  • python基础
    以#开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。按照约定俗成的惯例,应该始终坚......
  • 3 - 进程 - Windows 10 - Cpython - 多进程通信 - 队列Queue _ 管道Pipe _ 共享内存Sh
    @目录一、进程通信概述:二、进程间交互对象——不用加锁1.消息队列(Queue)2.管道(Pipe)半双工三、进程间同步——需加锁,保证数据安全1.共享内存sharememory(Value、Ar......
  • 2 -进程-Windows 10 -Python - multiprocessing 两种方法实现多进程 - 进程池 _ 简单P
    @目录一、进程池进程池map()和imap()方法的实现进程池apply_async()的实现二、简单Process方法三、守护进程堵塞join理解四、进程的sleep()线程睡眠理解测试......
  • 2 - 线程 - Windows 10 - CPython 解释器 - 多线程并行(实际并发)
    @目录一、线程和进程介绍进程基本概念面向线程设计的系统内部解析-用户态/内核态线程基本概念二、对进程线程并发并行的实际运行过程的理解:CPython多线程争抢GIL——......
  • Python数据库操作—— PostgreSQL
    使用pip3安装psycopg2pipinstallpsycopg2增删改查(CRUD)新建数据库PostgreSQL不支持"SHOWDATABASES"语句,需要使用"SELECT*FROMPG_DATABASE;"进行查询,才能获取......
  • 73.迭代器
      除了vector之外,标准库还定义了其他几种容器。所有标准库容器都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符。严格来说,string对象不属于容器类型,但是strin......
  • Python 自动识别并批量转换文本文件编码
    如题,很简单,就是先用chardet库识别文件编码,解码之后再输出成目标编码。算是个偶尔能用上的小工具,要用的时候万一没有就很难受的那种,比如,网上下载了别人的项目文件,一打开全......
  • python gevnt实现协程
    gevent也是第三方库,自行调度协程,自动试别程序的耗时操作。比如读文件,等待时间。代码举了个栗子fromgeventimportmonkeymonkey.patch_all()importtimeimportgev......
  • Python 离线环境
    一、应用场景比如:对于数据安全要求比较严格的机房,服务器是不允许上网的。那么我现在开发了一套python程序,需要一些模块,怎么运行? 二、离线包制作有2个解决方案:1.使用......
  • python 网络爬虫
    #-*-coding:cp936-*-importstring,urllib2path="G:/NewKnowledge/practice/python/tmp/"defbaidu_tieba(url,begin_page,end_page):foriinrange(begin_......