一、列表生成式
用来创建list的表达式,相当于for循环的简写形式
语法: [表达式 for循环 判断条件]
1 ''' 2 普通写法 3 ''' 4 def test(): 5 l= [] 6 for i in range(10): 7 l.append(i*i) 8 return l 9 print(test()) 10 11 ''' 12 高级写法 13 ''' 14 l = [x * x for x in range(10)] 15 print(l) 16 17 ''' 18 更高级的用法 19 格式:[操作 for i in range(x) 执行操作的条件(x)] 20 ''' 21 ##得到0-9序列中偶数的平方 22 l = [x * x for x in range(10) if x%2==0)] 23 print(l) 24 ''' 25 高级解释:x*x 来源于0--9的for循环 但是 x要满足x%2==0 26 '''
1 ## 提取字符串中的数字,组成字符串 2 l = 'asd123fds123' 3 l2 = [x for x in l if x.isdigit()] 4 x =''.join(x) ## 字符串拼接 5 print(x) 6 ''' 7 解释:x 来源于for循环(遍历l), 但是x要是数字 8 '''
二、生成器generator
生成器和列表生成器很像,只是把中括号变成小括号
生成器不会一次性生成所有数据,只有在调用的时候才生成。
生成器不能通过切片、或者下标取数据,只能循环或者next()取数据--- 注意生成器的位置问题,类似于‘’句柄‘’
##生成器的语法和列表生成器很像 g = (x*x for x in range(10)) print(g) ## 输出是:generator对象 print(type(generator)) ## 输出是:generator对象 print(next(g)) ## 获得下一个元素 ## 直接遍历generator对象 for n in g: print(n)
二、可迭代对象和迭代器
可迭代对象(Iterable):能被for遍历 不能next()
迭代器(Iterator): 能被for遍历 能next()函数调用,不断返回下一个值
迭代器对象表示一个数据流,可以被看做是一个序列,但是长度不可知。只是在需要的时候,才会计算。
它可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误
1 ## 可以被for循环的对象,称为可迭代对象 2 ## 可以被next()和for访问,称之为迭代器对象(用的时候才生成) 3 from collections import Iterable,Iterator 4 5 ## 判断对象的类型-- 类似于type 6 print(isinstance([],Iterable))## True 可迭代 对象 7 print(isinstance([],Iterator))## Flase 不是可迭代器对象 不能next访问 8 9 print(isinstance('a',Iterable))##True 10 print(isinstance('a',Iterator))##Flase 11 12 print(isinstance({},Iterable))##True 13 print(isinstance({},Iterator))##Flase 14 15 ## 数值既不是可迭代对象,也不是迭代器对象 16 ## 列表、字符串、字典、元祖 都是Iterable对象,不是Iterator对象 17 ## generator、map、filter既是Iterable对象,也是Iterator对象 18 19 ##可迭代对象转为迭代器对象--- iter() 20 it = iter([1,2,3]) 21 print(next(it)) ##输出1 22 23 24 print('----------------------') 25 l = [(2,12),(6,23),(4,8)] 26 l.sort(key=lambda x:x[1],reverse=True) ## sort(key,...)根据什么条件排序,排序条件 27 28 print(l) 29 print(l[0][0])
type主要用于获取未知变量的类型,范围比较小
isinstance主要用于判断A类是否继承于B类,范围更大
有生之年,只诉衷肠不言殇.....