python习题,关于列表推导式与生成器的练习

列表推导式习题
习题1

s1 = ['alex', 'li', 'WuSir', 'super', 'ab']
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母python

s = [i.upper() for i in s1 if len(i) >= 3]
print(s)
# 运行结果:
# ['ALEX', 'WUSIR', 'SUPER']
习题2

求(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)]
习题3

求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]
习题4

求出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]
习题5

构建一个列表:['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期']
习题6

构建一个列表:[(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)]
习题7

构建一个列表:[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]
习题8

有一个列表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']
习题9

有如下数据类型:
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]]
习题10

用列表完成笛卡尔乘积
如图示:

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')]
习题11

构建一个列表,列表里面是三种不一样尺寸的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')]
习题12

构建一个列表,列表里面的元素是扑克牌除去大小王之后,全部的牌类(列表里面的元素为元组类型).

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')]
习题13

简述一下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返回
习题14

看下面代码,可否对其简化,说说你简化后的优势?

# 优化前
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.更精简更美观

习题15

看代码求结果(面试题):

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

习题16

看代码求结果(面试题):

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)的过程,没法返回!

习题17

看代码求结果(面试题):

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
相关文章
相关标签/搜索