day13迭代器与生成器
三个作业:
# 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
login_dic = {'alex':False}
def login(func):
def inner(*args,**kwargs):
if not login_dic['alex']:
usrname = input('用户名 : ')
passwd = input('密 码 : ')
with open('userinfo') as f:
for line in f:
line = line.strip()
usr,pwd = line.split(' ')
if usrname.strip() == usr and passwd.strip() == pwd:
print('登陆成功')
login_dic[usrname] = True
if login_dic['alex']:
ret = func(*args,**kwargs)
return ret
return inner @login
def home():
print('欢迎来到home页') # home()
# home()
# home()
# 2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
def log(func):
def inner(*args,**kwargs):
with open('func.log','a+',encoding='utf-8') as f:
f.write('%s被调用了\n'%func.__name__)
ret = func(*args,**kwargs)
return ret
return inner @log
def func1():
print('我是func1') @log
def func2():
print('我是func2') func1()
func1()
func2() #如果这个网页没有被爬取过,就真的去访问这个网页,否则,返回之前访问的时候存在文件中的内容
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 #装饰器:
# 在不修改一个函数的调用方式的前提下载一个函数的前后添加功能
#装饰器的本质:闭包函数
装饰器三个作业
一、迭代器
内部含有__iter__方法的数据类型 就是可迭代的对象 —— 可迭代协议
迭代器你可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
#列表 字典 元祖 字符串 集合
# 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__()
# 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循环就够了
二、生成器 生成器就是迭代器
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
import time
def genrator_fun1():
a = 1
print('现在定义了a变量')
yield a
b = 2
print('现在又定义了b变量')
yield b g1 = genrator_fun1()
print('g1 : ',g1) #打印g1可以发现g1就是一个生成器
print('-'*20) #我是华丽的分割线
print(next(g1))
time.sleep(1) #sleep一秒看清执行过程
print(next(g1))
制作衣服
def produce():
"""生产衣服"""
for i in range(2000000):
yield "生产了第%s件衣服"%i product_g = produce()
print(product_g.__next__()) #要一件衣服
print(product_g.__next__()) #再要一件衣服
print(product_g.__next__()) #再要一件衣服
num = 0
for i in product_g: #要一批衣服,比如5件
print(i)
num +=1
if num == 5:
break
斐波那契数列
def f1():
a = 1
yield a
b = 1
yield b
while True:
c = a + b
yield c
a = b
b = c
n = 1
for i in f1():
print(i)
n +=1
if n ==10:
break # 取前十个
day13迭代器与生成器的更多相关文章
- DAY13 迭代器与生成器
一.迭代器 定义:器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 优点:不依赖索引,完成取值 缺点:不能计算长度,不能指定位取值(只 ...
- python学习 day13 迭代器,生成器,枚举对象
一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...
- day13: 迭代器和生成器
1,思考所有可以被for循环的:list,tuple,set,dict,range,enumerate,f,str,差不多了,为何这些数据类型可以被for循环呢? 2,一个标准的装饰器函数 from ...
- python 全栈开发,Day13(迭代器,生成器)
一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...
- 迭代器、生成器 day13
一 迭代器 迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口. for 循环str list tuple dict set 文件句柄可迭代: s ...
- day13 python学习 迭代器,生成器
1.可迭代:当我们打印 print(dir([1,2])) 在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...
- Python_迭代器、生成器、列表推导式,生成器表达式
1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
随机推荐
- [Python爬虫] 之十八:Selenium +phantomjs 利用 pyquery抓取电视之家网数据
一.介绍 本例子用Selenium +phantomjs爬取电视之家(http://www.tvhome.com/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字:融合:电视 抓 ...
- Managed Media Aggregation using Rtsp and Rtp
his article was written almost 2 years ago, it's content may not reflect the latest state of the cod ...
- Oracle数据类型,函数与存储过程
字符串类型 固定长度:char nchar n 表示Unicode编码 可变长度: varchar2 nvarchar2 数字类型:number(P,S)P:整数位数,S小数位数 ...
- LogManager
public class LogManager { // Fields public static bool Debugstate; // Methods public static void Log ...
- HTTP——HTTP 1.1的详细介绍 Gunicorn不支持HTTP 1.1
从前面一小节的表格里,我们可以看到,Gunicorn 的一个缺点是不支持HTTP 1.1.那么 HTTP 1.1 究竟是怎么一回事呢?我们选择 HTTP 服务器在什么情况下需要考虑对 HTTP 1.1 ...
- 【Python3 爬虫】14_爬取淘宝上的手机图片
现在我们想要使用爬虫爬取淘宝上的手机图片,那么该如何爬取呢?该做些什么准备工作呢? 首先,我们需要分析网页,先看看网页有哪些规律 打开淘宝网站http://www.taobao.com/ 我们可以看到 ...
- iOS学习笔记-自定义过渡动画
代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...
- poj 2409 Let it Bead Polya计数
旋转能够分为n种置换,相应的循环个数各自是gcd(n,i),个i=0时不动,有n个 翻转分为奇偶讨论,奇数时有n种置换,每种有n/2+1个 偶数时有n种置换,一半是n/2+1个,一半是n/2个 啃论文 ...
- (二)EasyUI 使用——常用组件
1. EasyUI常用组件的基本用法 1.1 layout布局 <!-- 布局面板 大小自适应父容器 --> <div data-options="fit:true&quo ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围 本章之前提到过. ...