Python包和模块

1.生成器

  • 如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Cenerator)。
  • 延迟计算、惰性求值
  • 节省内存,高效
  • 缺点:无法随机存取
  • 生成器(Generator)生成器会产生一个对象,而不是一个列表

1.1 yield表达式

  • yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
# yeld关键字生成生成器
def test(n):
    for i in range(1,n +1 ):
        yield i    # yield 暂停函数执行,并返回yield后面表达式的值

# 得到生成器
res = test(10)
# print(res,type(res))   # 输出:<generator object test at 0x00000182D5AD0AC0> <class 'generator'>

# 生成器不能随机存取,使用next()函数获取下一个值,数据取完后,不能在调用next函数,否则会出现StopIteration
# print(next(res))  # 输出1
# print(next(res))  # 输出2
# print(next(res))  # 输出3

# 生成器只能遍历一次,下面不会有任何输出
for x in res:
    print(x)

# 可以这样写
for x in test(10):
    print(x)

# 不会有任何输出,生成器:res = test(10) 只能遍历一次
# for i in res:
#     print(i)

1.2 生成器表达式

  • 生成器【Generator】生成器会产生一个可迭代对象,而不是一个列表。生成器表达式很类似列表生成式:
  • (表达式 for var in 可迭代对象)
# 高仿range()函数
def my_range(start,end,step = 1):
    i = 0
    while True:
        value = start + step * i
        i += 1
        if value >= end:
            return
        yield value
# 生成器表达式
'''
表达式 for var in 可迭代对象
'''
gen = (value for value in my_range(0,100,2))
print(type(gen))      # 输出:<class 'generator'>
for i in gen:
    print(i,end=" ")

2.迭代器

  • 直接作用for-in循环数据类型都被称为可迭代对象(iterable),可以使用isinstance()判断一个对象是否时可迭代对象,可以直接作用与for-in循环的数据类型:

  • 数据结构:list,set,tuple,dict,string

  • generator【生成器】【(),函数结合yield】

  • list,set,tuple,dict,string是可迭代对象,但是不是迭代器,只有生成器才是迭代器

import collections.abc

# 判定可迭代对象
print(isinstance({},collections.Iterable))

# 将迭代对象转换为迭代器
list1 = [2,4,5,6]
# print(next(list1))  #TypeError: 'list' object is not an iterator

res = iter(list1)  # iter可以将可迭代对象转换为迭代器
print(next(res))
print(next(res))

3.包

  • 包解决模块重名问题,Python引入以目录方式组织模块,称为包(Package),一个包中可以包含模块、包。
  • Python的包中必须包含特殊文件,被命名未__init__.py,告诉解释器这是一个包,目录不需要一定要有,目录和包区别;
  • 包可以使用import导入包中模块,目录不行

4.模块

  • 提高代码的可复用,可维护性,提高发开效率,模块编写完毕后,方便在其他项目导入
  • 解决命令冲突,不同木块中相同的命令不会冲突
  • 创建模块,设置模块名尽量不要与Python自带的标准模块名称相同
标准库说明
builtins内建函数默认加载
math数学库
random生成随机数
time时间
datetime日期和时间
calendar日历
hashlib加密算法
copy拷贝
functools常用的工具
os操作系统接口
re字符串正则匹配
sysPython自身的运行环境
multiprocessing多进程
threading多线程
json编码和解码JSON对象
logging记录日志,调试

4.1 使用import语句导入模块

  • 语法:import modulenname [as alias]
'''
import语句模块顺序:
Python标准库
第三方库
自定义库
'''
# 使用import导入标准库模块 as 给模块起别名
import datetime as t      # 导入时间日期模块
print(t.datetime.now())   # 输出当前时间:2020-02-21 15:29:01.327352

# import一次导入多个模块,不推荐
import datetime,math,os,sys

4.2 使用from …import语句导入模块

  • 使用import语句导入模块,没次执行创建新的命名空间(namespeace),且该命名空间中执行与.py文件相关所有语句。
  • 不想每次导入模块时创建一个新的命名空间,将具体定义导入当前命名空间中,可以使用from…import语句,不需要添加前缀,直接使用具体变量,函数名,类名访问即可
  • 使用from…import语句导入模块中的定义时,保证所导入内容在当前命名空间时唯一,否则出现冲突,在导入的同名变量,函数,或者类会覆盖先前导入的,这时就需要使用impor语句进行导入
  • 语法:from modelname import member
# 使用from...impor导入具体模块名
from django.db import models 

4.3 模块搜索目录

  • 使用import语句导入模块时,默认情况下,会按照一下顺序查找
  • 当前目录(即执行的Python脚本文件所在目录)下朝朝
  • 到PYTHONPATH(环境变量)下的每个目录中查找
  • 到Python的默认安装目录下查找
import sys              # 导入标准模块sys
print(sys.path)         # 输出具体目录
'''
['E:\\千锋教育\\第16_模块\\代码', 
'E:\\千锋教育', 
'E:\\venv\\django2.0\\Scripts\\python38.zip', 
'E:\\venv\\django2.0\\DLLs', 
'E:\\venv\\django2.0\\lib', 
'E:\\venv\\django2.0\\Scripts', 
'e:\\python3.8.1\\Lib', 
'e:\\python3.8.1\\DLLs', 
'E:\\venv\\django2.0', 
'E:\\venv\\django2.0\\lib\\site-packages']
'''
4.3.1 临时添加
  • 临时添加即在导入模块的中Python文件中添加。例如,需要将"E:\program\Python\Code\demo",添加到sys.path中,可以使用下面的代码:
# 该方法添加的目录旨在执行当前文件的窗口中有效,窗口关闭后即失效
import sys
sys.path.append('E:/program/Python/Code/demo')   # 临时添加
4.3.2 增加.pth文件(推荐)
  • 在Python安装目录下的’Lib\site-packages’子目录创建一个扩展名为.path文件(E:\Python3.8.1\Lib\site-packages).
  • 创建.pth文件,需要重新打开执行的导入模块Python文件
  • 该方法只在当前版本Python中有效
    在这里插入图片描述在这里插入图片描述
4.3.3 在PYTHONPATH环境中添加
  • 该方法添加的目录可以在不同版本中Python中共享
    在这里插入图片描述

5.以主程序的形式执行

pinetree = '我是一棵松树'                                  # 定义全局变量
def fun_christmastree():                                  # 定义函数
    '''
    功能:测试一个梦
    :return: 无
    '''
    pinetree = '挂上彩灯,礼物...我变成一棵圣诞树@^.^@ \n' # 定于局部变量
    print(pinetree)
#*****************判断是否以主程序的形式运行******************************#
if __name__ == '__main__':
    print('\n下雪了...\n')
    print('==============开始做梦================')
    fun_christmastree()                                   #调用函数
    print('===============梦醒了=================')
    pinetree = '我身上落满雪花' + pinetree + '-_-'         #为全局变量赋值
    print(pinetree)                                       #输出全局变量
'''
输出:
下雪了...

==============开始做梦================
挂上彩灯,礼物...我变成一棵圣诞树@^.^@ 

===============梦醒了=================
我身上落满雪花我是一棵松树-_-
'''
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值