python学习第四天笔记整理
一、迭代器及生成器
#迭代器:迭代的工具
#1 什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值
# while True:
# print('=====>')
# l=['a','b','c']
# count=0
# while count < len(l):
# print(l[count])
# count+=1
#2 为什么要有迭代器?
#对于序列类型:str,list,tuple,可以依赖索引来迭代取值,
# 但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式-》迭代器
#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__
#4 迭代器对象(文件是):obj.__iter__,obj.__next__
# f.__iter__
# f.__next__
#总结:
#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__()
#
# 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、提供一种统一的、不依赖于索引的取值方式,为for循环的实现提供了依据
#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 什么是生成器:只要在函数体内出现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)
#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)
#小练习::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'),'404')
#
# for line in lines:
# print(line)
#了解知识点: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('一盆骨头'))
二、面向过程编程
#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)
#分析一:
# #第一步:拿到一个文件夹下所有的文件的绝对路径
# 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')
#
#
# #第二步:打开文件拿到文件对象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')
#分析二:
# 第一步:拿到一个文件夹下所有的文件的绝对路径
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)
# 第二步:打开文件拿到文件对象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))
#第三步:读取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
#第四步:判断'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)
#第五步:打印文件路径
@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、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)
2、列表推导式与生成器表达式
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、递推 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()
五、二分法
,,,,,,,,,] :
print(:],num)
elif num < l[mid_index]:
:mid_index],num)
else:
print()
六、匿名函数
,),
七、内置函数
#了解
# 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())
#面向对象
classmethod
staticmethod
property
hasattr
getattr
setattr
delattr
isinstance
issubclass
object
super
# obj.__dict__() #vars(obj)
#__import__
# choice=input('>>: ')
# print(choice,type(choice))
#
# # import 'time'
# m=__import__(choice)
# m.sleep(10)
#掌握:
#divmod
# print(divmod(10011,25))
#enumerate
# l=['a','b','c']
# for i in l:
# print(l.index(i),i,)
# for i,v in enumerate(l):
# print(i,v)
#eval:
# res=eval('[1,2,3]')
# print(res,type(res))
# res=exec('[1,2,3]')
# print(res)
#pow
# res=pow(2,3,3) # (2 ** 3 )%3
# print(res)
#round
# print(round(3.5))
python学习第四天笔记整理的更多相关文章
- python学习第四次笔记
python学习第四次记录 列表list 列表可以存储不同数据类型,而且可以存储大量数据,python的限制是 536870912 个元素,64位python的限制是 1152921504606846 ...
- python学习第四讲,python基础语法之判断语句,循环语句
目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
- Python学习(四)数据结构(概要)
Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types int float Text Sequence ...
- python学习-第四天补充-面向对象
python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...
- python学习第四十八天json模块与pickle模块差异
在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点 跨语言,体积小 缺点 只能支持 int st ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- 《Python学习手册》读书笔记
之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...
随机推荐
- 富文本编辑器 CKeditor 配置使用 (带附件)
Ckeditor下载地址:http://ckeditor.com/download 1.CKeditor的基本配置 var textval=CKEDITOR.instances.TextArea1.g ...
- appium+夜神模拟器+python安卓app爬虫初体验
环境搭建:Windows 7 64bit jdk包:jdk-8u171-windows-x64.exe(http://www.oracle.com/technetwork/java/javase/do ...
- PHP 构造方法 __construct()和PHP 析构方法 __destruct()
PHP 构造方法 __construct() 允许在实例化一个类之前先执行构造方法. 构造方法 构造方法是类中的一个特殊方法.当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须 ...
- ucore-lab1-练习6report
练习6--完善中断初始化和处理 1. 中断向量表中一个表项占多少个字节?其中哪几位代表中断处理代码的入口? 答:系统将所有的中断事件统一进行编号(0-255),这个编号称为中断向量.中断向量表的一个 ...
- c#: .net framework 2.0支持扩展方法的办法
c#之扩展方法是个好方法,可惜只在.net framework 3.5及以上版本中用. 2.0版本若用,其编译报错如下: 错误 无法定义新的扩展方法,因为找不到编译器所需的类型“System.Runt ...
- echarts水球
教程网址:https://echarts.baidu.com/blog/2017/02/21/echarts-liquidfill-chart-tutorial.html DEMO网址(引入js在di ...
- JS 中常见数组API使用方法(join、concat、slice、splice、reverce)
刚接触前端不久,个人觉得学习程序还是需要经常总结的.下面是我的一些知识的归纳总结,如果哪里说得不对的还请各位大神指点! 1.to str (1)String(arr)将数组中的每个元素转为字符串并用逗 ...
- zabbix的api接口
zabbix官方文档解释,api是开发者能获得修改zabbix配置,获取历史数据.主要用于: 1.创建新应用 2.集成zabbix与第三方软件 3.自动运行任务 运用JSON-RPC2.0协议,因此接 ...
- robotframework 连接mysql数据库
1.安装databaselibrary.pymysql 通过cmd命令执行:pip install robotframework-databaselibrary 通过cmd命令执行:pip insta ...
- vuex状态管理
msvue组件间通信时,若需要改变多组件间共用状态的值.通过简单的组件间传值就会遇到问题.如:子组件只能接收但改变不了父组件的值.由此,vuex的出现就是用作各组件间的状态管理. 简单实例:vuex的 ...