1、包模块和类为Python项目的组织结构,函数变量是类的属性和方法,不属于组织架构。
2、一个包可以包含多个模块,一个模块也可以包含多个类。
3、包中可以包含模块和子包,模块可以和包平级。
4、不建议在模块里直接写业务逻辑,而应该封装成类。
5、不是所以文件夹都是Python的包,Python包用__init__.py文件进行标识。
6、知识点:
__init__.py文件
(1)__init__.py中的文件在导入包时(包括导入包下的模块、函数、和变量)自动执行。
(2)__init__.py文件一般会做一下包和模块的初始化工作。
(3)批量导入,当多个模块需要导入相同库时,在__init__.py文件导入利用(1),直接导入包即可
(4)dir()方法,查看包和模块封装的属性和方法。
import sys infos = dir(sys) print(infos)(二)模块
1、模块的导入
(1)包名和模块名
就是文件夹名称和.py文件名称(__init__.py文件名就是包名)。区分不同包的相同模块使使用命名空间(包名.模块名)。
(2)import导入模块
import只能导入包和模块(.py文件)不能直接导入函数和变量,引用变量(函数)名时,使用模块名.变量函数名。
(3)from import
from module import 变量、函数、*(引入被引模块内置变量__all__=[‘变量’]列表中的所有变量)
(4)相对导入和绝对导入
a、顶级包
和miam.py入口文件同级的包(不能再到入口文件的上级)。
b、绝对导入
从顶级包通过通过点符号链接,一直到被导入模块的形式进行导入。
import package2.package4.m2
c、相对导入
相对于模块的位置一个点表示同级,两个点表示上一级、、、,入口文件不能使用相对导入(相对导入通过模块内置变量__name__进行定位进而进行导入,而入口文件的内置变量__name__为’__main__’)。
(5)知识点
a、包和模块不会被重复导入。
b、避免循环导入
p1.py
from p2 import p2 p1 = 1 print(p2)
p2.py
# 执行p1是会导入p2,然后p2第一行又导入p1,循环导入报错 from p1 import p1 p2 = 2
c、Python在导入模块过程中会直接执行模块所以代码。
2、模块内置变量
(1)查看Python内置变量
# 查看Python内置变量 a = 2 c = 3 d = 5 infos = dir() print(infos)
(2)重要内置变量
a、__name__:文件名称
b、__package__:包名
c、__doc__:注释信息
d、__file__:系统中的物理路径
(3)入口文件和普通模块变量区别
a、__name__为__main__。
# 常用于判断那当前模块是否入口文件 if __name__ == '__main__': pass
b、__package__为NoneType(没有包)。
c、__file__为入口文件名称,不是系统中的物理路径。
d、将入口文件当做普通文件内置变量,在模块的上级包中执行python -m
包.模块.py。
1、基础语法
def funcname(args, lastargs='Geng'): pass # 参数列表可以没有 # 在函数体中可以使用return关键字返回函数结果,如果没有return关键字,函数将返回None(空值)
2、函数的参数
(1)形式参数
定义函数时参数列表中的参数。
a、必须参数:必须输入实参的形式参数,否则会报错(必须参数按顺序依次对实参取值)。
b、可变参数:定义时使用(*param),调用时可以直接传入多个实参用逗号隔开,或者组装成列表活元组使用(**list、**tuple序列解包),否则会组装成高维元组。
'''
以函数sumsqr()为例,演示可变参数定义、获取和调用时的主要事项
'''
def sumsqr(*param): # 定义时:*param
sum = 0
for i in param: # 循环时用for
sum += i*i
print(sum)
# 调用1,多个实参用逗号隔开
sumsqr(1, 2, 3)
# 调用2,列表或元组使用*
a = [1, 2, 3]
sumsqr(*a)
c、默认参数:在定义函数时,对形参进行赋值。
d、关键字可变参数:结合可变参数和默认参数定义时使用(**param),遍历时使用.items()方法,调用时可直接输入多个关键字参数用逗号隔开,或者组装成字典使用(**dict),否则会组装成高维字典。
'''
以函数city_temp()为例,演示关键字可变参数定义、获取和调用时的主要事项
'''
def city_temp(**param): # 定义时:**param
for key, value in param.items(): # 注意字典的遍历,获取时用itmes()方法,
print(key, ':', value)
# 调用1,多个关键字实参用逗号隔开
city_temp(bj='32c', sh='12c')
# 调用2,字典使用**
data = {'bj':'32c', 'sh':'12c'}
city_temp(**data)
(2)实际参数
在调用时输入的参数。
a、关键字参数:函数调用时,除按顺序依次输入实参外可以通过输入形参关键字进行赋值(增强代码可读性)。
(3)知识点:
a、参数裂表定义顺序为必须参数、默认参数、可变参数(不建议设置类型过于复杂的参数裂表)。
b、调用时关键字参数不能和必须参数混淆。
# name和age为必须参数,gender和school为默认参数,scholarships为可变参数
def print_student_file(name, age, gender='女', school='人民路小学', **scholarships):
print('我叫' + name)
print('我今年%d岁了'%(age))
for year, infos in scholarships.items():
print('我在%s年获得了%s'%(year, infos))
print('我一共获得了%d次奖学金'%(len(scholarships)))
print('我是%s生'%(gender))
print('我在%s念书'%(school))
award = {'2019':'三等学业奖学金', '2020':'三等学业奖学金', '2021':'三等学业奖学金'}
print_student_file('耿天霸', 24, school='西北大学', gender='男',**award)
3、函数的返回值(return)
(1)函数执行到return语句后,不会再执行函数体内return语句后面的代码。在函数体中可以使用return关键字返回函数结果,如果没有return关键字,函数将返回None(空值)。
(2)多个返回值(序列解包)
序列解包指:使用变量接收函数的多个结果是,以元组的形式进行组合,可以通过下标进行访问,但Python推荐使用多个具有明显语义的变量对多个结果进行接收,增强代码的可阅读性(序列解包)。
def damage(skill1, skill2):
damage1 = skill1 * 3
damage2 = skill2 * 2 + 10
return damage1, damage2 # 包含多个返回值时,用逗号分隔
# Python将多个返回结果组成元组,可以使用下标的方式进行索引,但是不推荐(语义不明确)
damages = damage(3, 6)
print(damages[0], damages[1])
# 推荐使用带有明显语义的变量进行存储
damage_skill1, damage_skill2 = damage(3, 6)
print(damage_skill1, damage_skill2)
知识点:
(1)、查看Python内置函数
Python命令行输入help(函数),输入import this,查看Python之禅。
(2)、函数的作用
a、功能性:实现某一通用功能,避免编写重复代码。
b、隐藏细节:实现可以很复杂,但调用必须简单。
直接在模块中定义的变量。
2、局部变量Python局部变量指在函数中定义的变量,for循环和while等语句不能形成块级作用域。
3、作用域链局部变量只在函数内起作用,在函数外部无法引用,逐级寻找。
'''
理解作用域链
(1)该模块输出结果为3
(2)注释掉c=3后模块输出结果为2
(3)注释掉c=2后输出结果为1
'''
c = 1
def fun1():
c = 2
def func2():
c = 3
print(c)
func2()
fun1()
4、global关键字
(1)概念
将局部变量转换为全局变量。
(2)用法
'''
global关键字用法
'''
def demo():
global c # 先一行定义c,再赋值
c = 10
demo()
print(c)



