day4
迭代器:
1.
li=[11,22,33,44,55,66,77]
count =len(li)
start = 0
while count>start:
print(li[start])
start +=1
用索引,所有语言几乎都支持while
2.for循环的本质
a.创建一个特殊的东西(迭代器 = iter() )
b.根据这个东西,去操作列表Li的内容
c.执行迭代器会返回一个对象,对象是含有next方法
d.一个一个的去内存取li里面的值
obj = iter(li)
while Ture:
item = obj__next__()
item(item)
去完就会报stop...(for 循环不报错是因为try except Exception: )
3.总结:
a.while,索引,下标取数据,随意取
b.for, 执行迭代器iter,获取一个对像-->执行对象的next方法,按顺序拿
生成器(非常重要)
1.python 2.7 里
range(10) —>内存立马创建0-9,如果数字大,吃内存
xrange(10)—>内存里没有数字
for i in xrange(10):
内存第一次循环时先创建i= 0
内存第二次循环内存里创建i=1
。。。。。。。。。。。。。。
内存第九次循环内存里创建i=9
print (i)
2.
redis———hash(哈希)
监控 www.baidu.com 每个时段的流量数据
结构:hash(哈希)
n1———k1 = v1
n2———k11 = v11
key value
服务器100G 本地电脑10G
dic.keys() #全部获取
3.文件操作
f = open(‘file.log’)
#f.read() # 会一下子把日子读入内存
for line in f : #触发f的__inter__方法
print(line) #生成器,内存消耗问题解决了
def show():
yield(line1)
yield(line2)
yield(line3)
my_f = show()
for line in my_f:
print(line)
4.yield 关键词
-------------
def show(): #函数
return 123
i = show()
print(i)
输出 123
-------------
def show(): #生成器
yield 123
i = show()
print(i)
输出 generator
5.总结:
def show():
yield(line1)
yield(line2)
yield(line3)
my_f = show()
for line in my_f:
print(line)
‘’’
line1
line2
line3
’’’’
-----运行逻辑-----
1.如果函数返回含有yield,函数返回值特殊的东西(含有next方法;必须和for一起使用)
2.for,函数返回特殊东西,内部执行迭代,如果遇到yield,就会把yield后面的值拿到就跳出函数的同时并记住上次
执行的位置,同时把该值赋值给for 的i
3.然后再继续执行函数,回到上一次执行代码的位置,继续往下执行
-----简单理解-----
1.生成器的返回值必须通过迭代器执行
2.yield冻结状态,记住上一次执行的位置
装饰器
def login(func): func=原来的show
def wrapper(*arg,**kwargs):
print(‘before’)
ret =func((*arg,**kwargs)
print(ret)
print(‘after’)
return tet
return wrapper
def show()
return ‘show’
#show 内存值 show()执行函数
new_show = login(show)
‘’’
相当于
def new_show():
ret = show(*arg,**kwargs)
return ret
‘’’
--------
@login
def show()
return ’show’
功能上实现了一个嵌套
递归
正则表达式
基础算法
常用模块:json pickle