当前位置: 首页 > news >正文

wordpress内容查看/网站快速优化排名推荐

wordpress内容查看,网站快速优化排名推荐,广州金山大厦 网站建设,网站建设与管理难不难可迭代对象 定义 在Python的任意对象中,只要它定义了可以返回一个迭代器的 __iter__ 魔法方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象,通俗的说就是可以通过 for 循环遍历了。Python 原生的列…

可迭代对象

定义

在Python的任意对象中,只要它定义了可以返回一个迭代器的 __iter__ 魔法方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象,通俗的说就是可以通过 for 循环遍历了。Python 原生的列表,字符串,元祖,字典等都是可以迭代的,可以通过 dir() 函数查看,如以下查看字符串,可见其定义了 __getitem__ 方法

判断一个对象是否是可迭代对象

方法一:isinstance + Iterable

方法二:hasattr + __getitem__ 

from collections import Iterable
# 方法一
print(isinstance([], Iterable))  # 返回 True,说明是可迭代对象
# 方法二
print(hasattr({}, '__getitem__'))  # 返回 True,说明是可迭代对象

自定义可迭代对象

class Employee:def __init__(self, employee):self.employee = employeeemp = Employee(['zs', 'ls', 'ww'])# 正常情况下会报错,emp 不是一个可迭代对象
# TypeError: 'Employee' object is not iterable
for i in emp:print(i)

 实现 __iter__ 和 __getitem__ 方法中的一个或者两个

class Employee:def __init__(self, employee):self.employee = employeedef __getitem__(self, item):# item 是解释器帮我们维护的索引值# 在 for 循环中,自动从 0 开始计算print(item)return self.employee[item]emp = Employee(['zs', 'ls', 'ww'])# 正常情况下会报错,emp 不是一个可迭代对象
# TypeError: 'Employee' object is not iterable
for i in emp:print(i)

迭代器

迭代器对象

迭代器就是同时实现了 __next__ 和 __iter__ 方法(缺一不可)的对象。其中 __iter__ 方法返回迭代器自身, __next__ 方法不断返回迭代器中的下一个值,直到容器中没有更多的元素时,抛出 StopIteration 异常,以终止迭代 由定义可以知道,迭代器一定是可迭代对象,因为迭代器实现了 __iter__ 方法,满足了可迭代对象的定义。但是可迭代对象不一定是迭代器,因为不一定实现了 __next__ 方法。

判断一个对象是迭代器

from collections import Iterator
print(isinstance(counter, Iterator))  # True
print(isinstance([], Iterator))  # False

为什么有了可迭代对象,还要有迭代器?

因为迭代器采用了工厂模式,节约了内存空间。所谓的工厂模式,就是在需要的时候,才会去生产数据,而不是像可迭代对象那样一次性 全部把数据生产出来。可迭代对象如列表,字典等,会事先把所有的数据生产并保存起来,而迭代器则是在每次获取下一个值的时候 才会返回值,所以迭代器没有长度这一说法,没有长度这一属性,如果获取完了会抛出 StopIteration 异常来表示没有数据了

所以迭代器适用于那种无限序列,不会占用很大的内存空间

from itertools import count# count 是一个迭代器
# 创建一个从 10 开始的无限序列
counter = count(start=10)
print(type(counter))  # <class 'itertools.count'>
print(dir(counter))  # 有 __iter__ 和 __next__ 方法print(next(counter))  # 10
print(next(counter))  # 11# 报错,没有长度属性
# TypeError: object of type 'itertools.count' has no len()
# print(len(counter))

可迭代对象转为迭代器

a = [1, 2, 3, 4]
print(type(a))  # <class 'list'>a_iter = iter(a)
print(type(a_iter))  # <class 'list_iterator'>

迭代器的特点

a = [1, 2, 3, 4]
a_iter = iter(a)
# 每一次获取迭代器中的值之后,都是把该值从迭代器中拿出来,即迭代器中已经没有该值了,因为已经被拿出来了
# 所以遍历完一次迭代器之后,不能遍历第二次
# 因为遍历第一次的时候已经把值拿出来完了,第二次去遍历的时候迭代器中啥也没有了
# 即迭代器不走回头路,可迭代对象则没有这种特点
for i in a_iter:print(i)for i in a_iter:print(i)# 上面代码只会输出一次 1 2 3 4# 前面说的,当遍历完迭代器的最后一个数据时,再获取数据抛出异常,
# 而 for 循环没有抛出的原因是
# for 循环内部也是用 next() 方法获取迭代器中的值,
# 当抛出异常后 for 循环会对异常进行处理,所以我们采用 for 循环遍历迭代器时不会有异常抛出

生成器

生成器其实是一种特殊的迭代器,但是这种迭代器更加优雅,因为不需要再像普通迭代器那样定义 __next__ 和 __iter__ 方法,只需要一个 yield 关键字,就会自动在内部帮我们实现这两个方法。所以,如果一个函数包含一个或多个 yield 关键字, 这个函数就会变为一个生成器。因为生成器是特殊的迭代器,所以它具备迭代器具备的特性

def demo():print('hello')yield 5print('world')print(type(demo()))  # <class 'generator'>
print(dir(demo))  # 有 __iter__ 和 __next__ 方法

yield 关键字的作用

1、程序每次在代码中遇到 yield 关键字后,会返回结果,相当于 return 5,但是并没有真的退出程序,而是保留当前函数的运行状态

2、返回结果后,保留当前函数的运行状态,等待下一次调用,下次调用时,从上一次返回结果处开始执行 

第二个作用非常重要,这意味着程序控制权的转移是临时和自愿的,函数将来还会收回控制权(在下次调用生成器的时候收回), 这也是 yield 和 return 最大的区别。return 意味着函数彻底交出控制权并结束运行,下一次调用将固定从函数的第一行代码开始执行。

def demo():print('hello')yield 5print('world')# 此时运行demo(),相当于调用函数,但是并不像普通函数那样马上执行,可以看控制台没有输出
# 此处只是生成一个生成器对象
c = demo()# 利用 next 方法调用生成器
# 第一次调用,打印 hello ,并返回 5
print(next(c))
# 第二次调用,打印 world ,并抛出异常 StopIteration(迭代器特性)
# 因为已经没有语句可以执行了,相当于数据已经取完了
print(next(c))

通过 send 向生成器传递数据

send 方法作用:

1、像 next 方法一样去调用生成器(调用生成器的两种方法:next 方法和 send 方法)

2、send 方法在调用生成器时,可以同时给生成器传递数据到生成器内部 

def demo():print('hello')# 注意,此处不是把 yield 5 赋值给变量 t# yield 5 是返回给调用者的值,即返回给 next(c),# 所以执行 print(next(c)) 语句时会在输出 hello 后输出 5# 而变量 t 是接收下一次调用(c.send('test'))时 send 方法传入的 test# 即 t = 'test't = yield 5print('world')print(t)c = demo()
# 第一次调用生成器,得到 t = yield 5 等号左边的表达式结果,即得到 5
print(next(c))
# 第二次调用,从 t = yield 5 语句开始执行,通过 send 方法把 test 传递给 t = yield 5 等号右边的变量 t
# 然后接着执行函数中两个打印语句,输出 world 和 test
# 打印之后就会抛出异常 StopIteration,因为已经没有要执行的语句了
c.send('test')

生成器的预激活机制

def demo():print('hello')t = yield 5print('world')print(t)c = demo()
# next(c) 就是生成器的预激活机制,即第一次调用
# 第一次调用也可以通过 send 方法,但是参数必须为 None
# 因为生成器没有办法在没有激活的情况下接收一个参数
# print(next(c))  # 预激活方式一
c.send(None)  # 预激活方式二
c.send('test')

查看生成器的运行过程

将下面代码的每一行打上断点(如图),进入debug模式可以清晰的看到代码的运行过程。

def countdown(n):print('counting down from ', n)  # 只在第一次调用生成器的时候输出,此时 n = 10while n >= 0:# 记住,这里不是将 yield n 赋值给变量 newvalue# newvalue 是用来接收 send 方法传递过来的参数的# yield n 是用来将 n 返回给调用者(next 方法或 send 方法)的newvalue = yield n# 判断是否用 send 方法传递参数,如果调用 next 方法,则传递过来的是 Noneif newvalue is not None:n = newvalueelse:n -= 1# 获得生成器对象 c,把 10 传递给 n
c = countdown(10)for i in c:# 第一次调用生成器# 第一次执行 for i in c 语句时,内部第一次调用 next(c)# 执行 print('counting down from ', n) 语句,此时 n=10# 然后进入 while n >= 0 循环,执行 newvalue = yield n 等号右边的 yield n,即返回 n=10 给i# 所以第一次for循环 i=10,输出 10# 第三次调用生成器# 第二次执行 for i in c 语句时,内部第二次调用 next(c),此时已经第三次调用生成器,第二次是用 send 方法调用的# 接着第二次调用生成器的地方开始执行,即从 newvalue = yield n 开始执行,next 方法没有给生成器传递参数# 所以 newvalue 为 None,则执行 else 语句:n -= 1,所以 n = 2# 进入 while n >= 0 ,然后返回newvalue = yield n 等号右边的 yield n,即返回 n=2# 所以第二次for循环 i=2,输出 2# 第四次调用生成器# 第三次执行 for i in c 语句时,内部第三次调用 next(c)# 接着第三次调用生成器的地方开始执行,即从 newvalue = yield n 开始执行,next 方法没有给生成器传递参数# 所以 newvalue 为 None,则执行 else 语句:n -= 1,所以 n = 1# 进入 while n >= 0 ,然后返回newvalue = yield n 等号右边的 yield n,即返回 n=1# 所以第三次for循环 i=1,输出 1# 第五次调用生成器# 第四次执行 for i in c 语句时,内部第四次调用 next(c)# 接着第四次调用生成器的地方开始执行,即从 newvalue = yield n 开始执行,next 方法没有给生成器传递参数# 所以 newvalue 为 None,则执行 else 语句:n -= 1,所以 n = 0# 进入 while n >= 0 ,然后返回newvalue = yield n 等号右边的 yield n,即返回 n=0# 所以第四次for循环 i=0,输出 0# 第六次调用生成器,最后一次# 第五次执行 for i in c 语句时,内部第五次调用 next(c)# 接着第五次调用生成器的地方开始执行,即从 newvalue = yield n 开始执行,next 方法没有给生成器传递参数# 所以 newvalue 为 None,则执行 else 语句:n -= 1,所以 n = -1# 不能进入 while n >= 0 ,那么生成器运行到最后结束,抛出一个异常 StopIteration# 抛出的异常被for循环内部处理,所以运行到此结束,for循环也结束print(i)  # 分别输出 10 2 1 0# 第一次进入 for 循环时 i = 10,所以进入 if 判断if i == 10:# 第二次调用生成器# 调用 send 方法调用生成器,接着第一次调用的地方继续执行# 把参数传递给 newvalue = yield n 中的 newvalue,此时 newvalue=3# newvalue 不为 None,进入判断 if newvalue is not None,将 n 设置为 newvalue (n = newvalue)# 此时 n = 3,进入 while n >= 0 ,然后返回newvalue = yield n 等号右边的 yield n,即返回 n=3# 然后进行第二次 for 循环print('send: ', c.send(3))  # 打印 send:  3

获得生成器的第二种方式

除了通过 yield 关键字得到生成器外,还可以通过小括号的形式得到,如下

"""
生成器表达式和列表推导式的区别:列表推导式会一下子将所有的数据生产出来,并放到列表中生成器表达式一次只生产一个数据获得生成器的两种方式:1、将普通函数里的 return 替换成 yield ,这样调用函数时会得到一个生成器2、利用生成器表达式
"""# 可以通过元祖表达式(小括号)得到生成器
a = (i for i in range(5))
# 列表推导式得到的是一个列表
b = [i for i in range(5)]# a 是生成器
print(type(a))  # <class 'generator'>
# b 是列表
print(type(b))  # <class 'list'># 利用推导式获得生成器的方式称为生成器表达式
t = (i * 2 for i in range(5))
print(t)  # <generator object <genexpr> at 0x000001F466254620>
print(next(t))  # 0
print(next(t))  # 2
# 把剩下的数据处理,目前只剩下 2 3 4
for i in t:print(i)  # 4 6 8

生成器实现斐波那契数列 

# 用生成器实现斐波那契数列
def fib():num1, num2 = 0, 1while True:yield num1num1, num2 = num2, num1 + num2f = fib()
# 因为 fib 函数里是死循环,所以只要调用 next(f) 就可以一直得到 斐波那契数列的值
print(next(f))  # 0
print(next(f))  # 1
print(next(f))  # 1
print(next(f))  # 2
print(next(f))  # 3
print(next(f))  # 5

相关文章:

Python 可迭代对象、迭代器、生成器

可迭代对象 定义 在Python的任意对象中&#xff0c;只要它定义了可以返回一个迭代器的 __iter__ 魔法方法&#xff0c;或者定义了可以支持下标索引的 __getitem__ 方法&#xff0c;那么它就是一个可迭代对象&#xff0c;通俗的说就是可以通过 for 循环遍历了。Python 原生的列…...

HTML的有序列表、无序列表、自定义列表

目录 背景: 过程: 有序列表: 简介: 代码展示: 效果展示:​ 无序列表: 简介: 代码展示: 效果展示:​ 自定义列表: 简介&#xff1a; 代码展示: 效果展示:​ 总结&#xff1a; 背景: 1.有序列表&#xff08;Ordered List&#xff09;&#xff1a; 有序列表是最早的…...

银河麒麟安装Docker-国产化-九五小庞

银河麒麟高级服务器操作系统 V10 是针对企业级关键业务&#xff0c;适应虚拟化、 云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和 实时性的需求&#xff0c;依据 CMMI 5 级标准研制的提供内生安全、云原生支持、国产 平台深入优化、高性能、易管理的…...

数据库与身份认证

1. 数据库的基本概念 1.1 什么是数据库 数据库&#xff08;database&#xff09;是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界&#xff0c;充斥着大量的数据。数据的来源有很多&#xff0c;比如出行记录、消费记录、浏览的网页、发送的消息…...

LabVIEW开发锅炉汽包水位的监督控制和模拟

LabVIEW开发锅炉汽包水位的监督控制和模拟 控制锅炉汽包液位对于机械的安全和设备的保护至关重要。滚筒液位控制器的工作是将滚筒液位提高到指定的设定点&#xff0c;并保持在那里&#xff0c;同时保持一致的蒸汽负荷。锅炉管可能会因该水平急剧下降而暴露&#xff0c;这会导致…...

2023-简单点-树莓派安装ncnn框架

not python 按照下面的步骤进行就可以了&#xff1a; 参考 tips: 其中有一步要用下面方法: 如果你的git clone不得行&#xff0c;可以按照以下操作方法&#xff1a; git clone --depth1 https://ghproxy.com/ https://github.com/Tencent/ncnn.git python 直接 pip install …...

Docker核心原理与实操

第一章、Docker基本概念 1、概念&#xff1a;Docker是一种容器技术&#xff0c;可以解决软件跨环境迁移问题。 2、实现原理&#xff1a;是一个分层复用的文件系统&#xff1b;每一层都是一个独立的软件&#xff1b; …...

虚幻引擎 UE5 增强输入系统

用人话讲&#xff01;虚幻引擎 UE5 增强输入系统&#xff08;蓝图篇&#xff09;_酥妃大魔王i的博客-CSDN博客 UE5 -- EnhancedInput(增强输入系统) - 知乎 (zhihu.com) 简单认识 虚幻引擎中的增强输入 | 虚幻引擎5.1文档 (unrealengine.com) 文档有较详细介绍 标记一下方便…...

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx"&#xff0c;因为它不是从App Store下载三. 无法打开"xxx"&#xff0c;因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…...

leetcode做题笔记142. 环形链表 II

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…...

DuDuTalk:4G语音工牌,如何实现家庭上门维修服务过程的智能化管理?

随着上门按摩、上门养老、上门买菜、上门维修等互联网上门服务的兴起&#xff0c;越来越多的居民开始采用线上下单&#xff0c;享受企业安排人员上门到家的服务。而家庭维修作为到家服务里面典型的一个场景&#xff0c;已成为许多人不可或缺的一部分。然而&#xff0c;与此同时…...

Mybatis常见面试题总结

梳理面试过程中Mybatis相关的常见问题。为保证知识点覆盖&#xff0c;参考了《Mybatis从入门到精通》、《深入浅出Mybatis技术原理与实战》、《Mybatis技术内幕》等书籍。 Mybatis 简介 Mybatis 是一款优秀的持久层框架(ORM框架)&#xff0c;它支持自定义SQL、存储过程以及高…...

数字IC设计之时序分析基础概念汇总

1 时钟Clock 理想的时钟模型是一个占空比为50%且周期固定的方波。时钟是FPGA中同步电路逻辑运行的一个基准。理想的时钟信号如下图: 2 时钟抖动Clock Jitter 理想的时钟信号是完美的方波&#xff0c;但是实际的方波是存在一些时钟抖动的。那么什么是时钟抖动呢?时钟抖动&#…...

1.centos7安装docker

本文目录&#xff1a; 1.docker 安装1.安装步骤2.安装是否成功校验3.docker加速配置4.hello world来袭&#xff0c;验证安装是否ok 2.卸载docker3.卸载较旧版本docker 使用docker必备的三个官方网站&#xff1a; docker官网&#xff1a;https://www.docker.com docker官方仓库&…...

基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo

数据来源是由 图片url,图片descript,图片keywords 外加一个id 基于此首先创建 索引, keywords是一组由单词或词组 组成的一组数据,所以以数组形式压入数据: descript 是由两条语句组合成的数据(针对图片的两种不同描述) # 这里创建的keywords 数组元素类型为text,即可以模糊匹…...

第26节-PhotoShop基础课程-形状工具组-画板

文章目录 前言1.基础图形1.正方形&#xff08;shift/alt/两者加起来&#xff09;2.描边3.合并形状 将多个图放在一个图层4.对齐只能在不同图层5.修改6.重叠&#xff0c;相交 2.多边形1.边数2.星形 3.直线工具1.正常2.箭头 4.自定义形状 前言 类似画图板&#xff0c;矢量图形。…...

第一次课,通过进程信息和服务信息识别当前计算机运行程序(预习版)

题目&#xff1a; 检测的目标进程&#xff1a; ydebugg ; “ImmunityDebugger.exe” _500], rax Exe ; “ollydbg.exe” _4F8], rax hackerE ; “ProcessHacker.exe” _4F0], rax Exe ; “tcpview.exe” _4E8], rax sExe ; “autoruns.exe” _4E0], rax scExe ; “autorunsc.ex…...

ChatGPT 或其它 AI,能用在文书创作上吗?

新的申请季已经正式开始&#xff0c;一些热门项目的ED截止日期也不再遥远&#xff0c;因此很多准留学生们都已经开始了关于文书的创作。 而随着科技的不断发展&#xff0c;以ChatGPT为首的一众AI工具也作为一种辅助手段愈发融入了我们的生活。 那么不免就会有一些同学在准备申…...

Java中锁的分类

Java中锁的分类 这篇文章介绍各种锁的分类。介绍的内容如下&#xff1a; 公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁 上面是很多锁的名词&#xff0c;这些分类并不是全是指锁的状态&#xff0c;有的指锁的特性&am…...

centos安装flink,通过windows访问webui

1. 安装flink 1.1. flink的下载 通过flink官网下载flink安装包 https://flink.apache.org/ 下载安装包 1.2 flink在centos上的安装 将下载好的flink-1.17.1-bin-scala_2.12.tgz安装包放到centos目录下 解压文件&#xff1a; [rootlocalhost ~]# tar -zxvf flink-1.17.…...

如何让两台手机相互远程控制?

你的两台手机是什么系统的&#xff1f;如果你的两台手机都是安卓系统&#xff0c;而且都是安卓7.0及以上版本的系统&#xff0c;那么恭喜你&#xff0c;这两台手机可以相互远程控制&#xff01; 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆&#xff0c…...

预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…...

【7z密码】7z压缩包密码忘记了,怎么办?i

7z压缩包设置了密码&#xff0c;解压的时候就需要输入正确对密码才能顺利解压出文件&#xff0c;正常当我们解压文件或者删除密码的时候&#xff0c;虽然方法多&#xff0c;但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么&#xff0c;忘记了7z压缩包的密码…...

部署云MYSQL(在线版)

在Methodot - 您的一站式云原生在线开发协作平台网站上可以部署免费的MYSQL&#xff0c;在应用商店里能看到可以搭建多种数据库&#xff1a;&#xff08;前提是要注册登录&#xff0c;免费版只能是2人共享&#xff09; 登陆好后&#xff0c;点击工作台&#xff0c;选择应用商店…...

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的&#xff0c;然后又刚好会一点点 go&#xff0c;就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…...

【Datawhale课程笔记-简单学点大模型】大模型的能力

大模型的能力 参考GITHUB&#xff1a;https://github.com/datawhalechina/so-large-lm/blob/main/第二章&#xff1a;大模型的能力.md 深入探讨GPT-3——这个具有代表性的大型语言模型的能力。我们的研究主要基于GPT-3论文中的基准测试&#xff0c;这些测试包括&#xff1a; …...

git使用说明

目录 前言1.安装1.1. windows1.1.1.git客户端1.1.2.配置git客户端1.1.3.安装TortoiseGit图形客户端1.1.4 关于文件换行问题 1.2.ubuntu1.2.1.ubuntu终端Git中文乱码1.2.2 git log中文乱码解决 2.建立版本库2.1&#xff0e;下载网上开源版本库2.1.1.复制下载地址2.1.2.使用命令行…...

【PowerQuery】PowerBI Pro账户的自动刷新

在数据和模型通过发布或者上传方式上传到PowerBI Pro中,如何来进行数据刷新呢?数据源依然在本地,而数据模型已经发布到PowerBI Pro云端服务中。如果数据源更新,我们的模型如何进行自动刷新呢? PowerBI Pro如果需要基于本地数据源更新进行模型更新需要部署相应的数据网关服…...

红黑树(思维导图详解版)

目录 资源已上传 实现代码 测试代码 资源已上传 部分图片 实现代码 注意判断是否为红黑树的代码实现&#xff0c;实现代码中红黑树的删除 #pragma once #include<iostream> using namespace std;enum Color_Type {Red,Black };template<class K,class V> str…...

javafx学习记录

1.布局 2.选择重写或实现方法&#xff08;select methods to override/implements&#xff09; ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…...