博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器、生成器、面向过程编程
阅读量:5887 次
发布时间:2019-06-19

本文共 1879 字,大约阅读时间需要 6 分钟。

一:迭代的概念

迭代器即迭代的工具,那么迭代是什么概念呢?

  迭代是一个重复的过程,每重复一次即迭代,并且每一次迭代的结果都是下一次的初始值

简易的迭代器

l =["a","b","c","d"]i = 0while i < len(l):    print(l[i])    i +=1

为什么要有迭代器?

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

什么是可迭代对象?

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

迭代器对象是什么?

而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。

文件类型是迭代器对象:

open('a.txt').__iter__()open('a.txt').__next__()

注意:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

迭代器对象:迭代器运作的对象

dic = {
"x":1,"y":2,"z":3}iter_dic = dic.__iter__()#字典的迭代器对象print(iter_dic.__next__())#迭代器对象使用内置方法迭代取值print(iter_dic.__next__())print(iter_dic.__next__())

二:for循环原理分析

for循环称之为迭代器循环,in后跟的必须是可迭代对象:

  for循环会执行in后的对象的__iter__方法,拿到迭代器对象;
  然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体;
  周而复始,直到取值完毕,for循环会监测到异常,自动结束循环。

三:迭代器的优缺点

迭代器的优点:

  提供了一种可以不依赖于索引取值的方式。

  迭代器每次只取一个值,__next__方法调用一次去一个,省内存。

缺点:
  取值麻烦一次只能取一个值;
  只能往后取,并且是一次性的;
  无法用len获取长度。

四:生成器

什么是生成器?

只要函数体带有yield关键字的函数就是生成器

调用带有yield关键字的函数,返回的结果就是生成器,且不会执行函数代码:

def foo():    print("sdsadas")    yield 1  # 出产,产生    print("sdsadas")    yield 2    print("sdsadas")    yield 3    print("sdsadas")    yield 3    res = foo()

生成器与迭代器

当我们获得生成器函数调用的返回值后,赋值拿到,可以看到其内置有__iter__方法和__iter__方法,根据迭代器的定义,可以知道生成器就是迭代器。

因此可以使按照迭代器的使用方法来使用:

res.__next__()          #执行生成器,执行到yield结束,yield返回的值print(res.__next__())   #执行生成器,并把yiled返回结果打印next(res)               #和res.__next__()执行结果一致

yield总结

  把函数做成迭代器

  对比return,可以返回多次值,可以挂起/保存函数的运行状态

五:面向过程编程

强调:面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖于具体的语言或语法的。言外之意是即使我们不依赖于函数,也可以基于面向过程的思想编写程序。

定义:面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。

优点:复杂的问题流程化,进而简单化

缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身

应用:扩展性要求不高的场景,典型案例如linux内核,git,httpd。

面向过程编程实践:

  流水线1:用户输入用户名、密码--->用户验证--->欢迎界面

  流水线2:用户输入sql--->sql解析--->执行功能

转载于:https://www.cnblogs.com/li1992/p/8681357.html

你可能感兴趣的文章
Java面向对象编程概述
查看>>
Android利用文本分割拼接开发一个花藤文字生成
查看>>
哈夫曼树的实现
查看>>
12-18Windows窗体应用小程序之记事本(1)
查看>>
毕业论文一次性修改所有字母和数字的字体
查看>>
结构体:HASH表模板
查看>>
[转]理解Linux文件系统之inode
查看>>
在i3 Cpu上允许64位系统
查看>>
视频编解码学习之五:差错控制及传输
查看>>
Postman教程
查看>>
python模块--os模块
查看>>
HSSFRow获取单元格方法与区别
查看>>
词汇小助手V1.2——可以显示英语单词的国际音标
查看>>
洛谷 1365 WJMZBMR打osu! / Easy
查看>>
删除UINavigationItem上的BarButtonItem
查看>>
数据分析相关模块
查看>>
Python数据结构1-----基本数据结构和collections系列
查看>>
SQL Denali-FileTable
查看>>
C# 图像处理:复制屏幕到内存中,拷屏操作
查看>>
PHP微信支付流程
查看>>