索引取值与迭代取值的差异
l1 = [1,2,3,4,5]
1.索引取值
可以任意位置任意次数的取值
不支持无序类型的数据取值
print(l1[3])
print(l1[3])
#可以直接获取任意位置的数据,同一数据也可以无限次重复获取
2.迭代取值
只能从前往后依次取值,无法后退
支持所有类型的数据取值(无序,有序都可以)
l1 = l1.__iter__() # 使用.__iter__ 方法变身为迭代器
print(l1.__next__()) # 1
print(l1.__next__()) # 2
# 只可以依次取值,从前往后 无法退后
模块介绍
1,什么是模块?
内部具有一定功能的py文件,就是一个py文件里面有可运行的代码 就可以把这个文件理解为是一个模块
2.python模块的历史
起初python并不被看好,觉得太过简单不上档次,只是简单的调包侠。随着发展更多的人尝试python都爱上了模块调用,python中就是因为有很多强大的模块来兴起的
3.python模块的表现形式
1.py文件(也可以称之为模块文件)
2.含有多个py文件的文件夹(按照模块功能不同划分不同的文件夹储存)
3.被便衣为贡献库或Dll的c或C++扩展(可以理解为插件)
4.使用c语言编写并连接到了python解释器的内置模块(python解释器自带的内置模块)
模块的分类
1.自定义模块
也就是我们自己编写的py文件
2.内置模块
也就是python解释器中提供的内置模块
3.第三方模块
也就是其他人已经写好的出色的模块文件,我们可以下载使用
导入模块的两种句式
'''
前提: 1,在使用模块时,我们一定要清楚谁是执行文件,谁是被导入文件
2. 在开发项目时所有的py文件都应该使用纯英文的命名(尽量避免中文和空格)
3. 导入模块时只需要用文件名,不需要填写后缀名
'''
1.import 句式
import test
print(test.name) #正确 模块名.的方式调用模块内名称
print(name) # 错误,不可以直接调用模块内的名称
'''
当你在运行该句式时
1,首先在当前文件(执行文件)中产生了一个 模块名的名称空间
2. 被导入的模块里面的所有变量和名次 都会放到这个专属于它的名称空间内
3. 在当前文件中如果要使用模块内的名称,需要用 模块名.的方式使用
'''
2.from ... import ... 句式
以 from test import name
print(name) # 正确
'''
当你在运行该句式时
1.首先在当前文件产生了一个名称 test
2.然后把 test 文件里面的 name 名称 拿到了当前文件
3.然后在当前文件 就可以直接使用 name 该名称
'''
导入模块句式补充说明
1.import 和 from ... import ...两者的优点缺点
import句式
缺点:需要使用 模块名加.的方式才可以使用模块内变量名
优点:模块名加.的方式使用变量名可以避免模块名称与执行文件名称冲突
from ... import ...
缺点:容易造成变量名冲突,可能产生误导。使用时 我们要避免模块名称和执行文件名称重复问题
优点:可以直接使用模块内名称
2.重复导入模块
如果重复导入同一个模块,解释器只会导入一次,后面重复导入的模块代码不再次生效
3.模块名别名
加入我们遇到了一个很难记很长的模块名称时
import nikanwonanbunanjijiuwanshil
import nikanwonanbunanjijiuwanshil as nik
from test import nikanwonanbunanjijiuwanshil as nik
nikanwonanbunanjijiuwanshil.name #太麻烦了 这个名称太复杂了
nik.name # 这多舒服
我们可以使用 as 来给模块名备注 备注后就可以使用备注名来代替了
4,涉及导入多个模块
1.如果模块功能是同类的 可以使用 import 模块名,模块名
2.模块功能不同
import 模块1
import 模块2
建议使用第二种 不要怕麻烦 导就完事了
5.循环导入问题
两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极容易报错
如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕 #名称最好在导入模块代码执行前已经准备完毕
'''
name = 'moon'
import test2
'''
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是直接文件 则 __name__ 对应的值是__main__
当py文件是被导入文件的时候(模块)时 __name__ 对应的值是 模块名
import test
print(__name__) # __main__ 因为这个在正在执行的文件中
test.py文件中
print(__name__) # test 因为这个是在被导入的文件中,被导入的模块中
当我们想在模块中或者某些文件中测试功能时
if __name__ == '__main__':
条件达成后运行的代码
这样就可以达到,当我们运行这个文件时这些代码才会生效,当别人调用这个文件时 if里面的子代码
不会生效。
上述脚本可以用来区分所在py文件内python代码的执行
使用场景:模块开发阶段自测 项目启动文件
*号的使用
from test import *
#此代码代码我们可以直接使用 test模块里面的所有名称
#*默认是将模块名称空间中所有的名字导入
#模块内有__all__ = ['名字1','名字2'] 这是设置目前可以被调用的名字
模块的查找顺序
模块名调用查找顺序:
1.内存
import test
import time
time.sleep(10) #假设在代码睡眠期间删除了 test文件
print(test.name) # 依然可以执行
内存优先级最高,当代码运行后文件数据已经被储存在内存中
2.内置
import time
print(time)
print(time.name) #报错
优先使用内置函数,为了避免出错,自定义模块时避免和内置模块名冲突
3.执行文件所在的sys.path(系统环境中)
一定是以当前执行的文件为准!!!
import sys
print(sys.path)
sys.path.append('/Users/moongod/Desktop/pythonProject/练习/ceshi/ceshi2')
#添加模块路径到当前可以查询到的路径列表中
import md
print(md.name)
我们也可以将模块所在的路径也添加到执行文件的sys.path
sys.path里面是一个列表,在这里列表里面才可以被当前执行文件直接获取到直接导入
所以如果模块不在同一个环境里面,就需要在环境里面添加
绝对导入和相对导入
1,首先当我们在导入文件时 一定要分清楚谁是正在被执行的文件
导入模块的路径都是已被执行文件所在路径为准
2. 绝对导入
from outer1.inner1.inner import module1
#根据当前执行文件所在地址 一层一层的找 执行文件跟outer1平级,然后找
#outer1文件夹>>>inner1文件夹>>>inner文件夹 然后在这个文件夹里面就可以找到模块 module1 成功导入
from outer1.inner1.inner.module1 import name
# 当然也可以一层一层的直接精确到变量名
3.相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
'''
相对导入使用频率较低 一般用绝对导入即可 结构更加清晰
'''
标签:__,文件,name,python,导入,模块,import
From: https://www.cnblogs.com/moongodnnn/p/16803795.html