python3基础5

这篇博客详细介绍了Python中的包、模块和函数,包括包的定义与__init__.py的作用,模块导入规则,函数的特性、定义、参数类型以及变量作用域。重点讨论了如何组织Python代码以提高可读性和复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包、模块、函数与变量作用域

前言

  • 个人学习笔记,仅供本人复习使用
  • 主要内容来自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.pymodule2.py
  • 如果有多个module.py想要导入sys这个系统module,可以在某个文件夹t里的__init__.pyimport 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 (让这个脚本既可以作为一个普通模块被导入到其他模块中,也可以作为可执行模块)
作用:判断当前模块是否为入口文件

函数

一、函数特性:
  1. 功能性:
    一个函数必须有一个明确的目的,比如round函数

  2. 影藏细节:
    不应让使用方过多关注函数细节

  3. 避免编写重复的代码

二、函数定义:

def关键字

def funcname(parameter_list):
    pass
结构特性:

1、参数列表可以没有
2、return 返回函数结果 (None)

函数特点
  1. 定义后必须调用这个函数,才能起作用
  2. 调用必须放到函数定义后,不能在之前
  3. 系统有默认递归,超出报错
  4. 定义函数、变量时,避免与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改变为全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值