一、Python封装与解构
- 封装:将多个值使用逗号分割,组合在一起。本质上返回一个元组,只是省掉了小括号。
- 解构:把线性结构的元素解开,并顺序的赋给其他变量。左边接纳的变量数要和右边解开的元素个数一致。
例一:
t1 = (1,2) t2 = 1,2 #将1和2封装成元组
例二:交换的数据
#数据位置交换 x = 10 y = 11 temp = x #把x赋值于一个新的变量 x = y y = temp #封装和解构,交换 x = 10 y = 11 x,y = y,x
例三:
lst = [3,5] 2 first,second = lst #将列表中的值结构后分别赋给 first和secon
-
剩余变量解构
- 【*】标识符
- 收集尽可能多的元素
- 使用 *变量名 接收,但不可单独使用
- *变量名 收集后组成一个列表
a1,a2,*a3,a4 = range(10) #其中*a3就将结构后多余的数据全部给自己。 print(a1,a2,a4) print(a3)
- 【_】丢弃的变量
- 如果不关心一个比那里,可以定义该变量的名字为【_】
_,_,(*_,a),*_ = [1,2,(3,4,5),6,7] print(a)
二、解析式和生成器表达式
1、列表解析式
- 列表解析式List Comprehension,也叫列表推导式。
例:
#生成一个列表,元素0~9,将每一个元素加1后的平方值组成新的列表 x = [] for i in range(10): x.append( (i + 1) **2 ) print(x) #列表解析式 print([(i + 1) **2 for i in range(10)])
语法
- 【返回值for元素in可迭代对象if条件】
- 使用中括号【】,内部是for循环,if条件语句可选
- 立即返回一个新的列表
列表解析式的优点
- 编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
- 减少程序工作量,减少出错
- 简化代码,可读性增强
2、生成器表达式
- 语法
- (返回值 for 元素 in 可迭代对象 if 条件)
- 使用小括号(),内部是for循环,if条件语句可选,会返回一个生成器对象
- 生成器与列表解释器的区别
- 生成器表达式是按需计算(或称为惰性求值、延迟计算),需要的时候才计算值
- 列表解析式是立即返回值
- 生成器:是一个可迭代对象。是一个迭代器
生成器:是一个可迭代对象。是一个迭代器
生成器表达式和列表解析式的区别
- 计算方式
- 生成器表达式:延迟计算,按需取值。
- 列表解析器:立即计算,得到所有值
- 内存占用
- 生成器表达式:节约内存,生成器对象是个对象,需要数据时就计算获取一个值
- 列表解析式:占用内存与数据总量一致。
- 计算速度
- 生成器表达式: 耗时非常短
- 列表解析式: 耗时长
集合解析式
- {返回值 for 元素 in 可迭代对象 if 条件}
- 使用大括号{},值必须是可哈希,内部是for循环,if条件语句可选,会返回一个集合
{(x,x+1) for x in range(10)} { x for x in range(10)}
字典解析式
- {返回值 for 元素 in 可迭代对象 if 条件}
- 使用大括号{},值使用key:value形式定义,key必须是可哈希,内部是for循环,if条件语句可选,会返回一个字典
dictt1 = { x:x+1 for x in range(10)} dictt2 = {x:[x+1] for x in range(10)} dictt3 = {(x,):[x+1] for x in range(10)} dictt4 = {str(x):[x,x+1] for x in range(10)} dictt5 = {chr(0x41+x):x**2 for x in range(10)} print(dictt1,dictt2,dictt3,dictt4,dictt5,sep=" ")
总结
- Python2 引入列表解析式
- Python2.4 引入生成器表达式
- Python3 引入集合、字典解析式,并迁移到了2.7
- 一般来说应该多用解析式,简短、高效。如果一个解析式非常复杂难读懂,要考虑使用for循环
- 生成器和迭代器是不同的对象,单都是可迭代对象
- 生成器对象 —— 一定是迭代器 —— 一定可迭代
- 迭代器:能用next()函数调用取下一个值。是迭代器 —— 一定可迭代
- 可迭代对象,不一定是迭代器,也不一定是生成器对象
三、datetime时间模块
datetime类,时间模块中的类datetime
类方法
- todaty() 返回本地时区当前时间的datetime对象
- now(tz==None) 返回当前时间的datetime对象,时间到微妙,如果tz为None,返回和today()一样
- utcnow() 返回没有时区的当前时间
- fromtimestamp(timestamp,tz=None)从一个时间戳返回一个datetime对象
- timestamp 时间戳
- tz 时区
- strptime(date_string,format) 将指定格式的字符串转换为datetime对象,【日期的格式化】
例:
import datetime datetime.datetime.strptime("2019-04-8 15:18","%Y-%m-%d %H:%M")
datetime对象
- timestamp()–>int 返回一个到微妙的时间戳。
- 时间戳:格林威治时间1970年1月1日0点到现在的秒数
- datetime(year,month,day,hour,minute,second,microsecond)—>datetime 构造方法,创建指定时间
- weekday() 返回本周的第几天,周一 0 ,周日 6
- isoweekday() 返回本周的第几天,周一 1 ,周日 7
- date() 返回日期date对象
- time() 返回时间time对象
- replace() 修改并返回新的时间
- socalendar() 返回一个三元组(年,周数,一周内的第几天)
- strftime(format) —>string,将datetime对象转换成指定格式的时间字符串
例:
import datetime datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") "{0:%Y}-{0:%m}-{0:%d}".format(datetime.datetime.today())
timedelta对象(时间差)
- datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
构造方法
- timedelta对象还可以根据两个时间相减得到。
- 例如: timedelta = datetime1 - datetim2
- 同样datetime加上timedelta可以获取新的datetime对象。则 datetime2 = datetime1 + timedlata
- total_seconds() 返回时间差的总秒数
例:
import datetime d1 = datetime.datetime.now() # 获取当前时间 d2 = datetime.datetime.utcnow() # 获取utc时间 d3 = datetime.datetime.today() # 获取当前时间 d4 = datetime.datetime(2019,4,10) # 获取指定时间 print(d1,d2,d3,d4,sep=" ") d5 = datetime.datetime.fromtimestamp(d4.timestamp()) # 根据d4的时间戳获取datetime对象 d6 = datetime.datetime.fromtimestamp(int(d3.timestamp())) # 根据d3的时间戳(只要秒以前的),获取datetime对象 print(d5,d6,sep=" ")