Python生成器

119 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

1.生成器(generator)
思考一: 我们如何自己实现一个可迭代对象 ?
在自定义的类中,要实现 iter 魔术方法
该魔术方法,必须要返回一个 迭代器
(也需要自己实现)
思考二: 是否有更加有更加优雅的方式 ?
生成器

生成器:返回迭代器的函数 1.元组推导式

tu = (i for i in range(1,10))
print(type(tu))   			    # 输出为:<class 'generator'>      意思是这是个生成器
print(dir(tu))      			# 可知tu里面有方法__iter__和__next__,所以这是个迭代器
print(tu.__next__())  			# 既然是一个迭代器,就可以使用next方法取值

2.yield 凡是有yield的函数都是生成器 | 返回这个对象 yield 一个对象| 暂停这个函数 | 等待下次next重新激活

来个例子:

def fun():					# 定义生成器,由next函数触发执行
    print('好好学习')
    yield 1   				#返回一个1 并暂停函数
    print('天天向上')
    yield 2  				#返回一个2 并暂停函数
    print('再来一次')
    #没有代码了,引发StopIteration异常

a = fun()
aa = next(a)				# 输出为: 好好学习
print(aa))					# 输出为: 1
bb = next(a)				# 输出为: 天天向上
print(bb)					# 输出为: 2
cc = next(a)				# 输出为: 再来一次 并抛出StopIteration异常
#如果print(type(fun())),会输出<class 'generator'>,可见这个函数已经是一个生成器了。

再来个例子看看:

def fun(ele,n):
    count = 0
    while True:
        if count < n:
            count +=1
            yield ele
        else:
            break

a = fun('wumou',5)
for i in a:
    print(i)
输出为:
wumou
wumou
wumou
wumou
wumou

迭代器生成器的总结:
生成器 与 迭代器 的区别:
生成器,是Python提供的一种非常简便的语法能让我们来自己写出迭代器
注意! 生成器,是一种特殊的迭代器
生成器指的是一个函数,返回的结果是一个迭代器
而迭代器是一个对象

2.导入模块:

总共有这几种导入的方式:::

from car import Car #从一个只包含一个类的模块中导入这个类

from car import ElectricCar #从一个包含多个类的模块中导入一个类

from car import Car, ElectricCar #从一个有多个类的模块中导入多个类

import car #导入整个模块 我们使用语法 module_name.class_name 访问需要的类

from module_name import * #导入模块中的所有类 (不建议使用,如果要用,推荐使用导入整个模块)

例子:
第一种:

import datetime 					     # 导入整个datetime模块
a = datetime.datetime.now()    			 # 获取当前时间
#第一个datetime是模块,第二个datetime是模块里面的类,,now()是类里面的方法

第二种:
(1)

from datetime import datetime   		 #导入模块里面的一个类
a = datetime.now()        				 #直接就一个datetime就是模块里的类

(2)

from datetime import *         			 #导入这个模块里的所有类
a = datetime.now()						 #直接就一个datetime就是模块里的类

第三种:

from datetime import datetime as y   	 #取别名
a = y.now()

升级高级的:

sys.path  		用于存放导入路径的列表,类似于环境变量中的 PATH
sys.argv        查看当前文件路径
__pycache__:	缓存文件

例子:

import sys
print(sys.path)		#在这个路径下面,就可以通过import直接导入。一个列表,在前面的路径优先级高。
                                        #只有在这个列表里面的路径的才能被导入。

第一个问题:
#如果自己写的一个文件和python自带的一个模块重名,而且自己写的这个文件在本目录下,
#那么如果直接导入这个模块,本目录下的优先级最高,就导入不了自带的那个模块。
#解决方法: sys.path.insert(0,路径名),把想要导入的那个模块的路径改到列表的前面。

第二个问题:
#如果需要导入的模块在别的盘,即不在这个路径列表里,该怎么导入:
sys.path.append(r'路径名')