day12 函数的使用方法:初识迭代器和生成器
生成器和迭代器比装饰器简单多了。。。
这是老师的博客地址:
http://www.cnblogs.com/Eva-J/articles/7213953.html
前情回顾:
#装饰器:
# 在不修改一个函数的调用方式的前提下载一个函数的前后添加功能
#装饰器的生成流程和用法
#自己写装饰器的情况比较少——面试、装饰器的机制 # def wrapper():pass
#
# @wrapper
# def func():pass #流畅的python
#能看懂 —— 别人写的好东西 你能知道 #装饰器的扩展
#周一下午考试
#周二下午:讲考试题、装饰器的扩展 #爬取一个网页
#如果这个网页没有被爬取过,就真的去访问这个网页,否则,返回之前访问的时候存在文件中的内容
from urllib.request import urlopen def wrapper(func):
def inner(*args,**kwargs):
with open('web','rb') as f:
web_content = f.read()
if not web_content:
web_content = func(*args,**kwargs)
with open('web','wb') as f:
f.write(b'aaaaaaaaa'+web_content)
return web_content
return inner # @wrapper
def get_url(url):
content = urlopen(url).read()
return content web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213953.html')
print(web_content)
# web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213954.html')
# print(web_content)
# web_content = get_url('http://www.cnblogs.com/Eva-J/articles/7213953.html')
# print(web_content)
#迭代器和生成器 #r 可读 文本操作模式
#w 可写 文本操作模式
#rb 直接操作二进制
#wb 直接操作二进制
# 当你拿到的是纯文字,就用文本操作模式
# 当你拿到的是字节,就用二进制操作的模式 # {'url':'文件名1','url2':''} os #装饰器:
# 在不修改一个函数的调用方式的前提下载一个函数的前后添加功能
#装饰器的本质:闭包函数
# @wrapper #get_url = wrapper(get_url)
# def get_url(url):
# content = urlopen(url).read()
# return content #login :了解原理 :三次登录
#log :必须会 :写到文件里 ——————
#web_content :进阶要求
迭代器
#迭代器
#列表 字典 元祖 字符串 集合
# for item in 'asfj':pass
# for i in 25:
# print(i)
#'iterable' 可迭代的
# print(dir([]))
# print(dir({}))
# print(dir(5))
#
# print('__iter__' in dir('abc'))
#内部含有__iter__方法的数据类型 就是可迭代的 —— 可迭代协议 ret = 'abc'.__iter__()
# print(ret)
'iterator' #迭代器
#__iter__
#迭代器你可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
#如何从迭代器中取值
# print(ret.__next__())
# print(ret.__next__())
# print(ret.__next__())
# print(ret.__next__()) #
# l = ['ha','hei','he']
# lst_iter = l.__iter__()
# print(lst_iter.__next__())
# print(lst_iter.__next__())
# print(lst_iter.__next__())
#迭代器的用法
#可迭代的 === 可迭代对象 python一切皆对象
#迭代器
# print(dir(l))
# print('__iter__' in dir(lst_iter))
# print('__next__' in dir(lst_iter))
# print(set(dir(lst_iter)) - set(dir(l)))
# lst_iter.__next__() #可迭代的 必须 含有 __iter__方法 #可迭代协议
#迭代器比可迭代的多一个 __next__方法
#迭代器:包含__next__,__iter__方法 #迭代器协议
# 包含__next__方法的可迭代对象就是迭代器
#迭代器是可迭代的 的一部分
#获得迭代器:可迭代的调用 __iter__()
#使用迭代器:迭代器.__next__() #如何判断一个变量是不是迭代器或者可迭代的
# print('__iter__' in dir([1,2,3,4]))
# print('__next__' in dir([1,2,3,4])) # from collections import Iterable
# from collections import Iterator
# print(isinstance([1,2,3,4],Iterable))
# str_iter = 'abc'.__iter__()
# print(isinstance(str_iter,Iterator))
# print(isinstance('abc',Iterable)) #可迭代的 : __iter__
#迭代器 : __iter__ 和__next__
#迭代器和可迭代的关系 :可迭代的包含迭代器
#迭代器和可迭代的判断 :两种方法 #迭代器的工作原理
l_iter = [1,2,3,4,5].__iter__()
#只是记录当前这个元素和下一个元素
# print('__iter__' in dir(range(10)))
# print('__next__' in dir(range(10)))
# range_iter = range(10).__iter__()
# print(range_iter.__next__())
# print(range_iter.__next__())
#迭代器的特点 —— 迭代器是个好东西
#惰性运算
#从前到后一次去取值,过程不可逆 不可重复
#节省内存 # for item in [1,2,3]:
# pass #list_iter = [1,2,3].__iter__()
#list_iter.__next__() #用while循环模拟for循环的方式 —— for循环是依赖迭代器的,且我们自己也可以仿照着写
# l = [1,2,3,4,5]
# l_iter = l.__iter__()
# while True:
# try:
# print(l_iter.__next__())
# except StopIteration:
# break #for循环是让我们更简单的使用迭代器
#用迭代器取值就不需要关心索引或者key的问题了 #迭代器是个好东西
#目前我们已知的可迭代的都是python提供给我们的
#range()
#f
#enumerate()
#在平时写代码的过程中,我们用for循环就够了 #我自己想写个可迭代的,——生成器
#生成器的本质就是迭代器
#因此生成器的所有好处都和迭代器一样
#但是 生成器是我们自己写的python代码
#生成器的实现由两种方式:
#1.生成器函数
#2.生成器表达式
# def func():
# return ['衣服1','衣服2000000']
#
# ret = func()
# print(ret) #基本数据类型
#文件处理
#函数
#装饰器
#迭代器
#生成器函数 #大作业
# http://www.cnblogs.com/Eva-J/articles/7776508.html
生成器
#我自己想写个可迭代的,——生成器
#生成器的本质就是迭代器
#因此生成器的所有好处都和迭代器一样
#但是 生成器是我们自己写的python代码
#生成器的实现由两种方式:
#1.生成器函数
#2.生成器表达式
# def func():
# return ['衣服1','衣服2000000']
#
# ret = func()
# print(ret) # def g_func():
# yield 1
#
# g = g_func()
# print(g)
# #generator 生成器 ---> 迭代器
# print(g.__next__())
#生成器函数和普通函数之间的区别
#生成器函数中含有yield关键字
#生成器函数调用的时候不会立即执行,而是返回一个生成器 def g_func():
print('aaaa')
yield 1
print('bbbb')
yield 2
yield 3
#
# g = g_func()
# for i in g:
# print(i)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__()) def cloth():
for i in range(1000000):
yield '衣服%s'%i g = cloth()
for i in range(50):
print(g.__next__()) for i in range(50):
print(g.__next__()) #生成器函数还有一些应用
#生成器表达式






















day12 函数的使用方法:初识迭代器和生成器的更多相关文章
- day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数
本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- Python之函数目录(自定义函数,内置函数,装饰器,迭代器,生成器)
1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数 9.函数相关定义 10.三元表达式.列表推导式.生成器表达式 11.函数与方法的区别
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- python基础-函数之装饰器、迭代器与生成器
1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def f ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
随机推荐
- iOS9 新功能:Support Universal Links,iOS10 openUrl新函数
先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...
- est是基于less的样式工具库
网址:http://ecomfe.github.io/est/ 此处HTML中如果直接引用less就会报错! est 如果直接引用less和js 是会报错的 样式规范:https://www.zybu ...
- Confluence 6 使用 JConsole 监控远程 Confluence
针对生产系统中,我们推荐你使用远程监控,这个将不会消耗你远程 Confluence 服务器的资源. 启动远程监控: 添加下面的属性到 setenv.sh / setenv.bat 文件中,端口你可以定 ...
- Socket网络编程(一)
1.什么是网络通讯?(udp.tcp.netty.mina) udp:漂流瓶,每个人都可以向大海里面扔漂流瓶,不管有没有人捡到.(不管接收方有没有,我只往指定的地址发送东西,64kb以内) tcp:电 ...
- shell 按序删除文件
一.按时间排序 cd /data/wosbak/hrs/pre/ && ls -A -t | awk '{if(NR>15){print $9}}' | xargs rm -rf ...
- C# Enum,Int,String的互相转换 [转]
C# Enum,Int,String的互相转换 Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名 ...
- jquery自定义事件
触发事件: $(document).trigger('REMOVE_WEBSITE_MSG'); 判断消息条数为0,触发这个
- 【bzoj2023/1630】[Usaco2005 Nov]Ant Counting 数蚂蚁 dp
题解: 水题 f[i][j] 前i种用了j个,前缀和优化就可以了
- UIImageView的常用方法
//初始化 init(image: UIImage!) @availability(iOS, introduced=3.0)//初始化,highlightedImage 高亮图片 init(image ...
- ASP.NET machineKey的作用和使用方法
ASP.NET machineKey的作用 如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败.如果此应用程序由网络场或群集承载,请确保 <machineKey> ...