电信网站备案流程图wordpress 来必力
news/
2025/9/23 20:36:47/
文章来源:
电信网站备案流程图,wordpress 来必力,网站开发工程师月薪,苏州公司网站1 迭代Iteration
迭代Iteration#xff1a;所谓迭代就是重复运行一段代码语句块的能力#xff0c;就好比在一个容器中进行一层一层遍历数据#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素#xff0c;直到容器中没有元素为止。迭代迭代所谓迭代就是重复运行一段代码语句块的能力就好比在一个容器中进行一层一层遍历数据在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素直到容器中没有元素为止。迭代迭代更新换代在上一次基础上更新成新的东西。
# 使用for循环迭代这个字符串其实就是我们说的遍历这个字符串
for i in hello world:print(i)
2 可迭代对象Iterable
2.1 什么是可迭代对象
可迭代对象Iterable可以被迭代的类型怎么判断是否可迭代
所有的类型只要有__iter__()方法就是可迭代的。我们现在已知的可迭代对象有strlisttuplerangesetdict_keysdict_valuesdict_items。
方法名前后有两个下划线的也叫魔法方法。 2.2 怎么判断可迭代对象
怎么去判断某个对象是否有__iter__()方法 用dir()函数来查询是否包含__iter__()方法 通过对象.方法的方式去调用看有没有__iter__方法 通过内置的实例对象函数isinstance()判断可迭代对象是Iterable类的实例返回True就说明是可迭代对象False则表示不是可迭代对象。isinstance()函数格式isinstance(object, class)。
# 用dir()函数打印数据的全部方法看看是否包含__iter__()方法
print(dir(list1))
# 查看某个元素或序列是否有.__iter__()方法有就是可迭代的对象
hello world.__iter__()
[2].__iter__()
(1,).__iter__()
{name:jack}.__iter__()
{name:jack}.keys().__iter__()
range(11).__iter__()
list1[]
a9
# 通过内置的实例对象函数isinstance()判断
from collections.abc import Iterable,Iterator
print(isinstance(list1,Iterable)) # 结果是True
print(isinstance(a,Iterable)) # 结果是False
3 迭代器Iterator
3.1 什么是迭代器 迭代器Iterator迭代器一定是可迭代对象迭代器中有两个特殊的方法是__iter__()和__next__()方法 创建迭代器的方法使用内置的iter()函数或者__iter__()方法来创建迭代器 举例 # 将列表转换为迭代器
list1[1,3,5,7,9]
it1iter(list1)
it2list1.__iter__()
print(type(it1))
print(type(it2))
# 打印迭代器中的数据每次只能打印一个元素有多少元素就需要打印多少次
# 用next()函数取迭代器中的数据
print(next(it1))
# 用__next__()方法取迭代器中的数据
print(it1.__next__())
print(it1.__next__())
print(it1.__next__())
print(it1.__next__())
# print(it1.__next__())
# print(it1.__next__()) 可迭代对象与迭代器关系示意图 举例a iter([4, 3, 6, 8]) 迭代器的特点是 迭代器一定是可迭代对象 迭代器通过next()函数或者__next__()方法取值每迭代一次取一个值只能往前取不能后退 当取完最后一个值的时候再执行next()函数或者__next__()方法会报StopIteration异常表示取完了。 3.2 怎么判断迭代器
判断一个对象是迭代器还是迭代对象可以使用以下两种方法 通过对象包含__iter__()和__next__()方法来判断 需要判断是迭代器还是迭代对象可以通过实例对象函数isinstance()进行判断迭代器和可迭代对象的对象类型分别是Iterator和Iterable都是collections.abc模块下
from collections.abc import Iterator,Iterable
# Iterator是判断是否是迭代器
# Iterable是判断是否是可迭代对象
print(isinstance(list1,Iterable)) #判断list1是否是可迭代对象返回True或False
print(isinstance(list1,Iterator)) #判断list1是否是迭代器返回True或False
print(isinstance(iter(list1),Iterator)) #True
print(isinstance(it1,Iterable)) #True
print(isinstance(it1,Iterator)) #True
#计算123...1000000000
#print(sum(list(range(1,1000000001))))
#print(sum(iter(range(1,1000000001))))
迭代器的优缺点 迭代器优点节省内存迭代器在内存中相当于只占一个数据的空间因为每次取值都会把上一条数据在内存中释放加载当前的此条数据。 迭代器的缺点不能直观的查看里面的数据。取值时不走回头路只能一直向下取值。 3.3 for循环的底层原理
for循环实现遍历的底层原理for循环将其都封装好了所以for循环in后面必须跟的是可迭代对象 for循环可以传入可迭代对象或者迭代器对象在循环的时候先调用可迭代对象的iter()函数来生成迭代器 调用迭代器的next()函数来迭代每个元素 当迭代完最后一个元素时再继续迭代会报StopIteration异常for循环捕捉到这个异常就知道已经迭代完了就结束循环。
for循环的实现原理 也可以用for循环去遍历迭代器。
4 生成器Generator
4.1 什么是生成器
生成器Generator在 Python 中生成器的本质就是一个迭代器使用了yield 的函数被称为生成器generator。 4.2 生成器怎么创建
创建生成器的方法 方法一 第一步定义一个包含yield语句的函数 第二步调用第一步创建的函数得到一个生成器
# 例1使用yield关键字把函数变成装饰器
def generator_1():yield 1# 创建生成器如下表示创建一个生成器赋值给gen
gengenerator_1()
print(type(gen))
# 在函数中可以使用多个yield
def generator_2():yield 1yield 2yield 3# 也可以一个yield语句返回多个值跟使用return类似此时将返回一个元组
def generator_3():yield 1, 2 方法二使用生成器推导式来创建生成器
# 例2通过生成器推导式创建生成器
print(type((i for i in range(11))))
print((i for i in range(11)))#是一个生成器对象
4.3 return与yield的区别
return的作用 给调用者返回值 执行遇到第一个return语句时就结束函数。
yield的作用 给调用者返回值 yield把函数变成了生成器 生成器运行时遇到yield后先返回再挂起 在函数中可以使用多个yield。 4.4 生成器的运行
带有 yield 的函数执行过程比较特别 调用该函数的时候不会立即执行代码而是返回了一个生成器对象 当使用next()函数或者__next__()方法作用于返回的生成器对象时函数开始执行在遇到 yield 的时候会『暂停』并返回当前的迭代值 也可以使用for循环来迭代生成器对象因为在for循环中会自动调用next()函数 当再次使用 next() 的时候函数会从原来『暂停』的地方继续执行直到遇到 yield语句如果没有 yield 语句则抛出异常
整个过程看起来就是不断地 执行-中断-执行-中断 的过程。一开始调用生成器函数的时候函数不会立即执行而是返回一个生成器对象然后当我们使用 next() 作用于它的时候它开始执行遇到 yield 语句的时候执行被中断并返回当前的迭代值要注意的是此刻会记住中断的位置和所有的变量值也就是执行时的上下文环境被保留起来当再次使用 next() 的时候从原来中断的地方继续执行直至遇到 yield如果没有 yield则抛出异常。简而言之就是 next() 使函数执行 yield 使函数暂停。
# 在定义函数时使用yield来返回值
def generator_1():yield 1yield 2yield 3
# 直接这个函数的调用结果得不到返回的值
print(generator_1())
# 使用next()函数或者__next__()方法来运行该函数但如下每次执行时都返回第一个值因为每次调用的时候都会创建一个生成器
print(next(generator_1()))
print(next(generator_1()))
print(generator_1().__next__())
# 可以调用一次函数对返回结果赋值给一个变量这样可以获取生成器所有返回的值
def generator_1():yield 1yield 2yield 3
# 调用函数返回一个生成器对象赋值给变量gt
gtgenerator_1()
# 通过next()函数来执行这个生成器对象
print(next(gt))
print(next(gt))
# 使用for循环执行生成器
for i in gt:print(i)
4.5 send()方法
通过send()方法也可以执行生成器同时可以向生成器传入值。
send()方法与next()函数的区别 send()方法与next()函数都用来执行生成器 send()方法会将传入的值赋给上次中断时yield语句的执行结果然后再执行生成器从而实现与生成器方法的交互 在执行生成器时如果第一次执行使用send()方法因为没有挂起的yield语句来接收传入的值所以会报TypeError异常。 简单地说 send() 方法就是 next() 函数的功能加上传值给 yield 。
# 例1第一次使用send()方法执行生成器
def generator_1():yield 1yield 2yield 3gt1generator_1()
# 如下代码会报错因为第一次需要先使用next()函数来执行生成器
print(gt1.send(100))
print(gt1.send(200))
# 例2第一次使用next()执行生成器第二次开始使用send()执行生成器并传入值
def generator_2():ayield 1byield ayield bcyield 2print(c)yield c
gt2generator_2()
# 首先使用next()函数执行生成器返回1之后挂起
print(next(gt2))
# 使用send()方法传入100给yield 1的执行结果也就是a然后再执行yield a返回100再挂起
print(gt2.send(100))
# 使用send()方法传入2.5给yield a的执行结果也就是b然后再执行yield b,返回2.5再挂起
print(gt2.send(2.5))
# 使用send()方法传入abc给yield b的执行结果但并没有引用他然后执行yield 2返回2再挂起
print(gt2.send(abc))
# 传入efg给yield 2的执行结果也就是c然后再打印c最后再执行yield c返回efg
print(gt2.send(efg))
4.6 生成器与迭代器的区别 生成器 生成器本身是一种特殊的迭代器也就是说生成器就是迭代器。 生成器会自动实现迭代器协议也就是说只要我们yield后自动就生成了next对象包括StopIteration等结构。 生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态保留足够的信息。对生成器函数的第二次或第n次调用跳转到函数上一次挂起的位置。生成器不仅“记住”了它的数据状态生成还记住了程序执行的位置。 迭代器 迭代器是一种支持next()操作的对象。它包含了一组元素当执行next()操作时返回其中一个元素 当所有元素都被返回后再执行next()报异常StopIteration 生成器一定是可迭代的也一定是迭代器对象。 它们的区别 迭代器是访问容器的一种方式也就是说容器已经出现。我们是从已有元素拓印出一份副本只为我们此次迭代使用。而生成器则是自己生成元素的。也就是前者是从有到有的复制而后者则是从无到有的生成。 在用法上生成器只需要简单函数写法配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做python给我们提供的特殊接口实现的迭代器。
最后附上一张图来解释容器、可迭代对象、迭代器、生成器之间的关系 4.7 生成器使用举例处理大量数据
生成器的优势在于在没有牺牲很多的速度情况下内存占用更小在一定的业务场景下支持大数据的操作。
举例通过列表和生成器分别处理1亿条数据对比
# 通过列表实现如下代码在执行时可观察电脑的内存使用情况内存会被占满
a []
for i in range(100000000):temp [你好]*2000a.append(temp)
[[你好你好...你好],[你好你好...你好],...,[你好你好...你好]]
for ele in a:# print(ele)continue
# 通过生成器实现如下代码在执行时可观察电脑的内存使用情况内存占用不大
def get_list_element():for i in range(100000000):temp [你好]*2000yield temp
# 创建一个生成器
a get_list_element()
for ele in a:# print(ele)continue
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913821.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!