上节课复习:
三元表达式:
结果1 if 条件 else 结果2 列表推导式 [列表元素 for v in iterable] 字典推导式 {字典元素 for k, v in iterable}
递归函数:
递归:函数的自调用 直接自调用:自己调自己 间接自调用:自己调别人,别人再调回自己
回溯(回溯条件) => 递推(递推开始,回溯的结束点) def get_age(num): if num == 1: return 18 age = get_age(num - 1) - 2 age = get_age(5)
匿名函数
lambda 形参们: 返回值 1. 用变量接收 2. 结合内置函数使用
内置函数
max ''' def func(): return [lambda x: x * i for i in range(4)] # [6, 6, 6, 6] # return [lambda x, i=i: x * i for i in range(4)] # [0, 2, 4, 6] # def m(2): # return 2 * 0|1|2|3 print([m(2) for m in func()])
# 1.func()执行结果为list,所以被迭代 # 2.for i in range(4)能产生4次结果,所以func()的返回值list有四个元素 # 3.最终打印的列表推导式也有四个元素 # 4.func()返回值list中存放的是四个函数地址,匿名函数体没有被执行 # 5.m(2)时,匿名函数体才被调用,但四个匿名函数都已形成,再去获得i的值,i存放的是最后一次值3
# 理解案例 y = 10 def aaa(arg=y): print(y) print(arg) y = 20 y = 30 y = 40 aaa()
函数回调:
# 提前写出函数的调用,再去考虑函数体的实现
# 怎么样提前写出函数的调用:在另一个函数中写出函数的调用
# 再去考虑函数体的实现:根据实际的需求
def my_sleep(sec): import time current_time = time.time() while time.time() - current_time < sec: pass def download(fn=None): print('开始下载') my_sleep(1) data = '下载得到的信息' print('下载完成') if fn: # 如果外界提供了回调函数的实现体,再去调用,否则就只完成默认下载的功能 res = fn(data) # 下载成功的回调函数,具体完成什么事之后决定 if res: print('操作成功') return True print('操作失败') return False return data # 没有外界具体操作下载结果的功能代码,就将下载结果直接返回 # res = download() # print(res) def download_action(data): print('往文件中写') with open('1.txt', 'w', encoding='utf-8') as f: f.write(data) return True return False res = download(download_action) print(res) # 下载成功后的动作可以多样化 def download_action1(data): print(data) return True res = download(download_action1) print(res)
今日内容:
一.了解什么是模块
二.为什么要使用模块
三.import导入模块:名称空间
四.起别名:原名与别名
五.from导入方式
六.*的知识点
七.查询顺序
八.自启文件与模块的区别
一、
1.1模块定义:
# 模块:一系列功能的集合体
# 使用模块:在要使用该模块功能的文件中导入模块,通过import关键字导入模块名
1.2
模块的四种存在方式:
1.使用python编写的.py文件(任何一个py文件都可以作为模块)
2.包:一堆py文件的集合体
3.使用C编写并链接到python解释器的内置模块
4.已被编译为共享库或DLL的C或C++扩展
注:
# 1.每一个文件都会产生自己的全局名称空间,且相互不影响
# 2.多次导入,只会编译执行模块一次,将其加载到内存,之后的都是直接对名字的引用
起别名:
# 通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用
# 1.可以简化模块名字 import mmmmmmmmmmmmmmmmmm3 as my_m3 print(my_m3.num)
# 2.可以统一功能 cmd = input('数据库选择 1:mysql | 2:oracle:') if cmd == '1': import mysql as db # mysql.excuse() else: import oracle as db # oracle.excuse() db.excuse()
from 模块名 import 名字1, 名字2, ..., 名字n # 可以指名道姓导入模板中所有想导入的名字
from 模块名 import * # 导入的是模块中的__all__这个列表 # 1、系统默认该列表不会收录_开头的名字 # 2、可以自定义__all__列表来规定外界通过*可以导入的名字
# 不建议直接导入 *,因为可读性差,且极容易出现变量重名 # 模块中有 名字a from 模块名 import * # 可以使用模块中的a a = 20 # 模块中的a就被覆盖了,且在代码上还不能直接看出
起别名:
·
# 其别名
from 模板名 import 名字1 as 别名1, ..., 名字n as 别名n
# __name__: # 1.在py文件作为模块被使用时,__name__为模块名 # 2.在py文件自执行时,__name__为字符串 '__main__'
print("共有逻辑") if __name__ == '__main__': # 所有自执行的逻辑 print("m6: 我是自执行的") a = 10 # 产生的是全局的名字 else: # 所有模块的逻辑 print("m6: 我被导入执行的") print(a) # 会报错:走else就不可能走if,所以a压根没产生