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))  

木桶原理。

 

posted @ 2018-11-12 16:08  Python爱好者666  阅读(575)  评论(0)    收藏  举报