python - day 11
遍历:
zip()函数:

eg:
list1=["name","age","sex"];
tuple1=("guo",18,"male");
for q,v in zip(list1,tuple1):print(f"what is your {q}? It is {v}");运行结果:

item()函数
在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:
eg:
dict1 = dict(a=1,b=2,c=3);#dict函数
for k,v in dict1.items():#items()函数print(k,v);#也可以使用下面的方式遍历
for k in dict1:#k是关键字print(k,dict1[k]);运行结果:

enumerate()函数
在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:
eg:
list1=[x*2 for x in range(1,6)];
for i,v in enumerate(list1):print("enumarate函数:",i,v);#也可以下面这种:
for i in range(len(list1)):print("直接打印:",i,list1[i]);运行结果:

注意items()函数和enumerate()函数的使用方式不一样,一个是dict1.items(),一个是enumerate(list1)。
reversed()函数
要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数:
eg:
list1=[x*2 for x in range(1,6)];
for i in reversed(list1):print("reversed函数,list1:",i);#如果想再加上索引位置
for i,v in enumerate(reversed(list1)):print("reversed函数,list1:",i,v);list2 = reversed(list1);
print("reversed函数,list2:",list2);
print("tyep(list2):",type(list2));#获得反转后的列表
list3 = list(reversed(list1));
print("reversed函数,list3:",list3);运行结果:

从这里可以看出reversed函数之间反转之后的序列是一个特别的类型存在,不是那正常的四种,不过我不知道这种是什么。
sorted()函数
要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:
eg:
list1 = [4,6,7,1,2,9,3,6];
for i in sorted(list1):print("sorted函数,list1:",i);#如果想要在排序的时候去除重复的元素,可以用set函数,将序列转换成集合。
for i in sorted(set(list1)):print("sorted函数,去重复,list1:",i);运行结果:

模块
Python 中的模块(Module)是一个包含 Python 定义和语句的文件,文件名就是模块名加上 .py 后缀。
模块可以包含函数、类、变量以及可执行的代码。通过模块,我们可以将代码组织成可重用的单元,便于管理和维护。
可以先简单理解为模块就是包含了各种代码的一个文件。
模块的作用
代码复用:将常用的功能封装到模块中,可以在多个程序中重复使用。
命名空间管理:模块可以避免命名冲突,不同模块中的同名函数或变量不会互相干扰。
代码组织:将代码按功能划分到不同的模块中,使程序结构更清晰。
import 语句
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
import module1[, module2[,... moduleN]
__name__ 属性
一个模块被另一个程序第一次引入时,其主程序将运行。即当一个模块被引入到另一个程序中时,模块内的所有顶层代码(不在函数或类内的代码)都会被执行。这可能导致不必要的代码执行,尤其是当模块仅作为库使用时。
如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用 __name__ 属性来使该程序块仅在该模块自身运行时执行。
说明:每个模块都有一个 __name__ 属性。
如果模块是被直接运行,
__name__的值为__main__。如果模块是被导入的,
__name__的值为模块名。
说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
即我们可以通过__name__属性来判断当前模块是不是直接运行的,如果是,我们就可以允许它执行一些代码,否则就不允许。
eg:
#这个是我的模块,下面这部分代码我只希望该模块直接运行时才执行,而不是作为模块导入时执行。if __name__ == '__main__':#可以通过这个if判断__name__ 的值是不是'__main__',来判断是否是直接运行该模块,而不是作为模块导入时执行。#下面这两个print是随便写的,就是那些你希望在直接运行该模块时执行的东西。print("我是直接运行该模块");print('模块名为:',__name__);print('模块所在目录为:',__file__);#............这里还可以有好多实现各种功能或者目标的代码,你希望在直接运行该模块时执行的。else:#如果不是直接运行该模块,则执行else语句块,这个可以没有。print("我来自另一个模块");运行结果:

这个运行结果,分别是我在day6模块本身下运行的,以及通过day5模块调用的day6模块然后运行的。如下图

包
包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
可以理解为包就是一个专门用来存放和管理相关代码文件(模块)的文件夹或收纳盒。
目录/文件夹只有包含一个叫做 __init__.py 的文件才会被认作是一个包
eg:
sound/ 顶层包__init__.py 初始化 sound 包formats/ 文件格式转换子包__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/ 声音效果子包__init__.pyecho.pysurround.pyreverse.py...filters/ filters 子包__init__.pyequalizer.pyvocoder.pykaraoke.py...
这个我的理解就是,一个名叫sound的大文件夹,然后里面包含了一个文件/模块(__init__.py,这个文件也使得这个大文件sound被视为一个包,称为顶层包)和三个小文件夹/子包(formats,effects,filters,这三个也都是包,被称为子包),然后每个小文件夹/子包有分别包含了很多文件(也就是模块,后缀为.py的,比如formats里面的wavread.py,这些子包也都有一个__init__.py,用以说明这些文件夹也是个包)
__init__.py 文件的作用
这个文件不仅仅是包的标识,它本身也是一个模块,模块名就是包名。它的主要作用有:
初始化代码:当包或模块被首次导入时,会执行该文件中的代码。可以用于包的初始化设置。
简化导入:可以在
__init__.py中定义__all__列表,来控制from package import *的行为。(__all__列表可以指明那些模块/内部可以被import导入到其他模块,这样可以避免自己不希望别人使用的部分也被一起导入其他模块。)提供便捷的API:可以在
__init__.py中导入包内的关键模块、函数或类,这样用户可以直接从包顶层导入,而不需要知道内部复杂的子包结构。
(我现在不太明白第二个和第三个作用是什么意思,后面回头再看。)
