第二次作业
用列表推导式做下列小题
过滤掉长度小于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))
对代码有疑问欢迎交流
一个python爱好者 :
微信:at8685b

浙公网安备 33010602011771号