day14.生成器进阶,推导式

生成器中取值的三种方法

方法1:next()

方法2:for 循环

方法3:数据类型的强制转换

def func():
    for i in range(20):
        yield '赛车*{}'.format(i)

ret = func()
print(ret.__next__())

for i in ret:
    print(i)

l1 = list(ret)
print(l1)

send() 方法

send 获取下一个值得时候给上一个yield位置传递一个数据

第一个 yiled 必须使用next 获取下一个值

最后一个yield 不能接受任何值

def func():
    print(1)
    con = yield 111
    print('yield1 的返回值测试:',con)

    print(2)
    con2 = yield 222

g = func()
ret1 = g.__next__()
print(ret1)

ret2 = g.send('hello,world')
print(ret2)
1 111 yield1 的返回值测试: hello,world 2 222

 send方法获取动态平均值小练习

简略版分析:

def avg():
    sum = 0
    count = 0
    avg = 0
    num = yield      # next方法执行至此,执行yield之前的所有函数。下面执行send方法时,执行赋值给num
    sum += num
    count += 1
    avg = sum/count
    yield avg       

avg_g = avg()
avg_g.__next__()      
last = avg_g.send(10)  
print(last)

进阶版本:

def avg():
    sum = 0
    count = 0
    avg = 0
    while True:
        num = yield avg  # 直接传参,避免count = 0无法执行报错
        count += 1
        sum += num
        avg = sum / count

avg_g = avg()
avg_g.__next__()
last = avg_g.send(10)
print(last)
last1 = avg_g.send(20)
print(last1)
10.0
15.0

 yield from 方法

在生成器函数中,可以替代 for 循环取值

def func():
    a = 'abcde'
    b = '12345'
    yield from a
    yield from b
g = func()
for i in g:
    print(i)

 列表推到式

记住就行了,不难

print([i for i in range(10)])
print(['倒数15个数:{}'.format(i) for i in range(5,0,-1)])
[0,
1, 2, 3, 4, 5, 6, 7, 8, 9] ['倒数15个数:5', '倒数15个数:4', '倒数15个数:3', '倒数15个数:2', '倒数15个数:1']

生成器表达式

列表表达式会将结果全部打印出来,占内存。

print((i for i in range(10)))
<generator object <genexpr> at 0x00000244643515C8>

 例:1到10 取每个数的平方

g = (i**2 for i in range(10))
for i in g:
    print(i)

 列表推导式

例1:30以内所有能被3整出的数,以及此数的平方

ret = [i for i in range(30) if i%3 == 0]
print(ret)

ret = [i*i for i in range(30) if i%3 == 0]
print(ret)

例2:找到嵌套列表中名字含有两个 ‘e’ 的所有名字

嵌套列表有点意思,两个循环

names = [['tom','aa','aece'],['bob','bcde','edde']]
ret = [name for i in names for name in i if name.count('e') == 2]
print(ret)

字典推导式:

例1:将字典的 key 和 value 对调位置

shop = {'手机':1000,'电脑':3000,'鼠标':100}
shop2 = {shop[k]:k for k in shop}
print(shop2)

例2:合并字典大小写对应的value值,将k统一成小写

利用了一个字典的查找功能,找不到可以自定义返回值,很好用

mcase = {'a':10,'b':30,'A':7,'Z':3}
mcase2 = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase}
print(mcase2)

字典的get 方法

a = {'a':10,'b':20}
ret1 = a.get('a',100)
ret2 = a.get('c',30)
print(ret1,ret2)

10 30

python3 集合

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
>>> # 下面展示两个集合间的运算.>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b                              # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b                              # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}

集合推导式

集合推导式类似于列表推导式,自带去重功能

ret1 = {i**2 for i in [-1,1,2]}
print(ret1)
{1,4}
原文地址:https://www.cnblogs.com/jiuyachun/p/10456507.html