孤荷凌寒自学python第十六天python的迭代对象
孤荷凌寒自学python第十六天python的迭代对象
(完整学习过程屏幕记录视频地址在文末,手写笔记在文末)
迭代也就是循环。
python中的迭代对象有相关的如下几个术语:
A容器 contrainer
序列/集合/字典等都是容器,我的理解是因为它们都容纳了很多的元素在其中,每个元素都是别的对象,所以称他们为容器非常贴切。
B 可迭代对象 iterable
大部分容器都是可迭代对象(iterable)
可迭代对象的意思 是,这个对象本身可以提供有限数量的内部元素供循环语句遍历,因此多数容器都符合这个条件。
C 迭代器 iterater
可迭代对象可以转换为 迭代器
使用函数
迭代器对象=iter(可迭代对象)
就可将一个可迭代对象转换为一个 迭代器。
迭代器 可以直接自动地 逐一将自己变量名所指向 的 内存中的地址 中的元素 一个一个地 根据循环语句的 需要 逐次(每次提交下一个元素 指向内存的起始地址给循环体)
提供。
部分迭代器 甚至可以将有限的元素集合模拟成无限的数量。循环语句获取时将发现似乎其中的元素永远都取之不尽。这个目前我没有深入研究。
用print语句尝试输出迭代器对象时,会发现,打印出的它被表示成了内存地址的形式。
D 生成器——一种特殊的迭代器
generator
yield
关于生成器,目前没有深入学习。
一、判断 一个 对象 是不是 可迭代对象,是不是 迭代器 的方法
需要引用模块(库),然后再使用相关函数
用到的库是:
collections.py
引用声明:
from collections import Iterable
from collections import Iterator
然后使用全局函数
isinstance来判断类型
1 判断 一个对象 是否是一个可迭代对象
isinstance(要判断的对象,Iterable)
函数返回布尔值。
2 判断 一个对象 是否是一个迭代器
isinstance(要判断的对象,Iterator)
函数返回布尔值。
二、其它可以自动产生迭代器的常用函数
iter函数可以将 可迭代对象转换成 迭代器
除此之外,以下函数 也可以生成 迭代器:
1 range()函数
range函数用于生成指定的整数序列列表对应的迭代器
格式:
新的迭代器对象=range(起始整数(包含此数),结束整数(不包含此数),步长)
测试:
>>> itrA=range(1,20,2)
>>> print(itrA)
range(1, 20, 2)
>>> for a in itrA: #itrA作为一个迭代器,可以向循环语句中的变量a逐一提供其中的元素。
print(a)
1
3
5
7
9
11
13
15
17
19
2 enumerate()函数
此函数会将一个普通序列转换成由元素本身在序列中的index数值与元素对象本身一一对应的一个个元组对组成的复合序列对象对应的 迭代器
格式:
新的迭代器=enumerate(序列对象)
测试:
>>> lstA=list('大家好,我是孤荷凌寒')
>>> itrB=enumerate(lstA)
>>> print(itrB)
#用print语句输出迭代器时,会发现打印出的它被表示成了内存地址的形式。
<enumerate object at 0x000001C940156EA0>
>>> for index,obj in itrB: #迭代器itrB每次向循环语句提供同一元素的两个对象
print('当前元素index:',index,'值:',obj)
当前元素index: 0 值: 大
当前元素index: 1 值: 家
当前元素index: 2 值: 好
当前元素index: 3 值: ,
当前元素index: 4 值: 我
当前元素index: 5 值: 是
当前元素index: 6 值: 孤
当前元素index: 7 值: 荷
当前元素index: 8 值: 凌
当前元素index: 9 值: 寒
3 sorted()函数
对序列进行排序。
格式:
sorted(序列对象,key=排序关键字函数,排序方向的布尔值)
排序关键字函数,是我的理解并备注。
此参数是关键字参数,必须以
key=函数名
或
key=适时定义的匿名函数
的方式来进行传递。
而我的理解是,这个函数其实只是指定了以序列中的元素的哪个关键字(或部分)来进行排序,并定义具体的排序规则,可以存在多种复杂的规则。
排序方向的布尔值,只能传递布尔值True或False中的其中一个,如果传入True,表示逆序排序;如果传入False,表示正序排序。
特别注意:
我发现此函数与今天所学的其它函数都不同的地方在于,它并不是 返回了一个迭代器对象,而是返回的真正的序列对象。原序列的内容没有改变。
测试:
lstA=[('john','A',15),('jone','B',12),('dave','B',10)]
print(sorted(lstA,key=lambda x:x[2])) #这儿的排序函数是实时定义的匿名函数,只指明了按列表中元素——是元组对象的index为2的元素的值进行排序。
运行结果:
[('dave', 'B', 10), ('jone', 'B', 12), ('john', 'A', 15)]
从运行结果中可以看出——
此列表,共有三个元素,每个元素都是一个元组;
每个元组都有三个元素,index值分别为0,1,2;
而实时定义的排序关键字函数指明了x:x[2],按元组对象的index为2的元素的大小排序。
于是结果是正确的排好的序,10<12<15
现在我们对排序函数进行修改:
lstA=[('john','A',15),('jone','B',12),('dave','B',10)]
print(sorted(lstA,key=lambda x:x[0])) #这儿的排序函数是实时定义的匿名函数,只指明了按列表中元素——是元组对象的index为0的元素的值进行排序。
运行结果:
[('dave', 'B', 10), ('john', 'A', 15), ('jone', 'B', 12)]
4 reversed() 函数
此函数反转一个序列中元素的先后顺序。
格式:
新的迭代器对象=reversed(序列对象)
测试:
strA='孤荷凌寒参加工作后,每天在工作之外的空闲时间只能看着窗外的群山发呆,小山村没多少人,虽然自己也在农村长大,但孤荷凌寒并不玩牌,也性格内向。'
itrA=reversed(strA)
print(itrA) #直接打印 迭代器,只能显示 内存地址
lstA=list(itrA) #只能转换成list才能显示,不能直接还原成字符串了
print(lstA)
运算结果:
<reversed object at 0x000001DF1EFE4C88>
['。', '向', '内', '格', '性', '也', ',', '牌', '玩', '不', '并', '寒', '凌', '荷', '孤', '但', ',', '大', '长', '村', '农', '在',
'也', '己', '自', '然', '虽', ',', '人', '少', '多', '没', '村', '山', '小', ',', '呆', '发', '山', '群', '的', '外', '窗', '着', '看', '能', '只', '间', '时', '闲', '空', '的', '外', '之', '作', '工', '在', '天', '每', ',', '后', '作', '工', '加', '参', '寒', '
凌', '荷', '孤']
5 filter() 函数
筛选一个序列,留下 序列中符合筛选条件的元素,返回新的迭代器:
新的迭代器=filter(筛选函数,序列)
筛选函数将有一个参数,对应于序列中的每一个元素。
且筛选函数的返回对象只能是布尔对象即:True 或者 False
在filter函数执行时,序列中的每一个元素都会被作为实参传递进筛选函数中进行运算,当序列中的一个元素传递进筛选函数后,如果筛选函数的运算结果是:True,则此元素会被认为符合筛选条件而通过筛选,被存放入新的迭代器对象中;如果筛选函数运算的结果是False,则此元素会被认为不符合筛选条件,就被忽略掉。
测试:
strA='孤荷凌寒参加工作后,每天在工作之外的空闲时间只能看着窗外的群山发呆,小山村没多少人,虽然自己也在农村长大,但孤荷凌寒并不玩牌,也性格内向。'
def shaixuan(yuansu):
strKey='孤荷凌寒'
if yuansu==',':
return True
elif yuansu in strKey:
return True
else:
return False
itrA=filter(shaixuan,strA)
print(itrA)
lstA=list(itrA)
print(lstA)
运算结果 :
<filter object at 0x000002457AB54C88>
['孤', '荷', '凌', '寒', ',', ',', ',', ',', '孤', '荷', '凌', '寒', ',']
6 map()函数
将指定的一个或多个序列的每个元素都由作为指定的同一个函数的实参,然后由函数进行运算,并返回结果,然后将所有结果组合成一个新的迭代器对象返回。
格式:
map(执行函数名 ,序列 [,序列2] [,序列3] [……])
执行函数名是指要对序列的每个元素进行运算而事先已经定义好的函数的函数名。
此函数要求至少要有一个形式参数,以便序列的每个元素都可以作为实参而传递进入函数体内进行运算。
此函数在对序列的每个元素进行运算后都必须返回一个对象。
map()函数与filter()函数的不同之处在于,map()函数可以一次接受传入多个序列。
传入n个序列则意味着map()函数的第一个形参——执行函数——必须要有n个形式参数,以便接收n个序列的各自的每个元素参与执行函数内部的运算。
测试:
strA='读书是当时孤荷凌寒与外部世界沟通的唯一通道。'
strB='孤荷凌寒利用一切可以利用的休息时间学习。'
strC='当孤荷凌寒知道了世界上还有“电脑”这样的神奇的东西存在之后'
strD='孤荷凌寒准备自己学习英语,为的是有一天能够学习电脑。'
def function(yuansu):
strKey='孤荷凌寒'
if yuansu==',':
return '逗号'
elif yuansu in strKey:
return yuansu
else:
return '0'
itrA=map(function,strA)
print(itrA)
lstA=list(itrA)
print(lstA)
运算结果:
<map object at 0x000001D3E0FB4D30>
['0', '0', '0', '0', '0', '孤', '荷', '凌', '寒', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
传入多个序列的测试:
strA='孤荷凌寒读书是当时与外部世界沟通的唯一通道。'
strB='孤荷凌寒利用一切可以利用的休息时间学习。'
strC='当孤荷凌寒知道了世界上还有“电脑”这样的神奇的东西存在之后'
strD='孤荷凌寒准备自己学习英语,为的是有一天能够学习电脑。'
def function(yuansu,ys2,ys3,ys4):
strKey='孤荷凌寒'
if ((yuansu in strKey) and (ys2 in strKey) and (ys3 in strKey) and (ys4 in strKey)):
return '命中'
else:
return '0'
itrA=map(function,strA,strB,strC,strD)
print(itrA)
lstA=list(itrA)
print(lstA)
运行结果:
<map object at 0x00000227EFFE7BE0>
['0', '命中', '命中', '命中', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
7 reduce()
from functools import reduce
newobj=reduce(func,序列[,数值常量][……])
此函数的用法,我的初步理解是:
将传入的序列用函数 func 进行计算
定义的func函数有几个形参就要有几个序列和常量传入
此函数没有完全弄清楚,测试如下:
from functools import reduce
def func(var,var2):
return var + var2
lstA=[1,2,3,4]
lstB=[4,3,2,1]
intA=reduce(func,lstA,10)
print(intA)
运算结果:
20
——————————
今天整理的学习笔记完成,最后例行说明下我的自学思路:
根据过去多年我自学各种编程语言的经历,认为只有真正体验式,解决实际问题式的学习才会有真正的效果,即让学习实际发生。在2004年的时候我开始在一个乡村小学自学电脑 并学习vb6编程语言,没有学习同伴,也没有高师在上,甚至电脑都是孤岛(乡村那时还没有网络),有的只是一本旧书,在痛苦的自学摸索中,我找到适应自己零基础的学习方法:首先是每读书的一小节就作相应的手写笔记,第二步就是上机测试每一个笔记内容是否实现,其中会发现书中讲的其实有出入或错误,第三步就是在上机测试之后,将笔记改为电子版,形成最终的修订好的正确无误的学习笔记 。
通过反复尝试错误,在那个没有分享与交流的黑暗时期我摸黑学会了VB6,尔后接触了其它语言,也曾听过付费视频课程,结果发现也许自己学历果然太低,就算是零基础的入门课程,其实也难以跟上进度,讲师的教学多数出现对初学者的实际情况并不了解的情况,况且学习者的个体也存在差异呢?当然更可怕的是收费课程的价格往往是自己难以承受的。
于是我的所有编程学习都改为了自学,继续自己的三步学习笔记法的学习之路。
当然自学的最大问题是会走那么多的弯路,没有导师直接输入式的教学来得直接,好在网络给我们带来无限搜索的机会,大家在网络上的学习日志带给我们共享交流的机会,而QQ群等交流平台、网络社区的成立,我们可以一起自学,互相批评交流,也可以获得更有效,更自主的自学成果。
于是我以人生已过半的年龄,决定继续我的编程自学之路,开始学习python,只希望与大家共同交流,一个人的独行是可怕的,只有一群人的共同前进才是有希望的。
诚挚期待您的交流分享批评指点!欢迎联系我加入从零开始的自学联盟。
这个时代互联网成为了一种基础设施的存在,于是本来在孤独学习之路上的我们变得不再孤独,因为网络就是一个新的客厅,我们时刻都可以进行沙龙活动。
非常乐意能与大家一起交流自己自学心得和发现,更希望大家能够对我学习过程中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信大家会的,是吧!
根据完全共享的精神,开源互助的理念,我的个人自学录制过程是全部按4K高清视频录制的,从手写笔记到验证手写笔记的上机操作过程全程录制,但因为4K高清文件太大均超过5G以上,所以无法上传至网络,如有需要可联系我QQ578652607对传,乐意分享。上传分享到百度网盘的只是压缩后的720P的视频。
我的学习过程录像百度盘地址分享如下:(清晰度:1280x720)
链接:https://pan.baidu.com/s/18DrDIY1HCirswLexdS9PDw 密码:liz8
Bilibili:
https://www.bilibili.com/video/av35841103/
喜马拉雅语音笔记:
https://www.ximalaya.com/keji/19103006/138930894
孤荷凌寒自学python第十六天python的迭代对象的更多相关文章
- 孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解
孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解 (今天由于文中所阐述的原因没有进行屏幕录屏,见谅) 为了能够使用selenium模块进行真正的操作,今天主要大范围搜索资料进行 ...
- 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1
孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...
- 孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块
孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块 (完整学习过程屏幕记录视频地址在文末) 由于本身tesseract模块针对普通的验证码图片的识别率并不高 ...
- 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10
孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...
- 孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9并使用pydocx模块将结果写入word文档
孤荷凌寒自学python第七十九天开始写Python的第一个爬虫9 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 到今天终于完成了对docx模块针对 ...
- 孤荷凌寒自学python第七十六天开始写Python的第一个爬虫6
孤荷凌寒自学python第七十六天开始写Python的第一个爬虫6 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 不过由于对python-docx模 ...
- 孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5
孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...
- 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4
孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...
- 孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3
孤荷凌寒自学python第七十天学习并实践beautifulsoup对象用法3 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步了 ...
- 孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2
孤荷凌寒自学python第六十九天学习并实践beautifulsoup对象用法2 (完整学习过程屏幕记录视频地址在文末) 今天继续学习beautifulsoup对象的属性与方法等内容. 一.今天进一步 ...
随机推荐
- Android OpenGL ES 画球体
近期由于兴趣所向.開始学习OpenGL绘图. 本文以"画球体"为点,小结一下近期所学. > 初识OpenGL ES 接触OpenGL是从Android開始的.众所周知,And ...
- 零基础Centos6搭建Git服务器,及常见问题解决
1.编译安装git 2.1 服务器端: #yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl- ...
- redux详解
redux介绍 学习文档:英文文档,中文文档,Github redux是什么 redux是一个独立专门用于做状态管理的JS库(不是react插件库),它可以用在react, angular, vue等 ...
- git常用命令图解
- Java中的return this
return this就是返回当前对象的引用(就是实际调用这个方法的实例化对象) 示例: /** * 资源url */ public HttpConfig url(String url) { urls ...
- django中的forms组件(权限信息校验,增删改查)
1.用处 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确,则保留上次输入的内容 5.自动创建input标签并可以设置样式 6.基于form ...
- C/C++程序基础 (十)模板和泛型
什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...
- python 计算提成代码
while True: with open('8564.txt') as f: r = f.readlines() start = input("请输入要查询的日期,例如20180101 : ...
- OA上传和编辑数据
1.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要. 2. String[]类型打 ...
- 干货!一篇文章集合所有Linux基础命令,适合所有菜鸟学习和老手回顾!
1 文件{ ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2u ...