Python(3)高级特性(下)

简介: Python(3)高级特性(下)

注意:


1、如果一个函数中包含yield关键字,那么这个函数就会变成生成器函数,而调用一个生成器函数将会返回一个生成器的数据

2、调用生成器函数会创建一个生成器对象,多次调用生成器函数会创建多个相互独立的生成器,示例:

#修改一下脚本
# -*- coding: utf-8 -*-
def test():
    print('aaa')
    yield 
    print('bbb')
    yield
    print('ccc')
    yield
next(test())
print("1")
next(test())
print("2")
next(test())
print("3")
next(test())
#运行:
aaa
1
aaa
2
aaa
3
aaa
可以发现每次都是只到第一个yield就停下了,这就是因为只调用了生成器函数,所以每次都是创建新的生成器,而上一个脚本是把生成器函数赋值了,每次调用的是相同的生成器,很明显上一个脚本的写法才是正确的


注意:生成器函数的调用会直接返回一个生成器对象,而普通函数会直接返回调用结果


四、迭代器


经过上面的学习,可以知道可以直接进行for循环的数据类型有:列表(list),元组(tuple)、字典(dict)、集合(set)、字符串(str)等,这些都是集合数据类型的,还有一个种是生成器(generator),包括了生成器和生成器函数(带yield关键字的函数)


for循环可以作用于上述所说的所有数据类型,而这些数据类型又称为可迭代数据类型(Iterable),利用isinstance()函数可以判断一个数据是否为可迭代的数据类型

>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable) 
True
>>> isinstance('aaa', Iterable) 
True
>>> isinstance((i for i in range(10)), Iterable) 
True
>>> isinstance(100, Iterable)                    
False
#注意:int类型不是可迭代的数据类型
  • 我们知道生成器不但可以使用for循环,还可以使用next()函数不断调用直到抛出StopIteration错误,而这种可以被next()函数调用并不断返回下一个值的数据类型,也叫做迭代器(Iterator),同样的使用isinstance()函数可以判断是否为迭代器:


>>> from collections.abc import Iterator
>>> isinstance([], Iterator) 
False
>>> isinstance({}, Iterator) 
False
>>> isinstance('aaa', Iterator) 
False
>>> isinstance((i for i in range(10)), Iterator) 
True
#可以看到只有生成器是迭代器

注意:生成器为Iterable而迭代器为Iterator


  • 经过上面的案例,可以看出生成器既是可迭代数据类型,也是迭代器数据类型,但是为什么其他的可迭代数据不是迭代器数据类型呢?如列表、字典、字符串等


这是因为python中的迭代器表示的是一个数据流,这个数据流是可以被next()函数不断调用并返回下一个值,直到没有数据时报StopIteration错误。


这也说明了迭代器的计算是惰性的,只有在需要返回下一个数据时才会进行计算,而列表、字典、字符串这些数据在创建的时候,里面的元素就已经定义好了,在需要返回时并不会计算,而是直接返回。


他们的区别还在于迭代器可以表示一个无限大的数据流,例如所有自然数,因为他的计算模式是惰性的,而像列表、字典、字符串这种的,很明显存储的元素是有限的,所以它们不是迭代器的数据类型


列表、字典、字符串等虽然不是迭代器的数据类型,但是可以通过函数iter()来获取一个迭代器的数据,例如:

>>> from collections.abc import Iterator
>>> isinstance(iter([]), Iterator) 
True
>>> isinstance(iter({}), Iterator) 
True
>>> isinstance(iter('aaa'), Iterator) 
True

最后引入几个知识点:

1、python的for循环本质就是通过不断调用next()函数实现的


2、凡是for循环可以调用的类型都是可迭代数据类型


3、凡是可以使用next()函数不断调用输出结果的数据都是迭代器数据类型

以看出生成器既是可迭代数据类型,也是迭代器数据类型,但是为什么其他的可迭代数据不是迭代器数据类型呢?如列表、字典、字符串等


这是因为python中的迭代器表示的是一个数据流,这个数据流是可以被next()函数不断调用并返回下一个值,直到没有数据时报StopIteration错误。


这也说明了迭代器的计算是惰性的,只有在需要返回下一个数据时才会进行计算,而列表、字典、字符串这些数据在创建的时候,里面的元素就已经定义好了,在需要返回时并不会计算,而是直接返回。


他们的区别还在于迭代器可以表示一个无限大的数据流,例如所有自然数,因为他的计算模式是惰性的,而像列表、字典、字符串这种的,很明显存储的元素是有限的,所以它们不是迭代器的数据类型


列表、字典、字符串等虽然不是迭代器的数据类型,但是可以通过函数iter()来获取一个迭代器的数据,例如:

>>> from collections.abc import Iterator
>>> isinstance(iter([]), Iterator) 
True
>>> isinstance(iter({}), Iterator) 
True
>>> isinstance(iter('aaa'), Iterator) 
True


  • 最后引入几个知识点:


1、python的for循环本质就是通过不断调用next()函数实现的

2、凡是for循环可以调用的类型都是可迭代数据类型

3、凡是可以使用next()函数不断调用输出结果的数据都是迭代器数据类型


目录
相关文章
|
1月前
|
存储 大数据 数据处理
Python 中的列表推导式与生成器:特性、用途与区别
Python 中的列表推导式与生成器:特性、用途与区别
19 2
|
2月前
|
机器学习/深度学习 人工智能 安全
python和Java的区别以及特性
Python:适合快速开发、易于维护、学习成本低、灵活高效。如果你需要快速上手,写脚本、数据处理、做点机器学习,Python就是你的首选。 Java:适合大型项目、企业级应用,性能要求较高的场景。它类型安全、跨平台能力强,而且有丰富的生态,适合更复杂和规模化的开发。
44 3
|
1月前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践
Python多线程编程:特性、挑战与最佳实践
33 0
|
1月前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践【1】
Python多线程编程:特性、挑战与最佳实践【1】
30 0
|
3月前
|
存储 数据库 C++
"深入剖析Python元组(tuple):与列表的对比、特性解析及高效应用场景展示"
【8月更文挑战第9天】Python元组与列表虽均用于存储元素集合,但有本质差异。元组不可变,创建后无法修改,适合保护数据不被意外更改的场景,如作字典键或传递固定值。列表则可变,支持动态增删改,适用于需频繁调整的数据集。元组因不可变性而在性能上有优势,可用于快速查找。两者各有千秋,根据具体需求选择使用。例如,元组可用于表示坐标点或日期,而列表更适合管理用户列表或库存。
96 1
|
3月前
|
安全 算法 Go
Python面向对象的三大特性
python面向对象编程(OOP)的三大特性是封装、继承和多态。这些特性共同构成了OOP的基础,使得软件设计更加灵活、可维护和可扩展。
27 3
|
3月前
|
机器学习/深度学习 运维 数据挖掘
scikit-learn 1.0 版本重要新特性一览
scikit-learn 1.0 版本重要新特性一览
|
4月前
|
机器学习/深度学习 数据采集 前端开发
网络爬虫开发:JavaScript与Python特性的小差异
我们以前写JavaScript的代码时,在遇到了发送请求时,都是需要去await的。 但是为什么Python代码不需要这样做呢? 这就是因为JavaScript是异步的,Python是同步的。 JavaScript就需要使用关键词await将异步代码块变为同步代码。
|
4月前
|
数据库 开发者 Python
Python 3.9的新特性有哪些?
【7月更文挑战第2天】Python 3.9的新特性有哪些?
51 1
|
5月前
|
API 项目管理 开发者
PEP是Python改进的关键文档,用于提议新特性和标准化变更
【6月更文挑战第26天】PEP是Python改进的关键文档,用于提议新特性和标准化变更。它们提出功能设计,记录社区决策,建立标准,促进共识,并改进开发流程。PEP是Python不断演进和优化的核心机制,驱动语言的未来发展。**
46 2