推导表达式迭代器生成器模块和包

2019年5月1日17:51:42 发表评论 192 views
魔法方法需要特定的条件去触发
有next是迭代器
# li = []
# for i in range(1,10):
# li.append(i)
# print(li)
# --------------------------------------
# li = [i for i in range(1,10)] #必须掌握
# print(li)
# -----------------------------------------
#列表推导 + 条件判断 (必须掌握)
# li2 = [i*10 for i in range(1,10) if i%2 ==0]
# print(li2)
# --------------------------------------------
#列表推导+三目运算符 (必须掌握)
# li3 = [i*100 if i%3 ==0 else i*10 for i in range(1,10) ]
# print(li3)
# --------------------------------------------
#集合推导
# se = {i for i in range(1,10)}
# print(se)
# ---------------------------------------
#字典推导
a = [1,2,3,4,5,6,7]
# b = enumerate(a)#这个函数是什么意思
# di = {i:j for i,j in enumerate(a)}
# print(di)
迭代:
每一次循环都会自动让“迭代变量”指向“下一个元素”
the_list = [5,4,3,2,1,]
for index in the_list:
    print(index)
var = None
index = 0
while index < len(the_list):
    var = the_list[index]
    print(var)
    index +=1
迭代器:
生成迭代器的方法:
1, iterator = iter(li)
2, iterator = li.__iter__()
02, 迭代器对象本身需要支持以下两种方法,他们一起构成迭代器协议:
iterator.__iter__()     (使用dir查看只有这个的是可迭代对象)
iterator.__next__()   (使用dir查看有这个的是迭代器)
取值:
next(iterator)
iterator.__next__()
注意: 如果迭代器取值完之后,会返回Stoplteration错误
从可迭代对象生成一个迭代器:
迭代器 = iter(可迭代对象)
下个值 = next(迭代器)
for实现原理:
li4 = [1,2,3,4,5,6,7,8,9,10]
it = iter(li4)#首先将一个对象变成可迭代类型
while True:
    try:
    var = next(it)    #一个一个取值
    print(var)
except StopIteration:   #直到没有值,就跳出循环
    break
自定义迭代器(掌握原理):
class Testlter:
    def __init__(self,li):
        self.li = li
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.index < len(self.li):
            index  = self.li[self.index]
            self.index += 1
            return index
        else:
            raise StopIteration
简单原理记忆:
首先定义init来传入参数
然后必须用iter来生成迭代器
然后要有next来返回当前运行到哪个index了
next里超出len以后就抛出异常
生成器:
方法一:列表推导式的[]改成()
b = (x for x in range(10))
print(next(b))
print(next(b))
print(next(b))
方法二:在函数里面加上yield
def func(num):
    a = 0
    while a<num:
        yield a
        a +=1
ge = func(10)
print(next(ge))
print(next(ge))
print(next(ge))
print(next(ge))
生成器不会一下子把所有内容生成出来,在我们需要的时候用next()去生成,可以节省内存空间
yield运行规则
注意:
yield表达式只能在函数中使用
yield表达式可以使函数成为一个生成器
yield可以返回表达式结果,并且暂停函数执行,直到next激活下一个yield
简单理解生成器就是一个迭代器
python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果,从而节省了大量空间,这
也是生成器的主要好处。
模块:
在python中,模块就是一个py文件,可以使用下面两种方法导入
import datetime
from datetime import datetime (as dm)
在同一目录下,可直接使用上面两种方法导入
在不同目录下,需要使用sys.path添加路径
sys.path.append('path')
在python3中导入后,在当前路径下会生成一个__pycache__文件夹
斐波那契:
def feibonaqi(i,n):
i1 = 0
i2 = i
count = 0
while True:
if count < n:
count +=1
b = i1+i2
i1 = i2
i2 = b
yield b
else:
break
import feibo
aa = feibo.feibonaqi(1,20)
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))
# li = []
# for i in range(1,10):
# li.append(i)
# print(li)
# --------------------------------------
# li = [i for i in range(1,10)] #必须掌握
# print(li)
# -----------------------------------------
#列表推导 + 条件判断 (必须掌握)
# li2 = [i*10 for i in range(1,10) if i%2 ==0]
# print(li2)
# --------------------------------------------
#列表推导+三目运算符 (必须掌握)
# li3 = [i*100 if i%3 ==0 else i*10 for i in range(1,10) ]
# print(li3)
# --------------------------------------------
#集合推导
# se = {i for i in range(1,10)}
# print(se)
# ---------------------------------------
#字典推导
a = [1,2,3,4,5,6,7]
# b = enumerate(a)#这个函数是什么意思
# di = {i:j for i,j in enumerate(a)}
# print(di)
# -------------------------------------
# the_list = [5,4,3,2,1,]
# for index in the_list:
# print(index)
#
# var = None
# index = 0
# while index < len(the_list):
# var = the_list[index]
# print(var)
# index +=1
#for 实现原理:
# li4 = [1,2,3,4,5,6,7,8,9,10]
# it = iter(li4)#首先将一个对象变成可迭代类型
# while True:
# try:
# var = next(it)#
# print(var)
# except StopIteration:
# break
# 自定义迭代器:
# class Testlter:
# def __init__(self,li):
# self.li = li
# self.index = 0
# def __iter__(self):
# return self
# def __next__(self):
# if self.index < len(self.li):
# index = self.li[self.index]
# self.index += 1
# return index
# else:
# raise StopIteration
#生成器 1, 列表推导式的[]改成 ()
# b = (x for x in range(10))
# print(next(b))
# print(next(b))
# print(next(b))
# 2,在函数里加上yield
# def func(num):
# a = 0
# while a<num:
# yield a
# a +=1
# ge = func(10)
# print(next(ge))
# print(next(ge))
# print(next(ge))
# print(next(ge))
import feibo
aa = feibo.feibonaqi(1,20)
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))
print(next(aa))

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: