上节回顾
1.三元表达式
把if判断写在同一行,无论条件成立与否都要返回一个值
用于简化仅有一个判断的函数或代码块
2.递归(回溯 递推)
函数调用过程中,直接或间接的调用了函数本身
与循环的区别
递归循环调用的次数限制,调用函数时,函数相关数据要入栈,而栈区是有限的
二分查找法
3匿名函数
没有名字的函数
特点:仅能在定义时使用一次,定义玩了就没了
参数没有括号,不能有return,会自动把函数的执行结果当做返回值
函数体只能有一个表达式 且不能换行
通常与内置函数联合使用
4内置函数
map 映射
filter 过滤
reduce 合并
今日内容
01列表生成式
一个快速产生列表的表达式
#语法 [表达式 for in 遍历 (if条件)] 可以进行映射 过滤操作
#会从li依次取出所有值,进行判断,如果满足条件,然后转到新列表中
li=[1,2,3,4]
new_list=[i/2 for i in li if i > 2]#会从li依次取出所有值,然后转到新列表中
print(new_list)
02生成器表达式
一种快创建生成器的表达式
#语法 (表达式 for in 循环 if 条件)
#与列表生成式完全相中
l=[1,2,3,4,5,6,7,8,9,0]
new_list=(i for i in l)
print(list(new_list))
03模块的使用*****
目前使用函数来编写代码 虽然大幅度降低了diamante冗余 并且组织结构清晰多了
但是随着项目功能的增加 如果还将代码全放一个文件中 那么将会出现一些问题
1.维护性差
2.函数太多结构不清晰,可读性差
3.对于相同功能的函数,如果在不同文件中都要使用,就只能复制粘贴,又出现了重复代码
1.如何拆文件
2.拆开后怎么使用别的文件中的内容
上述问题的解决方案就是拆分模块
什么是模块
模块就是一堆功能的结合体 以py文件的形式存在
简单的就是具备一堆函数的py文件
模块的分类
1.自定义模块(重点学习),包含第三方模块
2.内置模块 例如time,os(主要学怎么使用)
3.经过编译后的c或c++库 以DLL形式存在(忽略)
4.包(本质就是文件夹 其中包含了一堆模块)
import用于导入一个模块 会立即执行模块中的代码
导入模块时发什么了什么
1.创建一个名称空间
2.执行模块中的代码,将内部名称与值的对应关系存储到名称空间中
3.在当前执行文件创建一个名字,该名字指向被导入模块的名称空间
注意:模块之间的名称空间是相互独立的
模块中的代码仅在第一次被导入时执行一次
pycharm会自动帮你检测 项目根目录下的模块
可以给你一些提示 但是对于不在根目录下的 它可能会报错
这是pycharm的问题 不影响执行
给被导入的模块取别名
import modules as m
一次导入多个模块(不建议)
import modules,tool
from的用法
import functools
print(functools.reduce)
#使用fprm导入时 会把import后的名字直接放入当前名称空间
#使用时可以不用写前缀
#可能会与当前名称空间的名字冲突
#如果真的冲突了 会就近查找 谁最后定义我就用谁
from functools import reduce
print(reduce)
*通配符(会将模块中所有名字全部导入 极容易出现名称冲突 要慎用)
from tool import *
#该特殊变量用于指定哪些名字可以被*导入
__all__=['func']
执行批py文件的两种方式
1.执行文件
2.模块导入
__name__可以获取当前模块的名字
当这个文件作为执行文件被执行时 得到的__name__的值是__main__,而这个文件被导入执行时__name__的值是模块的名字
模块搜索路径
使用模块时必须先找到对应的模块文件,这就涉及到查找(搜索)路径
1.查找内存中已存在的
#sys.modules可以看到内存中已经加载的模块
import tool
import sys
print('tool' in sys.modules)
2.内置的
3.sys.path
当你要使用的模块不在执行文件同一级下时,就找不到了无法使用
坑爹的是pycharm会自动把项目根目录加入sys.path,如果碰巧你要找的问价那就在项目根目录下,就能找到.但是如果你换了运行环境不再是pycharm 就可能找不到 所以为了保证你的项目在哪儿都能运行,我们需要将自己要使用的文件添加到syy.path
可以将sys.path理解为解释器的环境变量
sys.path.append(r'根目录')
print(sys.path)
如果你的执行文件在根目录下 就能访问当前项目中的所有文件 无需关系sys.path