Python的列表解析式和生成器
1、python解析式和生成器
1) 标准库datetime:datetime模块。datetime.datetime.now()
对日期,时间,时间戳的处理。
datetime类
类方法:today() 返回本地时区当前时间的datetime对象
now(tz=None) 返回当前时间的datetime对象,时间到微秒,如果tz为None,返回
和today()一样
utcnow() 没有时区的当前时间
fromtimestamp(timestamp, tz=None) 从一个时间戳返回一个datetime对象
datetime对象,timestamp()返回一个到微妙的时间戳。
时间戳:格林威治时间1970年1月1日0点到现在的秒数
2)datetime对象
构造方法 datetime.datetime(2016, 12, 6, 16, 29, 43, 79043)
year、month、day、hour、minute、second、microsecond,取datetime对象的年月日时
分秒及微秒
weekday() 返回星期的天,周一0,周日6
isoweekday() 返回星期的天,周一1,周日7
date() 返回日期date对象
time() 返回时间time对象
replace() 修改并返回新的时间
isocalendar() 返回一个三元组(年,周数,周的天)
日期格式化*
p 类方法 strptime(date_string, format) ,返回datetime对象
p 对象方法 strftime(format) ,返回字符串
p 字符串format函数格式化
import datetime
dt = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
print("{0:%Y}/{0:%m}/{0:%d} {0:%H}::{0:%M}::{0:%S}".format(dt))
timedelta对象
p datetime2 = datetime1 + timedelta
p datetime2 = datetime1 - timedelta
p timedelta = datetime1 - datetime2
p 构造方法
p datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
minutes=0, hours=0, weeks=0)
p year = datetime.timedelta(days=365)
p total_seconds() 返回时间差的总秒数
p time
p time.sleep(secs) 将调用线程挂起指定的秒数
2、列表解析式
1)b=[i for i in range(10)]
print(b)
使用[]括号,内部是for循环,if语句可以多选。
返回一个新的列表。
2) 编译器会优化,不会因为简写而影响效率,反而因优化提高了效率。
减少工作量,减少出错。
简化代码,可读性增强。
3、生成器表达式
1)(返回值 for元素 in 可迭代对象 if条件)
利用小括号。
返回一个生成器。
返回的是生成器对象.
2) 和列表解析式的区别,表达式是按需计算(或称为惰性求值,延迟计算)需要的时候才会出现。 不会立即生成一个值。 迭代器是可迭代对象,但是可迭代对象但不一定是可迭代器。
列表解析式立即返回一个值。
3)生成器:可迭代对象,迭代器。
g=(i for i in range(5))
for i in g:
print(i)
4、生成器
可迭代对象,迭代器。
next迭代器查看。 next()包装的是不同的迭代器的数字。
1)next总结
延迟计算
返回迭代器,可以迭代
从前到后走完一遍后,不能回头
2) 不添加next的总结
总结
立即计算
返回的不是迭代器,返回可迭代对象列表
从前到后走完一遍后,可以重新回头迭代.
it=(print("{}".format(i+1))for i in range(2))
first=next(it)
second=next(it)
val=first+second 此种情况不成立。
Print返回值是none。
成立的表达式:
it = (x for x in range(10) if x %2)
first=next(it)
second=next(it)
val=first+second
print(first,second)
5、生成器和列表解析式的对比
1)计算方式:生成器表达式延迟计算,列表解析式立即计算。
2)内存占用:单从返回值来看,生成器表达式省内存,列表解析式返回新的列表。
生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是使用的内存也不多。
列表解析式构造新的列表需要占用内存。
3)计算速度:计算时间来看,生成器耗时非常短,列表解析式耗时长。
但是生成器本身并没有任何返回值,只返回了一个生成器对象。
列表解析式构造并返回了一个新的列表。
6、集合解析式
{返回值 for 元素 in 可迭代对象,if} 立即返回一个对象。
使用一个大括号。
{(x,x+1)for x in range(10)}
7、字典解析式
{K:v} 使用key,value值 立即返回一个字典。
8、总结
一般来说,多应用解析式,简短,高效。
迭代器和生成器是不同的对象,但都是可迭代对象。
9、内建函数。
id 身份的唯一标示符。返回对象在内存中的地址。
hash () 返回一个对象的哈希值
type 返回对象的类型
类型转换。
输入input()函数
打印print()函数。
len(s)给一个容器返回元素的个数。
Isinstance()判断是 什么类型。 isinstance('abc',str)
Issubclass()判断一个类型是不是一个类型的子类。issubclass(bool,bool)
abs绝对值
max() min()最大值最小值,
round() 四舍六入五取偶。不分正负数。
pow(x,y)x**y次幂函数。
divmod(x,y)等价于 tuple (x//y, x%y) divmod(54321,10000) (5, 4321)
sum(iterable[,start]) 对可迭代对象的所有数值元素求和。sum(range(1,100,2))
chr(i)返回的对应的字符。 chr(97)
ord(c)返回字符对应的数字。 ord('a')
ascii() spr() str()
sorted()立即返回一个新的列表。
recersed(seq)是一个迭代器。翻转。
enumrate(seq,start=0)
迭代一个序列,返回索引数字和元组构成的二元组。
迭代器和取元素,iter(iterable),next()
Iter将一个可迭代对象封装成一个迭代器。
Next对一个迭代器取下一个元素,如果所有人元素都取过了,再次next将会报错,但是加上一个缺省值就不会报错。it=iter(reversed([1,3,5]))
next(it,100)
可迭代对象,能够通过迭代一次次返回不同的元素的对象。
所谓相同,不是指值是否相同,而是在元素的容器中是否是同一个。可以迭代,但是未必有序,未必可索引。
可迭代的对象有list、tuple,string,bytes,bytearray,range,set,dict,生成器等。
可以使用成员操作符in not in in本质上就是在遍历对象。3 in range(10) 3 in (x for x in range(10))
迭代器:特殊的对象,一定是可迭代对象,具备可迭代对象的特征。
通过iter方法把一个可迭代对象封装成迭代器。
通过next的方法,迭代迭代器对象。
生成器对象,就是迭代器对象。
zip函数。不是立即生成的。zip(range(10),range(10))
木桶原理。
浙公网安备 33010602011771号