有点难,最近的东西都有点难,我感觉学起来有点吃力。班主任找我谈话,说看我快不行了,脸色不好。扶我起来,我还能学习
各位给自己打打气,也给我打打气。
今日洗脑金句:30%是环境的影响,70%是个人的努力,生而为人,你不努力来人间干嘛?做卧底?
模块的四种形式
一、什么是模块
函数是啥呀,函数就是一个功能的集合体,那么模块呢?模块就是一系列功能的集合体。
所以,模块可以看成是一大堆函数的几何体。模块也是放在py文件里的。但其实,老子的理解是,所有的py文件都是模块,比如你写了个ligezhashuai.py文件,那么这就是一个模块了,模块名就是ligezhenshuai。
二、模块的四种形式
在python里面,一共有四种形式的模块:
1.自定义模块:你自己写的py文件就是自定义模块,里面放了一堆你写的函数。
2.第三方模块:已经被便衣为共享库或DLL的C或C++扩展
3.内置模块:使用C编写并且链接到python解释器的内置模块
4.包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
三、为什么要用模块
举一个栗子
模块好比就是一个共享工具库,我用,你不用。
当我们接收到了同一个任务时。
好了两个小时过去了,我已经造好了一架飞机了,当我看向你时,你都快造好一个扳手了呢。
加油,我以你为荣,一定要用自己的智慧去做所有的事情,干巴爹!
所以你们知道为什么要用模块了吗?
- 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
- 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。
四、如何用模块
一般我们使用import和from...import...导入模块。
import就是后面直接跟一个模块名就好了,后者是from+模块名import+函数名
恕我直言,后面的方式无吊用
import和from...import...
# spam.py
print('from the spam.py')
money = 1000
def read1():
print('spam模块:', money)
def read2():
print('spam模块')
read1()
def change():
global money
money = 0
一、import模块名
# run.py
import spam # from the spam.py
import spam
import首次导入模块发生了3件事:
- 以模块为准创造一个模块的名称空间,上面导入了span模块,所以开辟了一个名称空间。
- 执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间
- 在当前执行文件中拿到一个模块名,相当于是把导入的那个模块的名称空间放进了当前文件的名称空间。
使用import xxxx导入的时候,使用方法只能 xxxx.方法名() ,不能直接方法名
from time import gmtime # 这就相当于只导入了gmtime函数
from time import gmtime,time# from time import * 所有(等同于import time),不推荐使用,因为很容易造成变量名冲突,你调用了很多很多函数进来,很容易就和你已经定义的变量或者函数同名。
冲突,冲突懂吗,火拼啊!死靓仔!
from test import * # ____all____限制了 from test import *(有毛用,直接用import+模块名就完事儿了)
from test import f3 # __all__不会限制
import test # __all__ 不会限制
import和from...import...的异同
- 两者都会执行模块对应的文件,两者都会产生模块的名称空间
- 两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关
循环导入问题
一、什么是循环导入
什么是循环导入问题呢?就是闷逼死循环
from m2 import y
x = 10
print('y:', y)
这是m1
from m1 import x
y = 20
print('x:',x)
这是m2
这时候我运行了m1文件,你才会发生什么?
‘’后面同学说什么呢?!怎么可以说他妈炸了呢?!?“
是会报错ImportError: cannot import name 'y' 什么意思呢,康特因破特内母外,就是不能引入y,为什么呢?明明导入了m2啊,m2里面有y啊,为什么,你看啊,我们的流程是不是你在导入一个模块的时候,这个模块也会执行啊,那m2也会执行咯,从头开始,第一句就是from m1 import x,懂了吗?又回去了,开始闷逼死循环。游戏结束。所以要怎么解决呢,对有人想到了,把y拿出去放到最上头,来我们试一下。
y = 20
from m1 import x
print('x:',x)
于是m2变成了这样。我们再来执行一下m1。
y: 20
x: 10
y: 20
‘’。。。。。。。‘’为啥啊,不就一个print?怎么会输出3个玩意儿?
让爆山大爷分析给你听,你导入了m2模块去找y,一旦找到了,就先停下,那么m2的执行就到了y=20就停下了,接下来继续执行m1的内容,x=10,打印y,结束了,那么m2继续执行,诶,遇到了from m1 import x 这句,导入m1寻找x,来吧继续执行m1,而x=10我们之前就走过了,所以内存空间里有了,所以继续执行m2,打印了y,接下来继续执行m1,打印x,所以就有了三个输出。听懂了没?
反正我是乱乱的,你们不懂的话就别杠了,只需要知道怎么解决这个问题就好了。还杠的话我爆山大爷直接给你来一个鬼泣下段踢,屠熊中段踢,地狱葬送手刀,满汉全席。
二、解决方案
方案一:把导入语句写在最下面一行(憨批做法,实打实憨批)
方案二:把导入语句写在函数里面。(推荐)
模块的搜索路径
1、首先先从内存中找
2、内置
3、自定制
4、环境变量
import sys
print(sys.path) # 环境变量,模块就是在这里找
sys.path.append(r'D:上海Python11期视频python11期视频day 16')
del sys.path[1]
print(sys.path)
import testt
testt.f1()
配置环境变量的方法
以上内容由于我还不是很理解,所以先写上结论。
补充明日内容:
print(random.random()) # 0-1的随机数
print(random.randint(0,100)) # 0-100的整数
lt = [1,2,3,4,5,]
random.shuffle(lt) # 打乱容器类元素 --> 列表和字典
print(lt)
# 了解
print(random.randrange(1,10)) # 1,9之内的整数
print(random.uniform(1,3)) # 1-3的小数
print(random.choice([1,2,3,'a','b'])) # 选一个
print(random.sample([1,2,3,'a','b'],2)) # 选2个