1.1什么是迭代器?
即迭代的工具,迭代事一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
迭代的过程(用while循环实现for循环的功能):
但这种方式只能是基于索引的数据类型来实现,想集合或者字典这种没有索引的则不可以
l=['a','b','c']
i=0
while i < len(l):
print(l[i])
i=i+1
1.2为何要用迭代器?
优点:
1. 迭代器提供了一种不需要依赖索引的取值方式
2. 节省内存
缺点:
1. 一次性,只能往后取值,无法预测迭代中包含的个数
2. 无法取到指定的值,没有索引取值灵活
1.3如何用迭代器?
1. 可迭代对象
但凡内置有__iter__方法的对象就是可迭代对象,例如:str/list/dict/tuple/set/文件对象
调用可迭代对象的__iter__方法,会得到一个返回值,该返回值就是迭代器对象
'jiang'.__iter__()
[1,2].__iter__()
(1,2).__iter__()
{'1':'a'}.__iter__()
{1,2,3}.__iter__()
open('文件内容').__iter__()
dict={'x' : 1,'y' : 2,'z' : 3}
iter_dict=dict.__iter__()
print(iter_dict.__next__())
2. 迭代器对象
即内置有__iter__方法又有__next__方法,例如:文件对象
1.4for循环工作原理:
调用in后面那个对象的内置方法,拿到一个迭代器对象,执行k=next(iter_obj),循环往复知道抛出异常后结束
dict={'x' : 1,'y' : 2,'z' : 3}
iter_dict=iter(dict)
for iin iter_dict:
print(i)
2.1什么是生成器?
生成器就是一种自定义的迭代器
2.2如何使用生成器?
在函数内凡是出现yield关键字,然后调用函数将不会立即执行函数体代码,会得到一个返回值,该返回值称之为生成器,即我们自定义的迭代器
2.3如何定义生成器:
def my_gange(start,stop,step=3):
whilestart < stop:
yieldstart
start+=step
res=my_gange(1,100,3)
for iin res:
print(i)
2.4总结yeild:
1. 提供一种自定义迭代器的解决方案
2. yield vs return
相同点:都能返回值,并且返回值并没有类型雨个数限制
不同点:yield可以返回多次值,而return只能返回一个值
第3章 面向过程编程:面向过程编程绝对不是函数编程,面向过程是一种编程思路,而编程思路不依赖于具体的语言或者语法的,就是即使不依赖于函数,也可以基于面向过程的思想编写程序
定义:面向过程的核心是过程二字,过程指的是先干什么,后干什么,然后在干什么,基于面向过程设计程序就好比在设计一条流水线,是一种机械化的思维方式
优点:复杂的问题流程化,进而简单化
缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身
应用场景:扩展性要求不高的场景,如linux内核,git,httpd
设计程序的框架通常用到面向过程的编程思想,在考虑了程序是否需要比较强的扩展性以后,扩展性较低的就用面向过程的编程思想,较高的用到面向对象
第4章 三元表达式:def max(x,y):
ifx > y:
returnx
else:
returny
res=max(2,1)
print(res)
x=10
y=20
res= x if x > y else y
print(res)
5.1列表生成式:
res=[]
for itemin range(1,11):
res.append(item)
print(res)
res=[item foritem inrange(1,11)]
print(res)
找出以xx结尾的名字
name=['alex','egon','kevin','hxx','wxx']
res=[i for iin nameif i.endswith('xx')]
print(res)
5.2字典生成式:
res={i: fori inrange(10) ifi > 5}
print(res)
l=[('name','jiang'),('age',18),('gender','male')]
dic={k:v for k,v inl ifk != 'age'}
print(dic)
5.3生成器表达式:
生成器表达式中是没有任何值的,需要next才有值
res=(x forx inrange(1,11))
print(next(res))
print(next(res))
统计文件中,字符个数最长的字符个数
with open('README.md',encoding='utf-8') as f:
l=[]
fori inf:
l.append(len(i))
print(max(l))
生成器写法
with open('README.md',encoding='utf-8') as f:
l=(len(i) for iin f )
print(max(l))