s1 = ['alex', 'li', 'WuSir', 'super', 'ab']
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母python
s = [i.upper() for i in s1 if len(i) >= 3] print(s) # 运行结果: # ['ALEX', 'WUSIR', 'SUPER']
求(x, y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表面试
lst = [(x, y) for x in range(0, 6, 2) for y in range(1, 6, 2)] print(lst) # 运行结果: # [(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
求m中3, 6, 9组成的列表m= m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]数组
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] m1 = [i[-1] for i in m] print(m1) # 运行结果: # [3, 6, 9]
求出50之内能被3整除的数的平方,并放到一个列表中app
lst = [i ** 2 for i in range(1, 51) if i % 3 == 0] print(lst) # 运行结果: # [9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304]
构建一个列表:['python1期', 'python2期','python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期' ]函数
lst = [f'python{i}期' for i in range(1, 11)] print(lst) # 运行结果: # ['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]测试
# 方法一: # lst = [i for i in zip(range(6), range(1, 7))] # print(lst) # 方法二: lst = [(i, i + 1) for i in range(6)] print(lst) # 运行结果: # [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]优化
lst = [i for i in range(0, 19, 2)] print(lst) # 运行结果: # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']
将其构形成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']spa
l1 = ['alex', 'WuSir', '老男孩', '太白'] lst = [f'{l1[i]}{i}' for i in range(len(l1))] print(lst) # 运行结果: # ['alex0', 'WuSir1', '老男孩2', '太白3']
有如下数据类型:
x = {'name': 'alex',
'Values': [{'timestamp': 1517991992.94, 'values': 100},
{'timestamp': 1517992000.94, 'values': 200},
{'timestamp': 1517992014.94, 'values': 300},
{'timestamp': 1517992744.94, 'values': 350},
{'timestamp': 1517992800.94, 'values': 280}]}code
将上面的数据经过列表推导式转换成下面的的类型:[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]对象
x = {'name': 'alex', 'Values': [{'timestamp': 1517991992.94, 'values': 100}, {'timestamp': 1517992000.94, 'values': 200}, {'timestamp': 1517992014.94, 'values': 300}, {'timestamp': 1517992744.94, 'values': 350}, {'timestamp': 1517992800.94, 'values': 280}]} lst = [[i['timestamp'], i['values']] for i in x['Values']] print(lst) # 运行结果: # [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
用列表完成笛卡尔乘积
如图示:
A = {1, 3, 5} B = {'a', 'b', 'c', 'd'} AXB = [{(a, b) for a in A for b in B}] print(AXB) # 运行结果: # [(3, 'c'), (5, 'd'), (5, 'c'), (3, 'd'), (3, 'b'), (1, 'd'), (1, 'c'), (3, 'a'), (5, 'b'), (5, 'a'), (1, 'b'), (1, 'a')]
构建一个列表,列表里面是三种不一样尺寸的T恤衫,每一个尺寸都有两个颜色(列表里面的元素为元组类型).
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
colors = ['black', 'white'] sizes = ['S', 'M', 'L'] lst = [(size, color) for size in sizes for color in colors] print(lst) # 运行结果: # [('S', 'black'), ('S', 'white'), ('M', 'black'), ('M', 'white'), ('L', 'black'), ('L', 'white')]
构建一个列表,列表里面的元素是扑克牌除去大小王之后,全部的牌类(列表里面的元素为元组类型).
l1 = [('A', 'spades'), ('A', 'diamonds'), ('A', 'clubs'), ('A', 'hearts')...('K', 'hearts')]
l1 = [('A', 'spades'), ('A', 'diamonds'), ('A', 'clubs'), ('A', 'hearts'), ('K', 'hearts')] lst = [(num, color) for num in (list('A') + list(range(2, 11)) + list('JQK')) for color in ['spades', 'diamonds', 'clubs', 'hearts']] print(lst) # 运行结果: # [('A', 'spades'), ('A', 'diamonds'), ('A', 'clubs'), ('A', 'hearts'), (2, 'spades'), (2, 'diamonds'), (2, 'clubs'), (2, 'hearts'), (3, 'spades'), (3, 'diamonds'), (3, 'clubs'), (3, 'hearts'), (4, 'spades'), (4, 'diamonds'), (4, 'clubs'), (4, 'hearts'), (5, 'spades'), (5, 'diamonds'), (5, 'clubs'), (5, 'hearts'), (6, 'spades'), (6, 'diamonds'), (6, 'clubs'), (6, 'hearts'), (7, 'spades'), (7, 'diamonds'), (7, 'clubs'), (7, 'hearts'), (8, 'spades'), (8, 'diamonds'), (8, 'clubs'), (8, 'hearts'), (9, 'spades'), (9, 'diamonds'), (9, 'clubs'), (9, 'hearts'), (10, 'spades'), (10, 'diamonds'), (10, 'clubs'), (10, 'hearts'), ('J', 'spades'), ('J', 'diamonds'), ('J', 'clubs'), ('J', 'hearts'), ('Q', 'spades'), ('Q', 'diamonds'), ('Q', 'clubs'), ('Q', 'hearts'), ('K', 'spades'), ('K', 'diamonds'), ('K', 'clubs'), ('K', 'hearts')]
简述一下yield与yield from的区别
# yield 例子 def gen1(): i = 0 while i < 3: yield [3, 5] print(f'i:{i}') i += 1 g1 = gen1() for i in g1: print(i) # 运行结果: # [3, 5] # i:0 # [3, 5] # i:1 # [3, 5] # i:2 # [3, 5] # yield from 例子 def gen2(): i = 0 while i < 3: yield from [3, 4, 5] print(f'i:{i}') i += 1 g2 = gen2() for i in g2: print(i) # 运行结果: # 3 # 4 # 5 # i:0 # 3 # 4 # 5 # i:1 # 3 # 4 # 5 # i:2
经过例子能够看出如下区别:
1.跟的对象不一样
yield obj: 任意对象
yield from obj:obj必须是[可迭代对象、迭代器、生成器]之一
2.返回的值不一样
yield obj:返回的是obj整个对象的值
yield from obj:返回的是next(iter(可迭代对象))的下一个值
3.执行顺序不一样
yield obj:
返回obj对象值以后会执行后面的程序
yield from obj:
返回next(iter(可迭代对象))的下一个值后,会继续取值,只有取值结束才会继续执行后面的程序
4.return状况不一样
yield obj:
在for循环中,若是取值中遇到return 直接内部会处理StopIteration异常,在while循环中会抛出StopIteration异常,
都得不到return 值
yield from obj:
在遇到生成器的时候,若是遇到return vaule,会把vaule返回给yield from,而后结果赋值给了result,能够获得return 返回值
def my_gen(): i = 0 while True: yield i if i == 2: return 'my_gen i=2返回' i += 1 def gen2(): result = yield from my_gen() print(f'result:{result}') g2 = gen2() while True: try: print(next(g2)) except StopIteration: break # 运行结果: # 0 # 1 # 2 # result:my_gen i=2返回
看下面代码,可否对其简化,说说你简化后的优势?
# 优化前 def chain(*iterables): for it in iterables: for i in it: yield i g = chain('abc', (0, 1, 2)) print(list(g)) # 优化后 def chain(*iterables): for it in iterables: yield from it g = chain('abc', (0, 1, 2)) print(list(g))
1.优化了空间,提升了效率
2.更精简更美观
看代码求结果(面试题):
v = [i % 2 for i in range(10)] print(v) v = (i % 2 for i in range(10)) print(v) for i in range(5): print(i) print(i)
结果:
第一个打印结果:
[0,1,0,1,0,1,0,1,0,1]
第二个打印结果:
迭代器对象的地址
第三个打印结果:
0
1
2
3
4
第三个打印结果:
4
看代码求结果(面试题):
def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) print(list(g2))
结果:
第一个打印结果:
[0, 1, 2, 3]
这时候对g1进行生成器g循环取值第二个打印结果:
[]
next是一个一直向下的过程,
因此当遇到对象g1迭代取值的时候,
也便是对g生成器取值,
以前g对象已经取值结束了,
因此继续就取不到值了,
因此获得结果就是该g2迭代器(空值)!注意:重点记住生成器个一直向下取值(next)的过程,没法返回!
看代码求结果(面试题):
count = 0 t = 0 def add(n, i): global count count += 1 print('add', count) return n + i def test(): global t for i in range(4): t += 1 print('test', t) yield i print('start 1') g = test() print('start 2') for n in [1, 10, 5, 2]: print('start 4') g = (add(n, i) for i in g) print('start 5') print(list(g)) print('start 6') """ 经过增长列表[1,10,5,2]的元素实验和断点查看 得出如下结论: 1.首先生成器除非遇到被[list(),for循环,next(),send()]调用,不然是不会执行生成器的! 2.其次生成器在生成的时候,内部是不会执行操做的,相似于def fun()的预加载同样, 只是至关于添加了生成了这个生成器的地址 3.在遇到题中 for n in [1, 10, 5, 2]: g = (add(n, i) for i in g) 经过断点看出只是把for n in [1, 10, 5, 2]这个列表的n值传入进了这个生成器, 这个列表生成器只是参数n修改了,可是并无被执行操做,同时生成器地址变动了,意味着原先的指向已经断开! 每次循环会新生成一个生成器同时n值也会变动,最后n值是2 4.在执行到list(g)的时候,这个时候查看刚才说的第一点能够看出已经执行了内部的调用next()的操做! 5.在执行生成器test()的时候yeild 返回i值 这个时候是0,而后这边挂起等待另一边下次调用! 6.在执行add(n, i)的时候,经过断点和打印的方法确认了一个事实,虽然目前依然没有明白这个操做的内核, 因此只能浅显的经过断点和打印的效果测试说明下状况: 通关断点和打印能够看出 这个add(n, i)内的函数被执行了4次。 这个4次跟咱们的循环的次数是一致了,以前已经经过增减列表的方法测试过,add(n, i)函数的执行次数跟列表成正相关。 7.在执行add(n, i)函数的时候通关断点查看,这个时候咱们说下每轮的循环值: 第一轮:n:2 i:0 return n+i # 2同时这个时候i的值也变成了2 第二轮:n:2 i:2 return n+i # 4同时这个时候i的值也变成了4 第三轮:n:2 i:4 return n+i # 6同时这个时候i的值也变成了6 第四轮:n:2 i:6 return n+i # 8 当以上4轮循环结束的时候 能够回头看到前面提到第5点,test()从上次挂起的位置继续执行到yeild i 返回i值 这个时候是1,而后这边挂起等待另一边下次调用! 而后依次循环add(n, i)4次 获得结果9 而后继续执行生成器...............10 ..............................11 综上所述结果是:[8, 9, 10, 11] 经过执行的结果和顺序能够看出这个过程相似于 *************************************** def test(): for i in range(4): yield i def add(n, i): return n + i lst = [] g = test() for i in g: for index in range(len([1, 10, 5, 2])): i = add([1, 10, 5, 2][-1], i) lst.append(i) print(lst) # [8, 9, 10, 11] *************************************** 以上主要是碰到add(n, i)这段循环屡次遇到麻烦卡了不短期,虽然最后只能靠断点依照状况描述,可是实际内部状况,但愿知情者能给点帮助谢谢! """ # 运行结果: # start 1 # start 2 # start 4 # start 4 # start 4 # start 4 # start 5 # test 1 # add 1 # add 2 # add 3 # add 4 # test 2 # add 5 # add 6 # add 7 # add 8 # test 3 # add 9 # add 10 # add 11 # add 12 # test 4 # add 13 # add 14 # add 15 # add 16 # [8, 9, 10, 11] # start 6