python学习第四周总结

一、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 

  • 剩余变量解构

  • 【*】标识符
  1. 收集尽可能多的元素
  2. 使用 *变量名 接收,但不可单独使用
  3. *变量名 收集后组成一个列表
a1,a2,*a3,a4 = range(10)  #其中*a3就将结构后多余的数据全部给自己。
print(a1,a2,a4)         
print(a3)
  • 【_】丢弃的变量
  1. 如果不关心一个比那里,可以定义该变量的名字为【_】
_,_,(*_,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、生成器表达式

  • 语法
  1. (返回值 for 元素 in 可迭代对象 if 条件)
  2. 使用小括号(),内部是for循环,if条件语句可选,会返回一个生成器对象
  • 生成器与列表解释器的区别
  1. 生成器表达式是按需计算(或称为惰性求值、延迟计算),需要的时候才计算值
  2. 列表解析式是立即返回值
  • 生成器:是一个可迭代对象。是一个迭代器

生成器:是一个可迭代对象。是一个迭代器

生成器表达式和列表解析式的区别

  • 计算方式
  1. 生成器表达式:延迟计算,按需取值。
  2. 列表解析器:立即计算,得到所有值
  • 内存占用
  1. 生成器表达式:节约内存,生成器对象是个对象,需要数据时就计算获取一个值
  2. 列表解析式:占用内存与数据总量一致。
  • 计算速度
  1. 生成器表达式:   耗时非常短
  2. 列表解析式:   耗时长

集合解析式

  • {返回值 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="\n")

总结

  • Python2 引入列表解析式
  • Python2.4 引入生成器表达式
  • Python3 引入集合、字典解析式,并迁移到了2.7
  1. 一般来说应该多用解析式,简短、高效。如果一个解析式非常复杂难读懂,要考虑使用for循环
  2. 生成器和迭代器是不同的对象,单都是可迭代对象
  • 生成器对象 —— 一定是迭代器 —— 一定可迭代
  • 迭代器:能用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="\n")

d5 = datetime.datetime.fromtimestamp(d4.timestamp()) # 根据d4的时间戳获取datetime对象
d6 = datetime.datetime.fromtimestamp(int(d3.timestamp())) # 根据d3的时间戳(只要秒以前的),获取datetime对象
print(d5,d6,sep="\n")

猜你喜欢

转载自www.cnblogs.com/fjjj/p/12687924.html