python函数与模块入门
名称空间
存放变量与值绑定关系的地方。一共分成三部分。
内置名称空间
python解释器启动立刻创建结束立刻销毁。
全局名称空间
伴随python文件的开始执行/执行完毕而产生/回收。
局部名称空间
函数体代码运行产生结束销毁。
加载顺序:内置名称空间 > 全局名称空间 > 局部名称空间
作用域
全局作用域
包含了内置名称空间和全局名称空间。
局域作用域
包含了局域名称空间。
查找顺序
作用域的查找顺序一定要先明确当前在哪个空间。
如果当前在局部名称空间:
那么顺序就是:从局部名称空间,到全局名称空间 ,再到内置名称空间
如果当前在全局名称空间
那么顺序就是:从全局名称空间,到内置名称空间。
如果当前在内置名称空间
那么就只能在内置名称空间中查找。
PS:查找顺序是单向的,不能反向。
关键字 global
虽然顺序不能变动,但是可以提高变量的"地位",通过global就可以完成。
上面的问题,只需要简单的一行代码就可以解决。
count = 1 def index(): global count # 提升到全局变量,不然会出错 count = count + 1 index() print(count)
匿名函数
定义
即没有函数名的函数。
语法结构
lambda 形参:返回值
匿名函数一般不单独使用,需要结合内置函数或者自定义函数等一起使用。
l = [1, 2, 3, 4, 5, 6] res = map(lambda x: x + 10, l) # map映射 print(list(res)) # list转换了才能看懂
匿名函数主要用于一些比较简单的业务逻辑中,减少代码量。
列表生成式
为了简化代码从而可以使用列表生成式。
三元表达式
当if判断仅仅是二选一的情况下,可以使用三元表达式。
语法结构
A if 条件 else B
当if后面的条件为True时使用A
为False时使用else后面的B
# 当if是二选一时,可以用三元表达式 name = input('username>>:') res = 'ok' if name == 'jyb' else 'no' print(res)
小补充
当if子代码只有一行的情况下可以整体写在一行,但是不推荐这么写。
模块的使用
模块与包
具有一定功能的代码集合,可以是py文件,也可以是多个py文件的组合即文件夹(包)。
导入模块的本质
会执行模块内代码并产生一个该模块的名称空间,然后将代码执行过程中的名字存放该名称空间中
接着给导入模块的语句一个模块名,该模块指向模块的名称空间。
导入模块的两种句式
import 模块名
可以通过模块名点出所有的名字。
from 模块名 import 子名1,子名2
只能指名道姓的使用import后导入的子名并且还存在冲突的风险。
from主要用于模块与当前文件不在同一级目录下的时候。
内置模块之时间模块
time
时间戳:从1970年1月1日到程序运行时的秒数。
import time print(time.time()) # 1629346093.9096103 """时间戳:1970-1-1到程序运行时的秒数""" print(time.strftime('%Y-%m-%d')) # 2021-08-19 print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2021-08-19 12:12:17
阻塞程序运行的时间:time.sleep
import time def index(): print('123') time.sleep(3) print('哈哈哈') # 统计函数运行时间 start_time = time.time() index() end_time = time.time() print(end_time - start_time)
datetime
import datetime print(datetime.date.today()) print(datetime.datetime.today()) tday = datetime.date.today() tdelta = datetime.timedelta(days=7) tdelta1 = datetime.timedelta(days=-7) print(tday + tdelta) print(tday + tdelta1)