python中raise stoplteration_推导表达式迭代器生成器模块和包 | 编程电脑技术交流...

魔法方法需要特定的条件去触发

有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

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

# 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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值