1.LEGB规则对变量名进行作用域解析
我们已经知道了多个命名空间可以独立存在,而且可以在不同的层次上包含相同的变量名。“作用域”定义了Python在哪一个层次上查找某个“变量名”对应的对象。接下来的问题就是:“Python在查找‘名称-对象’映射时,是按照什么顺序对命名空间的不同层次进行查找的?”
答案就是:使用的是LEGB规则,表示的是Local -> Enclosed -> Global -> Built-in,其中的箭头方向表示的是搜索顺序。
- Local 可能是在一个函数或者类方法内部。
- Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部。
- Global 代表的是执行脚本自身的最高层次。
- Built-in 是Python为自身保留的特殊名称。
因此,如果某个name:object映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域(enclosed)进行搜索,如果闭包作用域也没有找到,Python就会到全局(global)命名空间中进行查找,最后会在内建(built-in)命名空间搜索(注:如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)。
2.global与nonlocal
- global:函数内部访问全局变量时(改变值)需要在函数体内加global
- nonlocal count:在内置函数中访问外部函数变量(改变),需要在内置函数中添加nonlocal
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误
3.时间函数
- 用time模块的strftime函数时间日期的格式化时间
import time
print(time.strftime('%Y/%m/%d %H:%M:%S %A'))
格式符号 | 说明 | 格式符号 | 说明 | 格式 | 说明 |
---|---|---|---|---|---|
%Y | 年(2019) | %B | 月(June) | %A | 星期(Thursday) |
%y | 年(19) | %b | 月(Jun) | %a | 星期(Thu) |
%I | 时(02) | %m | 月(06) | %w | 星期(4)(0~6)(0是周日) |
%H | 时(14) | %M | 分(20) | %S | 秒(34) |
%j | 今年天数(171) | %U | 今年星期数(24) | %d | 日(20) |
%x | ( 06/20/19) | %X | (14:20:34) | %c | (Thu Jun 20 14:20:34 2019) |
时间戳:从1970/01/01 00:00:00开始的秒偏移量
函数,【】可省略 | 说明 |
---|---|
time.clock() | 当前CPU时间(浮点型) |
time.time() | 当前的时间戳(浮点型) |
time.mktime(时间元组) | 返回当时的时间戳 |
time.localtime(【时间戳】) | 返回当时的时间元组(默认现在) |
time.gmtime(时间戳) | 返回当时的时间元组(0°经线时间) |
time.strptime(字符串,格式) | 将字符串格式化为时间元组 |
time.strftime(格式) | 将时间元组格式化为字符串 |
time.asctime(【时间元组】) | 相当于time.strftime(’%c’【,时间元组】) |
time.ctime(【时间戳】) | 相当于time.asctime(localtime(时间戳)) |
time.tzname | 本地时区名称 |
time.altzone | 夏令时,离0°经线时间的秒偏移量 |
time.tiemzone | 非夏令时,离0°经线时间的秒偏移量 |
time.sleep(秒数) | 推迟调用线程的运行 |
时间元组struct_time
字段 | 说明 |
---|---|
tm_year | 年 |
tm_mon | 月(1~12) |
tm_mday | 日(1~31) |
tm_hour | 时(0~23) |
tm_min | 分(0~59) |
tm_sec | 秒(0~61)(闰秒) |
tm_wday | 星期(0~6)(周一是0) |
tm_yday | 天(1~366)(闰年) |
tm_isdst | 夏令时(-1,0,1) |
import time
time.sleep(10)#休眠,秒为单位
time.time() #当前时间 秒
d = time.strptime("2020-1-13 11:16:25","%Y-%m-%d %H:%M:%S") str-->tuple
d = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) str<--tuple
time.clock() #cpu时间