python-迭代器、生成器、内置函数及面向过程编程
一、迭代器
迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的.
为什么要用迭代器呢?
1.可以不依赖索引取值
2.同一时刻在内存中只有一个值,不会过多的占用内存
如何用迭代器?
可迭代的对象:但凡内置有__iter__方法的对象都是可迭代的对象,列如str,list,dict,tuple,set,文件对象
迭代器对象:即内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象,如文件对象
可迭代对象.__iter__()-------->迭代器对象
迭代器对象.__tier__()-------->迭代器本身
迭代器对象.__next__()--------->迭代器的下一个值
总结迭代器:
优点:1.可以不依赖索引取值
2.同一时刻在内存中只有一个值,不会过多的占用内存
缺点:
1.不如按照索引取值或者key取值的方式灵活
2.无法预测迭代器所包含值的长度
二、生成器
生成器本质上就是一种自定义的迭代器
函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象
def func(): print('first') yield 1 print('second') yield 2 print('third') yield 3 print('fourth') g=func() print(g) #生成器对象
res1=next(g) #会触发函数的执行,直到碰到一个yield停下来,并且将yield后的值当作本次next的结果返回 print(res1)# 返回值1
自定义生成一个和内置函数range功能一样的生成器:
def my_range(start,stop,step=1): while start < stop: # 3 < 3 yield start start+=step #start=3 obj=my_range(1,5,2) # 1 3 把函数赋值给一个变量名,这个变量名就是生成器,迭代器 print(next(obj)) print(next(obj))
了解知识点:yield的表达式形式的应用:x=yield
# def dog(name): # print('狗哥 %s 准备开吃' %name) # food_list=[] # while True: # food=yield food_list # food=yield='肉包子' # print('%s 吃了 %s' %(name,food)) # food_list.append(food) # g=dog('alex') # 强调:针对表达式形式的yield的使用,第一步必须让函数先暂停到一个yield的位置,才能进行传值操作 # next(g) # 张开狗嘴,让生成器先暂停到yield的位置,准备接收外部传进来的值 # res1=next(g) #g.send(None) # print(res1) # res2=g.send('屎包子') # 1. 先为当前暂停位置的yield赋值 2. next(生成器)直到再次碰到一个yield停下来,然后其的值当做本次next的结果 # print(res2) # res3=g.send('肉包子') # print(res3) # res4=g.send('泔水') # print(res4)
总结yield:只能在函数内使用
1.yield提供了一种自定义迭代器的解决方案
2.yield可以保存函数的暂停的状态
3.yield对比return
1.相同点:都可以返回值,返回的类型与个数都没有限制
2.不同点:yield可以返回多次值,而return只能返回一次函数就结束了
生成器表达式:
# g = (i**2 for i in range(1,6) if i>3) 和列表表达式的区别就是"()"
三、内置函数(简单内置函数,前面接触过的就不介绍了)
all():如果里面的对象是真的就返回真,如果为空也返回真
print(all([1,'',None]))#False print(all([1,2,'aaa']))#True print(all([]))#True print(all(''))#True
any():有一个为真就返回真,为空时返回假
print(any([0,'',None,False,1]))#True print(any([0,'',None,False]))#False print(any([]))#False
callable:判断函数是否可调用
Return whether the object is callable
ASCII码与数字转换:
print(chr(65))#A print(chr(90))#Z print(ord('a'))#97 print(ord('z'))#122
divmod(x,y):分页
Return the tuple (x//y, x%y) print(divmod(3003,20))#(150, 3)
eval:动态地执行一个表达式的字符串,或者compile函数编译出来的对象
print(eval('1+2+3+4')) res=eval('[1,2,3]') print(res,type(res))
frozenset()返回一个冻结的集合,集合冻结后不能再添加删除任何元素
pow()pow(2,3,3) #(2**3)%3
reversed():反转列表
l=[1,'a','3',3] l1=reversed(l) print(list(l1))
round():取近似数
print(round(3.5))#4 print(round(3.3))#3
slice():保存一个切片
l=['a','b','c','d','e'] s='helloworld' obj=slice(1,5,2) # print(l[1:5:2]) print(l[obj])#['b', 'd']
zip():拉链函数
l=[1,2,3,4,5,6,7] s='hello' res=zip(l,s) print(list(res))#[(1, 'h'), (2, 'e'), (3, 'l'), (4, 'l'), (5, 'o')]
filter():函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
def is_odd(x): return x % 2 == 1 filter(is_odd, [1, 4, 6, 7, 9, 12, 17])#[1, 7, 9, 17]
删除 None 或者空字符串:
def is_not_empty(s): return s and len(s.strip()) > 0 filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']) #['test', 'str', 'END']
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
L = [1,2,3,4,] def pow2(x): ... return x*x ... map(pow2,L) #[1, 4, 9, 16]
sorted()对list、dict进行排序
l=[1,4,3,4,9,6,2] l1 = sorted(l) print(l1)#[1, 2, 3, 4, 4, 6, 9]
四、面向过程编程
核心是过程二字,过程指的就是解决问题的步骤,即先干什么后干什么,基于该思想编写程序就好比在设计一条流水线,是一种机械化的思维方式
优点: 复杂的问题流程化,进而简单化
缺点:可扩展性差
- python全栈开发-Day11 迭代器、生成器、面向过程编程
- Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
- python基础之生成器表达式形式、面向过程编程、内置函数部分
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
- 迭代器、生成器、面向过程编程(day4)
- 迭代器、生成器、面向过程编程
- DAY22 生成器表达式形式、面向过程编程、内置函数
- python--表达式形式的yield、面向过程编程、内置函数
- Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能
- 【Python学习日记】面向过程 和 面向对象 编程
- python学习笔记-函数式编程、迭代器和生成器
- python快速使用(二)python面向过程编程
- python成长之路第三篇(3)_内置函数及生成器迭代器 [面试]
- python(四)上:列表生成式、生成器、迭代器和内置函数
- Python基础-面向过程编程实现Linux下cat -rl ‘dir’ |grep ‘keywords’ 功能
- Python简单学习(lecture3)编程、条件控制、循环语句、迭代器和生成器
- 【Python基础】1.3.1 面向过程编程与面向对象编程(类)实例
- day22 yield的表达式的应用,面向过程编程,内置函数前几个
- python 面向过程编程
- Python3第3课-----编程入门(if、for,while、迭代器与生成器)