day16 列表生成式 生成器表达式 模块
上节回顾
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
- Enterprise Library 4 缓存快速入门
- Enterprise Library 4 缓存应用程序块的设计
- 让WordPress 在RSS 中Feed 输出支持“More”标签
- WordPress文章版权保护:复制文字自动添加版权信息
- 替换WordPress 自带默认的 jQuery库, jQuery库页脚加载
- Enterprise Library 4 数据访问应用程序块
- 替换EnterPrise Library 4.0 缓存应用程序块的CacheManager
- Enterprise Library 4.0缓存应用程序块
- 通过.htaccess 让WordPress 的上传文件夹更安全
- asp.net 性能调较
- 零基础学习大数据,搭建Hadoop处理环境
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- 为你的WordPress 博客开启两步验证功能(技术支持:谷歌)
- WordPress 注册页面显示自定义提示信息
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【奇技淫巧】-- 最长连续序列
- 【redis】跟我一起动手玩玩redis主从复制和哨兵模式
- 【C++】八大排序算法 :GIF + 亲测代码 +专项练习平台
- 【C++】勉强能看的线程池详解
- 国密SSL协议之Java编程
- 7. Jackson用树模型处理JSON是必备技能,不信你看
- epoll,求知者离我近点
- SOCKET网络编程 (通俗易懂入门篇)
- 进程 · 全家桶
- Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝慢慢看(2)
- Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝里慢慢看 (1)
- 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
- 【Linux内核】进程管理
- Django后台管理界面修改(代码修改)
- OpsnSSH抓包分析 | SSH协议分析