1.以自己的理解总结为什么会出现循环导入,并用代码举例说明

循环导入报错并不是应为相互之间引用而导致报错,实际上是在导入一个模块时发现引用的模块不存在
示例如下:
m1.py
from m2 import m2
def m1():
a=m2 m2.py
from m1 import m1
def m2():
b=m1
执行任意一个文件,报如下错误
Traceback (most recent call last):
File "C:/code/untitled/第六天/m1.py", line , in <module>
from m2 import m2
File "C:\code\untitled\第六天\m2.py", line , in <module>
from m1 import m1
File "C:\code\untitled\第六天\m1.py", line , in <module>
from m2 import m2
ImportError: cannot import name 'm2'

2.如何来解决循环导入,并解决第1题中的循环导入问题

.直接import导入
m1.py
import m2
def m1():
a=m2.m2 m2.py
from m1 import m1
def m2():
b=m1 .延迟导入
from m2 import m2
m1.py
def m1():
a=m2 m2.py
def m2():
b=m1
from m1 import m1 .函数中导入
m1.py
from m2 import m2
def m1():
a=m2
m1() m2.py
def m2():
from m1 import m1
b=m1
.拆成不循环引用(建议)
代码略 总结:
解决循环import的方法主要有几种:
.延迟导入(lazy import)或函数导入
即把import语句写在方法或函数里面,将它的作用域限制在局部。
这种方法的缺点就是会有性能问题。
2.将from xxx import yyy改成import xxx;xxx.yyy来访问的形式

3.组织代码
出现循环import的问题往往意味着代码的布局有问题。
可以合并或者分离竞争资源。
合并的话就是都写到一个文件里面去。
分离的话就是把需要import的资源提取到一个第三方文件去。
总之就是将循环变成单向。
 

3.完成housework.py文件,拥有三个功能:sweep、wash、cook,自定义功能实现(函数体),从文件自执行和作为模块使用两方面,验证三个功能,且两方面使用方式可以共存

#!/usr/bin/env python
# -*- coding: utf- -*-
def sweep():
print('开始打扫') def wash():
print('开始洗衣') def cook():
print('开始做饭') def main():
sweep()
wash()
cook() if __name__ == '__main__':
print('开始做家务:')
main()

4.导入模块的搜索路径有哪些?它们的优先级是?

. 程序主目录,执行程序是包含执行代码文件的目录,交互模式下为当前工作目录,优先级最高
. PYTHONPATH(sys.path)中的目录
. 标准链接库目录,就是python的安装目录,源码在里面
. .x 中可以用.pth 文件

5.现有一个run.py运行文件,与run文件同级目录下有一个pgk文件夹,文件夹下有两个模块m1、m2,m1模块内有功能f1,可以打印字符串"我是m1模块",
m2模块内有功能f2,可以打印字符串"我是m2模块",在run文件中,通过绝对路径方式导入m1模块,验证功能,在模块m1中通过相对路径导入m2模块,验证功能

run.py
from m1 import f1
f1() m1.py
from six_day.test.m2 import f2
def f1():
print('我是M1模块') if __name__ == '__main__':
f2()

6.建立如下包结构,完成包的使用

    结构:
)包名为pkg
)一级目录pkg下:
-- m.py 模块 有函数m_fn
-- sub1 子包
-- sub2 子包
)二级目录sub1下:
-- m1.py 模块 有函数 m1_fn
)二级目录sub2下:
-- m2.py 模块 有函数 m2_fn
要求:
)在执行文件run.py只导入pkg包,不做其他导入操作
)在执行文件run.py中访问三个函数的方式分别是
pgk.m_fn()
pgk.m1_fn()
pgk.sub2.m2_fn()
如何来设计包

目录图:

├── pkg
│   ├── __init__.py
│   └── pkg
│   ├── __init__.py
│   ├── m.py
│   ├── sub1
│   │   ├── __init__.py
│   │   └── m1.py
│   └── sub2
│   ├── __init__.py
│   └── m2.py
└── run.py

各文件内容:

pkg/__init__.py:
from .pkg.m import m_fn
from .pkg.sub1.m1 import m1_fn
from .pkg import sub2 pkg/pkg/m.py :
def m_fn():
print('我是 m_fn 模块') pkg/pkg/sub1/m1.py:
def m1_fn():
print('我是 m1_fn 模块') pkg/pkg/sub2/__init__.py:
from .m2 import m2_fn pkg/pkg/sub2/m2.py:
def m2_fn():
print('我是 m2_fn 模块') run.py:
import pkg
pkg.m_fn()
pkg.m1_fn()

注意事项:

1.导包的以.开头的语法,属于包内语法,因为存在.语法开头的导包文件,都不能自执行
2.导包的以.开头的语法,只能和 from 结合使用
3.在包中的任意模块中都可以使用.语法访问包中其他模块中的名字
4.包中.代表当前目录,再添加一个.也就是..代表上一级目录

Python课程第六天作业的更多相关文章

  1. C#基础第六天-作业-利用面向对象的思想去实现名片

    1.利用面向对象的思想去实现: (增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 本系列教程: C#基础总结之八面向对象知识点总结-继承与多态 ...

  2. C#基础第六天-作业答案-利用面向对象的思想去实现名片

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. python课程第二周重点记录

    python课程第二周重点记录 1.元组的元素不可被修改,元组的元素的元素可以被修改(字典在元组中,字典的值可以被修改) 2.个人感觉方便做加密解密 3.一些方法的使用 sb = "name ...

  4. Python学习day5作业

    目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...

  5. 基于python复制蓝鲸作业平台

    前言 去年看武sir代码发布的视频无意中听到了蓝鲸平台但是一直没深究,前一段时间公司要搞一个代码发布平台,但是需求变化很多一直找不到一个很好的参考 模板,直到试用了一下蓝鲸作业平台发现“一切皆作业”的 ...

  6. python基础 实战作业 ---Excel基本读写与数据处理

    代码地址如下:http://www.demodashi.com/demo/11650.html 看完本篇需要: 10min 作业练习需要: 0.5h~3h(依练习者对python熟悉程度而定) 看完本 ...

  7. Python之函数作业

    Python之函数作业 爬页面 #爬虫页面,send一次爬一次 from urllib.request import urlopen def get(): while True: url = yiel ...

  8. python学习 第六天课后总结:

    <br class="Apple-interchange-newline"><div></div>       python学习 第六天课后总结 ...

  9. SDN课程阅读作业(2)

    SDN课程阅读作业(2) 1.过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? 答:可编程网络的发展分为三个阶段. (1)主动网络阶段 贡献: 1.对主动网络的研究开创了可编程网络 ...

随机推荐

  1. 家电制造业中MES系统发挥的作用

    人们对MES系统在家电生产领域的应用并不陌生,这是离散型MES应用的一个重要领域. 如空调.冰箱.电视.洗衣机等生产加工中均具有批量制造.多品种小批量.单件生产的等特点,很多企业也是以以订单.合同为核 ...

  2. 【Java】简体中文、繁体中文转换

    项目中用到繁体中文语言适配,目前已经有开源的框架可以将简体中文转换成繁体中文,在此基础上封装了一个工具类,可以直接将简体中文的strings.xml转换成繁体中文的strings.xml. 引用Jar ...

  3. 第3篇-超市管理系统Scrum冲刺博客

    一.站立式会议: 1.会议照片 2.昨天完成的工作 ①数据库方面:根据需求关系为在数据库中建立相关表的基本模型供后续参考. ②前端方面:完成了登录界面的设计:各个界面的草图:为各个界面选取合适的图片如 ...

  4. 基于Morphia实现MongoDB按小时、按天聚合操作

    MongoDB按照天数或小时聚合 需求 最近接到需求,需要对用户账户下的设备状态,分别按照天以及小时进行聚合,以此为基础绘制设备状态趋势图. 实现思路是启动定时任务,对各用户的设备状态数据分别按照小时 ...

  5. Fundebug:JavaScript插件支持错误采样

    Fundebug的付费套餐主要是根据错误事件数制定的,这是因为每一个发送到我们服务器的事件,都会消耗一定的CPU.内存.磁盘以及带宽资源,尤其当错误事件数非常大时,会对我们的计算资源造成很大压力. 如 ...

  6. django urls 配置小记

    django urls 配置小记 首先应了解 django2.0在url的配置上较之以前的版本有点区别,在之前的版本是通过django.conf.urls.url函数来实现路径配置的 urlpatte ...

  7. error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

    在执行ios 打包的时候,我们通过执行下面的指令来打包ipa: mkdir arch archive_path=arch/${app_name}.xcarchive workspace_name=HP ...

  8. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  9. python27期day13:闭包、装饰器初始、标准版装饰器、作业题

    1.闭包: 保护数据安全.保护数据干净性. 2.闭包的定义:在嵌套函数内.使用非全局变量(且不使用本层变量) 将嵌套函数返回 闭包的目的:要接受被装饰的函数和被装饰函数需要的参数3.闭包举例子: de ...

  10. es6模块化规范

    在 es6 之前是没有块这个概念的,es6zhong 引入:实际如下: 若 xx1 和 xx2 中有变量名相同,且引入在同一 html 下,需要为引入的 script 标签加上 type=“modul ...