第二次作业

用列表推导式做下列小题

过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

l1=["sadasdsad","sadasdasdasdasd","aaa","s"]

a=[i.upper() for i in l1 if len(i)>=3]
print(a)

求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

a=[(x,y) for x in range(0,6) if x%2==0 for y in range(0,6) if y%2!=0]
print(a)

求M中3,6,9组成的列表 M = [[1,2,3],[4,5,6],[7,8,9]]

M=[[i,i+1,i+2] for i in range(1,10,3)]

print([i[-1] for i in M])

求出50以内能被3整除的数的平方,并放入到一个列表中。

[i**2 for i in range(51) if i%3==0]

构建一个列表:['python1期', 'python2期', 'python3期', 'python4期',

'python6期', 'python7期', 'python8期', 'python9期', 'python10期']

[f'python{i}期' for i in range(1,11)]

构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

[(i,i+1) for i in range(1,6)]

构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

[i*2 for i in range(1,9)]
# 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']

# 将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']

​```
[f'{l1[i]}{i}' for i in range(len(l1))]
​```

# l1 = ['alex', 'WuSir', '老男孩', '太白']

有以下数据类型:

用列表完成笛卡尔积

什么是笛卡尔积? 笛卡尔积就是一个列表,

列表里面的元素是由输入的可迭代类型的元素对构成的元组,

因此笛卡尔积列表的长度等于输入变量的长度的乘积。

[(),(),().....]

a. 构建一个列表,列表里面是三种不同尺寸的T恤衫,每个尺寸都有两个颜色(列表里面的元素为元组类型)。

colors = ['black', 'white']
sizes = ['S', 'M', 'L']

 print([(color,size) for color in colors for size in sizes])

b. 构建一个列表,列表里面的元素是扑克牌除去大小王以后,所有的牌类(列表里面的元素为元组类型)。

l1=["A"]+[i for i in range(2,11)]+["J","Q","K"]
l2=["红心","草方","黑桃","梅花"]

[(i,j) for  i in l1 for j in l2]

# l1 = [('A','spades'),('A','diamonds'), ('A','clubs'), ('A','hearts')......('K','spades'),('K','diamonds'), ('K','clubs'), ('K','hearts') ]

简述一下yield 与yield from的区别。

yield和yield from 后边加上可迭代对象的时候,
yield from是将可迭代对象中的元素一个一个yield出来,
而yield是直接yield的是可迭代对象

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

def chain(*args):

    # ('abc',(0,1,2))

​    for it in args:
​        for i in it:
​            yield i
g = chain('abc',(0,1,2))

怎么让生成器产出值?

next ,for 循环, 转化成list

print(next(g))

print(next(g))

print(next(g))

print(next(g))

print(list(g))

print(list(g))  # 将迭代器转化成列表


def chain(*args):
    # ('abc',(0,1,2))
    for it in args:
        yield from it  # 'abc'  (0,1,2)
g = chain('abc',(0,1,2))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

yield from 优化了内层循环,提高了效率。

# print(list(g))

# def func():

#     # yield [1,2,3]

#     yield from [1,2,3]

#     '''

#     yield 1

#     yield 2

#     yield 3

#     '''

# g = func()

# print(next(g))

# print(next(g))

# print(next(g))

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

v = [i % 2 for i in range(10)]
print(v)


[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

v = (i % 2 for i in range(10))
print(v)

内存地址
<generator object <genexpr> at 0x02F0AAE0>



for i in range(5):
	print(i)
print(i)

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)

#
没有for 循环 没有 list 没有next  不执行!!!
 g g1  g2就是一个内存 地址

# print(list(g1)) 

list(i for i in demo())   [0,1,2,3]  已经对g取完了



# print(list(g2))

[0, 1, 2, 3]
[]


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

# def add(n,i):

#     return n+i

#

# def test():

#     for i in range(4):  # 0 1 2 3

#         yield i

#

# g=test()

# for n in [1,10]:

#     g=(add(n,i) for i in g)

************这句话之前   g是生成器 就是一个内存地址 是不执行的

第一次循环
n=1
g=(add(n,i) for i in g)
第二次循环
n=10
g=(add(n,i) for i in g)

list(g)----list((add(n,i) for i in ((add(n,i) for i in ([0,1,2,3]))))
list(g)----list((add(10,i) for i in ((add(10,i) for i in ([0,1,2,3]))))
list(g)----list((add(10,i) for i in [10,11,12,13])))
list(g)----[20,21,22,23]



# print(list(g))
posted @ 2020-03-05 13:33  小丁变优秀  阅读(85)  评论(0)    收藏  举报