python列表解析式,生成器,及部分内建函数使用方法
标准库datetime
需要导入datetime模块:
import datetime
datetime模块:
对日期,时间,时间戳的处理
datetime的类方法
today ()
now(tz=None) 返回当前时间的datetime对象,时间到微秒,如果tz为none返回值和today()一样
utcnow()
fromtimestamp(timestamp,tz=None)从一个时间戳返回一个datemime对象
datetime对象:
timestamp()返回一个到微秒的时间戳
时间戳: 格林威治时间170年1月1日0点到现在的秒数
datetime对象,构造方法:
datetime.datetime(2017,10,08,13,55,35,123456)
year年month月day日hour时间minute分钟second秒microsecond微秒
replace() 返回并修改新的时间
isocalendar()返回一个三元组(年,周,周的天)
日期格式化:
类方法 strptime(date_string,foamat) ,返datetime对象
对象方法strftime(fotmat) ,返回字符串
字符串format函数格式化
timedelta对象:
datetime2= datetime1+datedelta datetime2=datetime1-datedelta timedelta=datetime1-datetime2 构造方法: datetime.timedelta(day=0,秒=0,微秒=0,毫秒=0,分=0 ,时=0,weeks=0) year= datetime.timedelta(day=365) total_seconds()返回时间差的总秒数 time: time.sleep(secs) 将调用线程挂起指定的秒数
列表解析:
举例:
生成一个列表,元素0~9,对每一个元素自增1后求平方返回新列表
l1=list(range(10)) l2=[] for i in l1: l2.append((i+1)**2)
使用列表解析式的程序为:
l1=list(range(10)) l2=[(i+1)**2 for i in l1] print(l2)
列表解析list comprehension
语法:
[返回值 for 元素 in 可迭代对象 if 条件] 使用中括号[],内部是for循环,if条件语句可选 返回一个新列表
列表解析式是一种语法糖
编译器会优化,不会因为简写而影响效率,反而优化提升效率
减少代码量,可读性强,工作量降低,减少出错
列表解析式进阶:
列表解析式为:[expr for item in iterable if cond1 if cond2]
自然语法为:
ret = [] for item in iterable: if cond1: if cond2: ret.append(expr)
举例:
20以内技能被2整除又能被3整除的数 [i for i in range(20) if i%2==0 and i%3==0] [i for i in range(20) if i%2==0 if i%3==0]
列表解析式多层循环的用法:
列表解析式的写法:[expr for i in iterable1 for j in iterable2 ]
自然写法:
ret = [] for i in iterable1: for j in iterable2: ret.append(expr)
举例
[(x, y) for x in 'abcde' for y in range(3)] [[x, y] for x in 'abcde' for y in range(3)] [{x: y} for x in 'abcde' for y in range(3)]
生成器表达式:
语法
(返回值 for 元素 in 可迭代对象 if 条件) 列表解析式的中括号换成小括号就是生成器表达式 返回一个生成器
和列表解析式的区别:
生成器表达式时按需计算('惰性求值',延迟计算),需要的时候才计算值 列表解析式是立即返回值
生成器:
可迭代对象
迭代器
举例
和列表解析式对比:
计算方式:
生成器表达式延迟计算,列表解析式立即计算
内存占用:
单从返回值来说,生成器表达式省内存,列表解析式返回新列表
生成器没有数据,内存占用少,使用时,一个个返回数据,总体占用数据差不多
列表解析式构造新的列表需要占用内存空间
计算速度:
单看计算时间,生成器表达式耗时短,列解析式耗时长
但是生成器本身没有返回任何值,只返回了一个生成器对象
列表解析式构造返回了一个新的列表
总结:
一般来说 ,多用解析式,简短 高效
如果一个解析式非常复杂,难以理解,可以考虑拆解for循环
生成器和迭代器时不同的对象,但都是可迭代对象
内建函数:
id(value)
表示id
返回对象的唯一标识
哈希 hash()
返回一个对象的哈希值
类型type()
返回对象的类型
类型转换
float() int() bin() hex() oct() bool() list() tuple() dict() set() complex() bytes() bytearray(
输入input([prompt])
接收用户输入,返回一个字符串
打印 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 打印输出,默认使用空格分割,换行结尾,输出到控制台
对象长度 len(s)
返回一个集合类型的元素个数
isinstance(obj,class_or_tuple)
判断对象obj是否属于某种类型或者元组中列出的某个类型
isinstance(True,int)
issubclass(cls,class_or_tuple)
判断类型cls是否时某种类型的子类或元组中列出的某个类型的子类
issubclass(bool,int)
绝对值abs(x) x为数值
最大值 max() 最小值min()
返回可迭代对象中最大或最小值
返回多个参数中最大或最小值
round(x) 四舍五入六取整,rount(-0.5)
pow(x,y) 等同于x**y
range(stop)
从0开始到stop-1的可迭代对象;range(start,stop[,step])从start开始到stop-1步长为step的可迭代对象
divmod (x,y) 等价于 tuple(x//y,x%y)
sum(可迭代对象[,start]) 对可迭代对象的所有数值元素求和
sum(1,100,2)) 求1到100步进为2的元素的和值
chr()给定一个一定范围的整数返回对应的字符 chr(97)=a chr(20013)=中 ord()返回字符对应的整数 ord('a')=97 ord('中')=20013
sorted(可迭代对象[元素][reverse])排序
返回一个新的列表默认升序
reverse是反转
反转:
reversed(seq)
返回一个反转元素的迭代器
枚举: enumerate(seq, start=0) 迭代一个序列,返回索引数字和元素构成的二元组 star表示索引开始的数字,默认是0
迭代器和取元素 iter(可迭代对象)、next(可迭代对象)
iter 将一个可迭代对象封装成一个迭代器
next对一个迭代器取下一个元素,如果所有元素以取过,再次next会抛出StopIteration异常
可迭代对象:
能同过迭代一次次返回不同的元素的对象,所谓相同不是指值是否相同,而是元素在容器中是否是同一个,例如列表中的值可以重复 可以迭代,但是未必有序,未必可索引 可迭代对象有 : list tuple string bytes bytearray range set dict 生成器等 可以使用成员操作符in not in,in本质山就是在遍历对象
迭代器:
特殊的对象,一定是可迭代对象,具备可迭代对象的特征
通过iter法国法把一个可迭代对象封装成迭代器
通过next方法,迭代迭代器对象
生成器对象,就是迭代器对象
拉链函数zip(多个可迭代对象)
项拉链一样把多个可迭代对象合并在一起,返回一个迭代器
将每次从不同对象中取到的元素合并成一个元组
posted on 2017-10-08 16:22 pythonerLau 阅读(1118) 评论(0) 编辑 收藏 举报