迭代器与函数Python学习(四)
1.1 迭代器:
迭代的工具
1.1.1 什么是迭代:
指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值
while True:
print('=====>')
l=['a','b','c']
count=0
while count < len(l):
print(l[count])
count+=1
1.1.2 为什么要有迭代器?
对于序列类型:str,list,tuple,可以依赖索引来迭代取值,
但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式-》迭代器
1.1.3 可迭代的对象(下列都是):obj.__iter__
name='egon'
l=[1,2,3]
t=(1,2,3)
d={'name':'egon','age':18,'sex':'male'}
s={'a','b','c'}
f=open('a.txt','w',encoding='utf-8')
name.__iter__ l.__iter__ t.__iter__ d.__iter__ s.__iter__ f.__iter__
1.1.4 迭代器对象(文件是):obj.__iter__,obj.__next__
f.__iter__ f.__next__
1.1.5 总结:
1 可迭代对象不一定是迭代器对象
2 迭代器对象一定是可迭代的对象
3 调用obj.__iter__()方法,得到的是迭代器对象(对于迭代器对象,执行__iter__得到的仍然是它本身)
d={'name':'egon','age':18,'sex':'male'}
d_iter=d.__iter__()
f=open('a.txt','w',encoding='utf-8')
f_iter=f.__iter__().__iter__().__iter__().__iter__()
print(f_iter is f)
d={'name':'egon','age':18,'sex':'male'}
d_iter=d.__iter__()
print(d_iter.__next__())
print(d_iter.__next__())
print(d_iter.__next__())
print(d_iter.__next__())
迭代器d_iter没有值了,就会抛出异常StopIteration
f=open('a.txt','r',encoding='utf-8')
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
f.close()
l=['a','b','c'] l_iter=l.__iter__() print(l_iter.__next__()) print(l_iter.__next__()) print(l_iter.__next__()) print(l_iter.__next__())
d={'name':'egon','age':18,'sex':'male'}
d_iter=iter(d) #d_iter=d.__iter__()
len(obj) 等同于obj.__len__()
1.1.6 for循环
while True:
try:
print(next(d_iter)) #print(d_iter.__next__())
except StopIteration:
break
print('=>>>')
print('=>>>')
print('=>>>')
print('=>>>')
for循环详解:
1、调用in后的obj_iter=obj.__iter__()
2、k=obj_iter.__next__()
3、捕捉StopIteration异常,结束迭代
d={'name':'egon','age':18,'sex':'male'}
for k in d:
print(k)
1.1.7 总结迭代器的优缺点:
1.1.7.1 优点:
1、提供一种统一的、不依赖于索引的取值方式,为for循环的实现提供了依据
2、迭代器同一时间在内存中只有一个值——》更节省内存,
1.1.7.2 缺点:
1、只能往后取,并且是一次性的
2、不能统计值的个数,即长度
l=[1,2,3,4,5,6] l[0] l[1] l[2] l[0] l_iter=l.__iter__() # print(l_iter) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(next(l_iter))
l_iter=l.__iter__() print(next(l_iter)) print(next(l_iter)) print(next(l_iter)) print(len(l_iter))
1.2 生成器
1.2.1 什么是生成器:
只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
def func():
print('=====>1')
yield 1
print('=====>2')
yield 2
print('=====>3')
yield 3
生成器就是迭代器
g=func()
res1=next(g)
print(res1)
res2=next(g)
print(res2)
res3=next(g)
# print(res3)
1.2.2 yield的功能:
1、yield为我们提供了一种自定义迭代器对象的方法
2、yield与return的区别1:yield可以返回多次值 #2:函数暂停与再继续的状态是由yield帮我们保存的
obj=range(1,1000000000000000000000000000000000000000000000000000000000000000,2) obj_iter=obj.__iter__() print(next(obj_iter)) print(next(obj_iter)) print(next(obj_iter)) print(next(obj_iter)) print(next(obj_iter))
def my_range(start,stop,step=1):
while start < stop:
yield start #start=1
start+=step #start=3
g=my_range(1,5,2)
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
for i in my_range(1,5,2):
print(i)
1.2.3 小练习::tail -f access.log | grep '404'
import time
def tail(filepath):
with open(filepath,'rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if line:
yield line
else:
time.sleep(0.05)
def grep(lines,pattern):
for line in lines:
line=line.decode('utf-8')
if pattern in line:
yield line
lines=grep(tail('access.log'),'')
for line in lines:
print(line)
1.2.4 yield表达式形式的用法(了解知识点)
def eater(name):
print('%s ready to eat' %name)
food_list=[]
while True:
food=yield food_list#food=yield='一盆骨头'
food_list.append(food)
print('%s start to eat %s' %(name,food))
e=eater('alex')
#首先初始化:
print(e.send(None)) # next(e)
#然后e.send:1 从暂停的位置将值传给yield 2、与next一样
print(e.send('一桶泔水'))
print(e.send('一盆骨头'))
1.3 追加文件
with open('access.log','a',encoding='utf-8') as f:
f.write('bbbbb 404\n')
f.flush()
1.4 面向过程编程
grep -rl 'python' /etc
补充:os.walk
import os
g=os.walk(r'D:\video\python20期\day4\a')
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
for pardir,_,files in g:
for file in files:
abs_path=r'%s\\%s' %(pardir,file)
print(abs_path)
1.4.1 分析一:
1.4.1.1 第一步:拿到一个文件夹下所有的文件的绝对路径
import os
def search(target): #r'D:\video\python20期\day4\a'
while True:
filepath=yield #fllepath=yield=r'D:\video\python20期\day4\a'
g=os.walk(filepath)
for pardir, _, files in g:
for file in files:
abs_path = r'%s\%s' % (pardir, file)
# print(abs_path)
target.send(abs_path)
search(r'D:\video\python20期\day4\a')
search(r'D:\video\python20期\day4')
1.4.1.2 第二步:打开文件拿到文件对象f
def opener():
while True:
abs_path=yield
print('opener func--->',abs_path)
target=opener()
next(target) #target.send('xxxx')
g=search(target)
next(g)
g.send(r'D:\video\python20期\day4\a')
1.4.2 分析二:
1.4.2.1 第一步:拿到一个文件夹下所有的文件的绝对路径
import os
def init(func):
def inner(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return inner
@init
def search(target): # r'D:\video\python20期\day4\a'
while True:
filepath = yield
g = os.walk(filepath)
for pardir, _, files in g:
for file in files:
abs_path = r'%s\%s' % (pardir, file)
#把abs_path传给下一个阶段
target.send(abs_path)
1.4.2.2 第二步:打开文件拿到文件对象f
@init
def opener(target):
while True:
abs_path = yield
with open(abs_path,'rb') as f:
#把(abs_path,f)传给下一个阶段
target.send((abs_path,f))
1.4.2.3 第三步:读取f的每一行内容
@init
def cat(target):
while True:
abs_path,f=yield
for line in f:
#把(abs_path,line)传给下一个阶段
res=target.send((abs_path,line))
#满足某种条件,break掉for循环
if res:
break
1.4.2.4 第四步:判断'python' in line
@init
def grep(target,pattern):
pattern = pattern.encode('utf-8')
res=False
while True:
abs_path,line=yield res
res=False
if pattern in line:
#把abs_path传给下一个阶段
res=True
target.send(abs_path)
1.4.2.5 第五步:打印文件路径
@init
def printer():
while True:
abs_path=yield
print('<%s>' %abs_path)
g=search(opener(cat(grep(printer(),'python')))) #'python' in b'xxxxx'
g.send(r'D:\video\python20期\day4\a')
面向过程编程:核心是过程二字,过程指的就是解决问题的步骤,即先干什么后干什么,基于该思路编写程序就好比设计一条流水线,是一种机械式的思维方式
1.4.3 面向过程编程优缺点
优点:
复杂的问题流程化、进而简单化
缺点:
可扩展性差
1.5 三元表达式
def my_max(x,y):
if x >= y:
return x
else:
return y
x=10
y=20
# res=x if x >= y else y
# print(res)
name=input('>>: ').strip()
res='Sb' if name == 'alex' else 'NB'
print(res)
1.6 列表推导式与生成器表达式
1.6.1 列表推导式
l=[]
for i in range(1,11):
res='egg'+str(i)
l.append(res)
print(l)
l=['egg'+str(i) for i in range(1,11)]
print(l)
l1=['egg'+str(i) for i in range(1,11) if i >= 6]
print(l1)
l1=[]
for i in range(1,11):
if i >= 6:
l1.append('egg'+str(i))
1.6.2 生成器表达式
g=('egg'+str(i) for i in range(0,1000000000000000000000000000000000))
print(g)
print(next(g))
print(next(g))
print(next(g))
1.6.3 练习
names=['egon','alex_sb','wupeiqi','yuanhao']
names=[name.upper() for name in names]
print(names)
sbs=[name for name in names if name.endswith('sb')]
print(sbs)
obj=list('abcdef')
print(obj)
print(max([1,2,3,4,5]))
g=(i for i in range(10))
print(max(g))
print(max(g))
with open('a.txt','r',encoding='utf-8') as f:
l=[]
for line in f:
# print(len(line))
l.append(len(line))
g=(len(line) for line in f)
res=max(g)
print(res)
print(max(len(line) for line in f))
print(sum(len(line) for line in f))
1.7 递归调用:
在调用一个函数的过程中,直接或者间接又调用该函数本身,称之为递归调用
1.7.1 递归必备的两个阶段:
1、递推
2、回溯
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
def func(n):
print('---->',n)
func(n+1)
func(0)
def bar():
print('from bar')
func()
def func():
print('from func')
bar()
func()
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
age(n)=age(n-1)+2 # n > 1
age(1) = 18 #n = 1
def age(n):
if n == 1:
return 18
return age(n-1) + 2
res=age(5)
print(res)
l=[1,[2,[3,[4,[5,[6,[7,]]]]]]]
def func(l):
for item in l:
if type(item) is list:
func(item)
else:
print(item)
def func():
print('===>')
func()
func()
1.8 二分法(了解的知识点)
l=[1,2,10,30,33,99,101,200,301,402] #从小到大排列的数字列表
def binary_search(l,num):
print(l)
if len(l) == 0:
print('not exists')
return
mid_index=len(l) // 2
if num > l[mid_index]:
#往右找
binary_search(l[mid_index+1:],num)
elif num < l[mid_index]:
#往左找
binary_search(l[0:mid_index],num)
else:
print('find it')
# binary_search(l,301)
binary_search(l,302)
1.9 匿名函数
def func(): #func=内存地址
print('from func')
func()
func()
def my_sum(x,y):
return x+y
print(lambda x,y:x+y) print((lambda x,y:x+y)(1,2))
func=lambda x,y:x+y # print(func) print(func(1,2))
max,min,sorted,map,reduce,filter
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
print(max(salaries))
s='hello' l=[1,2,3] g=zip(s,l) # print(g) print(list(g))
g=zip(salaries.values(),salaries.keys())
# print(list(g))
print(max(g))
def func(k):
return salaries[k]
print(max(salaries,key=func)) #key=func('egon')
print(max(salaries,key=lambda k:salaries[k])) #key=func('egon')
print(min(salaries,key=lambda k:salaries[k])) #key=func('egon')
sorted
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
print(sorted(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))
map,reduce,filter
names=['alex','wupeiqi','yuanhao']
l=[]
for name in names:
res='%s_SB' %name
l.append(res)
print(l)
g=map(lambda name:'%s_SB' %name,names)
# print(g)
print(list(g))
names=['alex_sb','wupeiqi_sb','yuanhao_sb','egon']
g=filter(lambda x:x.endswith('sb'),names)
print(g)
print(list(g))
from functools import reduce print(reduce(lambda x,y:x+y,range(1,101),100))
1.10 内置函数(了解)
print(abs(-1))
print(all([1,'a','b',0])) print(all([]))
print(any([None,False,0,1])) print(any([]))
print(bin(11)) print(hex(11)) print(oct(11))
print('xxx'.encode('utf-8'))
print(bytes('xxx',encoding='utf-8'))
print(callable(max))
print(chr(65))
# print(chr(90))
# print(chr(39))
print(ord('A'))
print(ord('@'))
import os
print(dir(os))
s=set({1,2,3})
s.add(4)
print(s)
s=frozenset({1,2,3}) #不可变集合
print(hash('xxx'))
l=[1,2,'a',4] print(list(reversed(l)))
s=slice(1,5,2) l=['a','b','c','d','e']
# print(l[1:5:2]) # print(l[1:5:2]) print(l[s])
print(vars() is locals())
obj.__dict__() #vars(obj)
1.11 面向对象
classmethod
staticmethod
property
hasattr
getattr
setattr
delattr
isinstance
issubclass
object
super
import
__import__
choice=input('>>: ')
print(choice,type(choice))
# import 'time'
m=__import__(choice)
m.sleep(10)
1.12 掌握:
1.12.1 divmod
# print(divmod(10011,25))
1.12.2 enumerate
l=['a','b','c']
for i in l:
print(l.index(i),i,)
for i,v in enumerate(l):
print(i,v)
1.12.3 eval:
res=eval('[1,2,3]')
print(res,type(res))
res=exec('[1,2,3]')
print(res)
1.12.4 pow
res=pow(2,3,3) # (2 ** 3 )%3 print(res)
1.12.5 round
print(round(3.5))
迭代器与函数Python学习(四)的更多相关文章
- partial函数-python学习
一个函数可以有多个参数,而在有的情况下有的参数先得到,有的参数需要在后面的情景中才能知道,python 给我们提供了partial函数用于携带部分参数生成一个新函数. def add(a,b,c=2) ...
- Python学习(四):模块入门
1.模块介绍 模块:代码实现的某个功能的集合 模块分类: 自定义模块 内置标准模块 开源模块 模块的常用方法: 是否为主文件:__name__ == '__main__' 如果是直接执行的某程序,那么 ...
- python学习四(处理数据)
head first python中的一个数据处理的例子 有四个U10选手的600米成绩,请取出每个选手跑的最快的3个时间.以下是四位选手的9次成绩 James 2-34,3:21,2.34,2.45 ...
- Python学习(四) Python数据类型:序列(重要)
插播一下,先了解一下Python的数据类型,Python现有的数据类型有好多,最重要的有列表.元组.字典 列表:我觉得可以对应java中的数组 list=['physics', 'chemistry' ...
- Python学习四|变量、对象、引用的介绍
变量 变量创建:一个变量也就是变量名,就像a,当代码第一次赋值时就创建了它.之后的赋值将会改变已创建的变量名的值,从技术上讲,Python在代码运行之前先检测变量名,可以当成是最初的赋值创建了变量. ...
- Python学习系列(四)(列表及其函数)
Python学习系列(四)(列表及其函数) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) Python学习系列(三)(字符串) 一.基本概念 1,列表是什么? ...
- Python学习总结:目录
Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...
- Python学习之路【目录】
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! 目录: Python学习[第一篇]python简介 Python学习[第二篇]p ...
- Python学习笔记(15)- os\os.path 操作文件
程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...
随机推荐
- Windows Phone 编程: 摇一摇 效果
Step 1: 下载摇晃手势开发库 http://create.msdn.com/en-us/edu ... ake_Gesture_LibraryStep 2: 解压后进入 ShakeGesture ...
- 脚本编写 nginx 启动
#!bin/bash#功能:本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本.#如果本脚本命名为/etc/init.d/nginx,则 service ...
- ubuntu16.04 国内源(网易、阿里)
ubuntu16.04 网易源 deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiversedeb htt ...
- Python的基础知识01 _个人笔记
1.快捷键:Alt+n 回到上一条语句>把上一条语句复制 Alt+p 去到下一条语句 2.Python 中不用“:”来表示一个语句 3.print("I Love you" ...
- DedeCMS用channelartlist调用顶级栏目及列表
这个标签全局都可使用,可以减少多次使用 {dede:arclist typeid=‘栏目ID’titlelen='60' row='10'}.除了宏标记外,{dede:channelartlist}是 ...
- Project Euler 30 Digit fifth powers
题意:判断一个数 N 的每一位的5次方的和是否为其本身 ,求出所有满足条件的数的和 思路:首先设这个数 N 为 n 位,可以简单的判断一下这个问题的上界 10 ^ n <= 9 ^ 5 × n, ...
- 3.2、Ansible单命令测试
0.Ansible的group支持all.通配符(*).IP地址 1.查看Ansible的版本 $ ansbile --version [root@test ~]# ansible --versi ...
- .net 技术基础
C#常见运算符 一元运算符(+.-.!.~.++.--) 算术运算符(*./.%.+ . – ) 移位运算符(<< .>> ) 关系和类型测试运算符(==.!=.<.&g ...
- Problem 7
Problem 7 # Problem_7.py """ By listing the first six prime numbers: 2, 3, 5, 7, 11, ...
- Emgu cv人脸检测识别
Emgu cv人脸检测识别 1.开发平台:WIN10 X64 VS2012 Emgucv版本:3.1 2.先给大家分享一个官网给的示例源代码: https://ncu.dl.sourcef ...