python基础(4):迭代器、生成器、面向过程编程

  1. 迭代器

  2. 生成器

  3. 面向对线编程

一 迭代器

#1、为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

#2、什么是可迭代对象?
可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
‘hello‘.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{‘a‘:1}.__iter__
{‘a‘,‘b‘}.__iter__
open(‘a.txt‘).__iter__

#3、什么是迭代器对象?
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

文件类型是迭代器对象
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()

#4、注意:
迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
#常配合for循环使用,我们可以完全不再依赖索引去取值了
dic={‘a‘:1,‘b‘:2,‘c‘:3}
for k in dic:
    print(dic[k])

#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环
#优点:
  - 提供一种统一的、不依赖于索引的迭代方式
  - 惰性计算,节省内存
#缺点:
  - 无法获取长度(只有在next完毕才知道到底有几个值)
  - 一次性的,只能往后走,不能往前退

二 生成器

#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码

def func():
    print(‘====>first‘)
    yield 1
    print(‘====>second‘)
    yield 2
    print(‘====>third‘)
    yield 3
    print(‘====>end‘)

a = func()
print(next(a))
# ====>first
# 1
print(next(a))
# ====>second
# 2
print(next(a))
#====>third
# 3

b = func()
for i in b:
    print(i)
# ====>first
# 1
# ====>second
# 2
# ====>third
# 3
# ====>end
# 生成器就是迭代器,__iter__方法返回生成器本身,__next__方法执行到函数下一个yield关键字处

def func2(n):
    for i in range(n):
        yield i

>>> a = func2(4)
>>> b = a.__iter__()
>>> b
<generator object func2 at 0x000001B28DB82410>
>>> a
<generator object func2 at 0x000001B28DB82410>

练习

# 1.使用生成器模拟range(1, 7, 2)
def my_range(start, end, step=1):
    while start < end:
        yield start
        start += step

for i in my_range(1, 7, 2):
    print(i)

# 2. 使用生成器模拟linex系统管道

# cat db.txt | grep ‘user‘

def get_lines(filepath):
    with open(filepath, ‘r‘, encoding=‘utf-8‘) as f:
        while True:
            line = f.readline()
            if line:
                yield line
            else:
                break

def grep(target, lines):
    result = []
    for line in lines:
        if target in line:
            result.append(line)
    return result

print(grep(‘user‘, get_lines(‘D:\oldboy_python\python基础\day15\db.txt‘)))

携程函数

def eater(name):
    print(‘%s start to eat food‘ % name)
    food_list = []
    while True:
        food = yield food_list
        print(‘%s get %s ,to start eat‘ % (name, food))
        food_list.append(food)

e = eater(‘钢蛋‘)
print(next(e))
# 钢蛋 start to eat food
# []
print(e.send(‘包子‘))
# 钢蛋 get 包子 ,to start eat
# [‘包子‘]
print(e.send(‘韭菜馅包子‘))
# 钢蛋 get 韭菜馅包子 ,to start eat
# [‘包子‘, ‘韭菜馅包子‘]
print(e.send(‘大蒜包子‘))
# 钢蛋 get 大蒜包子 ,to start eat
# [‘包子‘, ‘韭菜馅包子‘, ‘大蒜包子‘]
# 携程函数的装饰器,利用装饰器函数进行首次next(func)

def init(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        next(res)
        return res
    return wrapper

@init
def eater(name):
    print("%s eat food" % name)
    food_list = []
    while True:
        food = yield food_list
        print("%s star to eat %s" % (name, food))
        food_list.append(food)

g = eater("gangdan")

# 不需要使用next初始化
print(g.send("1"))
print(g.send("2"))
print(g.send("3"))
print(g.send("4"))

携程函数的应用

>>> import os
>>> os.walk(‘D:\test‘)
generator object walk at 0x0000000002ADB3B8

>>> os.walk(r‘D:\test‘)       # 使用r 是让字符串中的符号没有特殊意义,针对的是转义
# 可以用inspect.getgeneratorstate(generator)查看携程的状态
# 练习 实现功能:grep  -rl  ‘python‘  /etc
# 面向过程编程
# 使用装饰器对携程函数初始化
# 函数自上向下进行,通过send自上向下传递参数
# yield向上返回tag,cat函数一旦得到res为True则停止搜索
# grep函数一旦发现pattern则向printer函数send目标路径并修改tag

import os

def init(func):
    def wrapper(*args, **kwargs):
        g = func(*args, **kwargs)
        next(g)
        return g
    return wrapper

@init
def search(target):
    while True:
        filepath = yield
        g = os.walk(filepath)
        for dirname, _, files in g:
            for file in files:
                abs_path = os.path.join(dirname, file)
                target.send(abs_path)

@init
def opener(target):
    while True:
        filepath = yield
        with open(filepath, ‘rb‘) as f:
            target.send((f, filepath))

@init
def cat(target):
    while True:
        f, abs_path = yield
        for line in f:
            res = target.send((line, abs_path))
            if res:
                break

@init
def grep(pattern, target):
    tag = False
    while True:
        line, abs_path = yield tag
        tag = False
        if pattern.encode(‘utf-8‘) in line:
            target.send(abs_path)
            tag = True

@init
def printer():
    while True:
        abs_path = yield
        print(abs_path)

g = search(opener(cat(grep(‘user‘, printer()))))
g.send(r‘D:\oldboy_python\python基础\day15‘)

原文地址:https://www.cnblogs.com/zhangshuyuan/p/9576381.html

时间: 2024-07-31 18:50:48

python基础(4):迭代器、生成器、面向过程编程的相关文章

python学习第四节 迭代器 生成器 面向过程编程

1:什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. 对迭代器来讲,有一个__next()就够了.在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next__()方法,直到监测到一个StopIteration异常. >>> L = [1,2,3]>

python基础学习-迭代器+生成器(补充)

一:装饰器.生成器(补充了解***) 1.叠加多个装饰器的加载.运行分析(了解***) def deco1(func1): #func1 = wrapper2的内存地址 def wrapper(*args,**kwargs): print('正在运行======>deco1.wrapper1') res1 = func1(*args,**kwargs) # func1是wrapper2 return res1 return wrapper ? def deco2(func2): #func2 =

第五章---面向过程编程

编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑) 1.面向过程编程:核心是过程二字,过程指得是解决问题的步骤,相当于设计一条流水线,机械式的思维方式 优点:复杂的问题流程化,进而简单化       缺点:可扩展性差       运用场景:系统监控脚本,自动部署脚本之类的,eg:软件包解压安装(不再需要扩展了)就可以使用面向过程的思维编写代码 1 ''' 2 面向过程实例:用户登录注册 3 第一步:用户输入用户名密码 4 第二步

迭代器、生成器、面向过程编程

一 迭代器 1.迭代的概念 #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 2.为何要有迭代器?什么是可迭代对象?什么是迭代器对象? #1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但

迭代器和生成器,面向过程编程

迭代器 迭代的工具,迭代是一个重复的过程,并且每次重复都是基于上一次结果而来 什么是可迭代的对象和迭代器对象? 在python中,但凡内置有__iter__方法的对象,都是可迭代对象 可迭代对象执行__iter__方法的到的返回值就是迭代器对象 l='hello' iter_l=l_iter_() while True:        try:            print(iter_l._next_())        except StopIteration:            br

python基础---面向过程编程

面向过程编程 核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计一条工业流水线,是一种机械式的思维方式 优点:程序结构清晰可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题 应用场景:linux内核,git,httpd,shell脚本 练习:过滤目录下文件内容包含error的文件 grep –rl 'error' /dir 使用os模块walk方法: os.walk会把目录下的二级目录和文件做成一个迭代器,多次使用实现文件路径的拼接 #grep 

Python 面向过程编程

一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优缺点 优点:程序体系结构清晰,可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件 应用场景:linux内核,git,httpd,shell脚本 三.实例(利用协程函数进行面向过程编程) 过滤一个文件下的子文件.字文件夹的内容中

Python函数之面向过程编程

一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优缺点 优点:程序体系结构清晰,可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件 应用场景:linux内核,git,httpd,shell脚本 三.实例(利用协程函数进行面向过程编程) 过滤一个文件下的子文件.字文件夹的内容中

Python面向过程编程

目录 面向过程编程 面向过程编程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响.与面向对象明显的不同就是封装.继承.类. 在python中就一句花,可以流水线的编程,调用返回值 面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想