Python学习--Day 23

169.包的导入

  • 在pycharm中分别创建文件夹,一个包中可以放多个模块,一个包中可以放多个模块。
  • 使用包中模块的某个函数,from 包名 import 模块 + 模块.函数()
    或可以使用from 包名.模块 import 函数 + 函数()
    或可以使用from 包名.模块 import * + 函数(),可以使用__all__()*的内容进行限制,没有被alll指定的内容会被私有化。
    同理,和可以使用上述方法对变量、类进行导入。

170.包的导入

  • 复习:使用if __name__ == '__main__':对执行的内容进行限制。
 if __name__ == '__main__':
    print(version)
  • 同一个包内的py文件之间相互调用,要使用全称from 包名.模块 import 函数或省略包名from .模块 import 函数,不同包之间的相互调用更要书写全称,具体的书写可以参考下面的例子:
'''文件目录结构:
	article
		|--models.py
			|show
		|--__init__.py
		|--...
	user
		|--models.py
			|--user
		|--__init__.py
		|--test.py
	calculate.py
		|--add
	即便test文件与user下的models.py处于同一目录下,也不建议直接使用import models, 要使用from user.models import User
'''
# 主文件是test.py
# 调用user下的models.py
from user.models import user
# 或使用:
from .models import user
# 调用article下的models
from article.models import show
# 调用calculate
from calculate import add

171.包的__init__文件

  • 包中的__init__文件是用户进行导入包操作的时候,默认会执行__init__文件;在__init__内的函数,可以直接调用,不必再添加模块名称__init__
    该文件的作用:①.当导入包的时候,把一些初始化的函数、变量、类等定义在__init__.py文件中;②此文件中函数、变量等的访问,只需要包名.函数就可以。③结合__all__ = [..通过*可以被访问的模块..]使用。
'''
user
	|--__init__.py
'''
print('__init__')
def create_app():
	print('----create')
'''文件结构:
user
	|--__init__.py
		|create_app
	|--models.py
	|--test.py
package.py(当前文件)
'''
improt user
user.create_app() # 注意不必指明__init__,直接使用.引用就可以
  • from 模块 import *表示可以使用模块里面的所有内容,如果没有定义__all__所有的都可以访问到,但是如果定义了__all__,就是只有这个列表中的内容才可以被访问。
  • from 包名 import *表示该包中的内容(模块)不能访问的,需要在__init__.py文件中定义__all__ = [模块],以规定哪些模块可以被访问。
    示例:
'''
user
	|--__init__.py(当前文件)
		|create_app
	|--models.py
		|pr
	|--test.py
package.py
'''
__all__ = ['models']
print('__init__')
def create_app():
	print('----create')
'''
user
	|--__init__.py
		|create_app
	|--models.py(当前文件)
		|pr
	|--test.py
package.py
'''
print('__models__')
def pr():
	print('----pr')
'''文件结构:
user
	|--__init__.py
		|create_app
	|--models.py
		|pr
	|--test.py
package.py(当前文件)
'''
from user import *
user.pr() # 注意不必指明__init__,直接使用.引用就可以

172.模块的循环导入

  • 循环导入的理解:两个模块之间相互调用:A模块中定义test()函数,调用B模块中的f函数;B模块中的f函数调用test()函数,形成循环调用。
'''
A模块:
	def test():
		f()
B模块:
	def f():
		test()
'''
  • 循环调用示例:尽量避免,下面代码执行后会报错。
'''
xunhuan1(当前文件)
	|task1
	|task2
xunhuan2
	|func
'''
from xunhuan2 import func
def task1():
    print('task1--')
def task2():
    print('task2--')
    func()
task1()
# 运行结果:
# ImportError: cannot import name 'func' from 'xunhuan2' (D:\Pycharm\xunhuan2.py)
'''
xunhuan1
	|task1
	|task2
xunhuan2(当前文件)
	|func
'''
from xunhuan1 import task1
def func():
    task1()
    print('xunhuan2---func')
  • 大型项目中,需要很多的py文件,可能出现模块之间的循环导入,如何避免?①重新架构,成本比较大;②将import导入语句放入到函数中,将import的作用延后,并使用if __name__=='__main__':进行限制(参看下面的代码);③把导入语句放到最后。
    因为将import放在文件的最前,代表如果import不通过,下面的代码就不能执行。
'''
xunhuan1(当前文件)
	|task1
	|task2
xunhuan2
	|func
'''
from xunhuan2 import func
def task1():
    print('task1--')
def task2():
    print('task2--')
    func()
if __name__=='__main__': # 这样在导入的时候,就不会产生问题
	task1()
# 运行结果:
# ImportError: cannot import name 'func' from 'xunhuan2' (D:\Pycharm\xunhuan2.py)
'''
xunhuan1
	|task1
	|task2
xunhuan2(当前文件)
	|func
'''
def func():
	from xunhuan1 import task1 # 将import移动到函数内部
    task1()
    print('xunhuan2---func')

173.sys模块

  • 搜索路径:当你导入一个模块的时候,Python解释器对模块位置的搜索顺序是:①当前目录;②如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录;③如果都找不到,Python会查看默认路径。Unix下默认路径一般为url/local/lib/python,模块搜索路径存储在system模块的sys.path路径变量中,变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

  • Pycharm中,右键文件夹,选择Make Diectory as Source Route,会设定该文件夹为资源目录,将本文件夹放到sys.path中

  • sys常用的方法:sys.pathsys.versionsys.argv

import sys
print(sys.path) # 返回搜索路径
print(sys.version) # 查看python版本
print(sys.argv) # 打印传输给当前python解释器的参数,运行时的参数,argv是一个列表

174.回顾+time模块

  • 回顾:单例(除__new__还有其他的实现形式,包括装饰器、元类的方式等)、模块的导入、包的导入、循环导入的定义和解决方式、系统函数模块sys。

  • time模块中常用的方法
    ①.时间戳:使用两个时间戳做差值可以得到运行时长
    import time
    t = time.time()
    print(t)
    ②.休息:sleep(num),系统休眠num秒
    ③.将时间戳转成字符串:time.ctime(t),将时间戳格式数据t转换成当前时间。
    ④.将时间戳转换为元组的形式:time.;localtime(t),将时间戳格式数据转为元组形式。
    ⑤.将元组时间形式数据转换为时间戳:time.mktime(元组时间格式数据),返回的值是xxxx.0形式
    ⑥.将元组的时间转成字符串:time.strftime(format [,tuple]),format可以选择%Y-%m-%d等格式:
    import time
    t=time.time()
    s = time.localtime(t)
    t1 = time.strftime('%Y-%m-%d %H:%M:%S')
    print(t1)
    结果:2020-08-12 23:05:26
    ⑦.将字符串转成元组的方式:time.strptime()
    r = time.strptime('2019/06/20','%Y/%m/%d')
    print(r)
    结果是:time.struct_time(tm_year=2019, tm_mon=6, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=171, tm_isdst=-1)

  • 总结time模块:重点的是time()、sleep()、strftime();了解的包括:元组时间格式localtime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值