包、模块、函数与变量作用域
前言
- 个人学习笔记,仅供本人复习使用
- 主要内容来自7七月
- 第一次记录时间:2020年2月11日
Python中的包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py
文件, 该文件的内容可以为空。__init__.py
用于标识当前文件夹是一个包。
Python中的模块
Python 模块(Module),是一个 Python 文件,以 .py
结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
关于__init__.py
- 每个包里都会有一个
__init__.py
文件 - 导入一个包时,里面的
__init__.py
会首先被执行 - 导入包里面的模块,也会先运行包下面的
__init__.py
- 在
__init__.py
里,同样可以通过__all__ ["module1", "module2"]
限定import*
时可以应用的module1.py
和module2.py
- 如果有多个
module.py
想要导入sys
这个系统module
,可以在某个文件夹t
里的__init__.py
里import sys
,然后import t
后可以直接使用t.sys
关于导入:
1、包和模块不会被重复导入,一旦形成闭环,就会报错
2、要避免循环导入,不管是直接导入还是间接导入
模块内置变量
a = "o"
c = []
infos = dir()
print(infos)
#输出
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'c']
__name__
:模块完整名称,包括命名空间。模块名
__package__
:模块所在的包
__file__
:文件所在的物理路径
__doc__
:模块内的注释说明内容
入口文件:
__name__
:更改为__main__
__package__
:入口文件不属于任何包
__file__
:如果入口文件在当前目录下,会直接输出module.py
,如果在当前目录的子目录下,会输出子目录\module.py
,如果是被导入文件,会输出绝对路径\module.py
__doc__
:为防止报错,(__doc__ or ".....")
python的普通模块必须要有一个包,当想要把一个可执行文件当做一个普通模块运行时,可以使用-m
参数
if __name__ = __main__:
pass
意思是:Make a scipt both importable and executable (让这个脚本既可以作为一个普通模块被导入到其他模块中,也可以作为可执行模块)
作用:判断当前模块是否为入口文件
函数
一、函数特性:
-
功能性:
一个函数必须有一个明确的目的,比如round
函数 -
影藏细节:
不应让使用方过多关注函数细节 -
避免编写重复的代码
二、函数定义:
def
关键字
def funcname(parameter_list):
pass
结构特性:
1、参数列表可以没有
2、return
返回函数结果 (None)
函数特点
- 定义后必须调用这个函数,才能起作用
- 调用必须放到函数定义后,不能在之前
- 系统有默认递归,超出报错
- 定义函数、变量时,避免与python内置函数同名
使用特定变量名称接受函数结果(序列解包)
序列解包与链式赋值
a, b, c = 1, 2, 3
d = 1, 2, 3
print(type(d))
a, b, c = d
print(d)
#输出
<class 'tuple'>
(1, 2, 3)
序列解包时,序列中元素个数必须和变量数相等
a = b = c
print(a, b, c)
#输出
1 1 1
三、函数的参数:
1、必须参数
2、关键字参数
3、默认参数:在形参中定义默认
必须参数一定要在默认参数之前,部分给定默认参数的实参时需使用关键字参数
4、可变参数
def demo(*param):
print(param)
print(type(param))
demo(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
<class 'tuple'>
- python会自动把可变参数列表所对应的实参组装成一个元组(tuple)
- 调用时传入参数会返回一个二维元组
- 调用时添加
*
将元组里的元素平铺出来,传递给函数 - 可变参数可以和其他类型参数结合记起来。如可以在定义时加上必须参数,但可变参数必须要放在后面
- 函数参数的顺序是,必须参数、可变参数,默认参数必须在最后;当需更改默认参数值,必须用关键字参数给默认参数赋值
关键字可变参数
def city_temp(**param):
print(param)
print(type(param))
for x,y in param.items():
print(x,":",y)
city_temp(c1="31", c2="32", c3="33")
#输出
{'c1': '31', 'c2': '32', 'c3': '33'}
<class 'dict'>
c1 : 31
c2 : 32
c3 : 33
可以传入空字典
实参也可以传入字典,使用**dict
简化函数调用
四、变量的作用域
def demo( ):
c = 10
print(c)
#输出
NameError: name 'c' is not defined
无块级作用域
python中函数有作用域的作用,函数外部是全局变量,
函数内部是局部变量,这是一个相对的概念。
for
循环中的变量是可以从相对外部调用的
作用链式:
c = 1
def func1():
c = 2
def func2():
c = 3
print(c)
func2()
func1()
#输出
3
c = 1
def func1():
c = 2
def func2():
#c = 3
print(c)
func2()
func1()
#输出
2
c = 1
def func1():
#c = 2
def func2():
#c = 3
print(c)
func2()
func1()
#输出
1
作用域是具有链式的,逐级寻找
global
关键字
def demo():
global c
c = 2
demo()
print(c)
#输出
2
需要调用demo
函数,将c
改变为全局变量