python函数微讲解(七)及模块微讲解

python函数微讲解(七)及模块微讲解

1.生成器对象(自定义迭代器)

生成器对象的本质还是迭代器对象,也同时含有iter()和next()方法,所以生成器对象也是为了节省空间的,特性和迭代器对象一样。

def index():
    print('你好呀')
    yield
    print('你看得到我吗')
    yield 123

index()  # 调用了这个函数,但是什么都没有打印

函数中有'yield'关键字就是一个生成器对象,当它第一次被调用的时候不会执行代码,而是变成了一个生成器,那怎么取值呢,我们刚刚说生成器对象的本质就是迭代器对象,所以当我们取值的时候就可以调用next()方法:

def index():
    print('你好呀')
    yield
    print('你看得到我吗')
    yield 123

res = index()  # 调用了这个函数,变成生成器对象
print(res.__next__())  # 你好呀  None
print(res.__next__())  # 你看得到我吗  123
print(res.__next__())  # 报错 StopIteration

我们会发现当我们调用一次next()方法的时候只打印了'你好呀',最后又返回来None,当我们在调用一次next()方法的时候又打印了'你看得到我吗',还返回来'123',当我们在调用一次next()方法的时候就会发现报错了,我们可以得出结论:当我们调用一次next()方法就会执行到'yield'关键字,并停留在'yield'的位置上,等我们在调用一次next()方法的时候就又会执行到下一个'yield',一直到没有就会报错,而且我们还会发现当'yield'关键字后面跟了值就会返回,没有的话就会返回'None',跟'return'很象。但是他们两个还是有区别的,来看。

2.yield关键字

(1).函数中含有就是一个生成器

(2).后面跟什么值就会返回什么值,不跟就返回'None'

(3).当代码运行到这里的时候就会停止运行,并停留在当前位置上

(4).可以接收外部传值

前面三个我们刚刚已经了解过了,那么第四个是怎么回事呢?我们来看看:

def index(name):
    print('你看他在干嘛')
    while True:
        run = yield
        print(f'{name}正在{run}')

res = index('oscar')
res.__next__()  # 你看他在干嘛
res.__next__()  # oscar正在None
res.__next__()  # oscar正在None
res.send('跑步')  # oscar正在跑步  用于给yield传值,并且直接调用next()方法

3.生成器表达式

res = (i for i in 'oscar')
print(res)  # <generator object <genexpr> at 0x0000024D81AB1F10>
print(res.__next__())  # o
print(res.__next__())  # s

注意:生成器只有在调用next()方法的时候才会执行内部代码进行取值。

4.模块

(1).什么是模块?

模块就相当于一个人了,会很多的技术,可以做饭、学习、跑步、睡觉,模块也是一样,就是一系列功能的结合体,可以直接使用的。

(2).为什么使用模块?

极大地提升了开发效率。Python之所以在各个行业都很火,很大一部分就是因为那些牛逼的大佬写了很多牛逼的模块,可以供Python工程师直接使用,大大的提升了开发的效率。

(3).模块的来源:

1.内置模块:无需下载,是Python解释器自带的,直接导入即可使用。

2.自定义模块:自己写的代码封装成模块,也可以发布到网上供别人使用。

3.第三方模块:别人写的发布到网上的,下载就可以使用。

(4).模块的四种表现形式:

(1).使用Python代码编写的py文件

(2).多个py文件组成的文件夹

(3).已被编译为共享库或DLL的C或C++扩展

(4).使用C编写并链接到python解释器的内置模块

5.模块的两种导入方式

想要使用模块必须先要导入,导入之后才可以使用,那么怎么导入呢?来看:

(1)import + 模块名

在此之前我们要先知道执行文件和模块文件,执行文件就是我们要调用模块的文件,模块文件就是就是我们要调用的。

import time  # 调用time模块
time.time()  # 使用time模块的方法

那么内部发生了什么事呢:

1.执行文件运行,产生一个全局名称空间

2.执行import语句,并把后面的模块导入,相当于运行了模块文件,产生了一个模块文件的全局名称空间。

3.执行文件的全局名称空间中的模块名指向模块文件全局名称空间

4.通过模块名加点的方式就可以使用模块文件全局名称空间中的值。

相同的模块反复被导入多次只会执行一次。

(2).from + 模块名 + import + 模块文件全局名称空间中的值

这句内部又发生了什么是呢:

1.执行文件运行,产生一个全局名称空间

2.执行from语句,并把后面的模块导入,相当于运行了模块文件,产生了一个模块文件的全局名称空间。

3.直接把import后面的值拿到执行文件的全局名称空间中

这样的话我们就可以直接使用,不需要加前缀。

但是这样呢就会产生名字冲突的问题,所以一定要尽量避免,而且只能使用这个值,这个模块中的其他方法不能使用,因为只拿了它,就只能用它。

6.导入补充

1.可以给模块起别名

当模块名字很复杂的时候,我们就可以给它重命名:

import time as tm  # 调用time模块,并改名为tm

print(tm.time())  # 1648112367.0328038

2.可以连续导入多个模块或者变量名

import modular1, modular2, modular3, modular4, modular5
from modular1 import name_dict, name_dict_new

连续导入的多个模块最好有一些相似的功能,如果没有最好分开导入,如果是同一模块下的方法名,则不做要求。

3.通用导入

from modular1 import *

表示前模块中的所有方法都可以使用。

但是这个方法有一个内置方法'__all__',它可以指定你可以调用多少方法,具体的使用格式是:

__all__ = ['add', 'name_dict']

之后你再写入'from modular1 import *'之后,也只能调用上述两个方法。

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

 

posted @ 2022-03-24 17:19  陆禄绯  阅读(61)  评论(0)    收藏  举报