python之路——14

王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594

复习

1.迭代器
1.双下方法:不常直接调用,是通过其他语法触发的
2.可迭代的:可迭代协议——含有__iter__() print('__iter__' in dir.(数据))
可以被for循环
3.迭代器协议:含有__iter__()和__next__()
可迭代
可迭代的通过__iter__()可以得到一个迭代器
4.迭代器特点:方便使用;所有数据只能取一次;节省内存
2.生成器
1.本质:是一种迭代器
2.表现形式: 生成器函数
生成器表达式
3.生成器函数: 含有yield 的函数
调用时,不执行,返回一个生成器
4.调用生成器中数据的方法:1.next 2.for 3.强制转换数据类型

学习内容

1.send ——第一次取值和最后一个yield不能用send
2.生成器表达式
3.各种推导式
遍历操作
筛选操作

代码区

1.生成器

def wahaha():
    for i in range(200):
        yield '娃哈哈%s'%i

g = wahaha()
for i in g:
    print(i)
def generator():
    print('123')
    yield 1
    print('345')
    yield
g = generator()
ret = g.__next__()
print('***',ret)
ret = g.__next__()
print('***',ret)

2.移位平均数,即每接受一个数,都重新计算平均数

# 1号
'''
def average():
    sum = 0
    count = 0
    avg = 0
    while 1:
        num = yield
        sum += num
        count += 1
        avg = sum/count
        yield avg
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
print(avg1)
avg_g.__next__()
avg1 = avg_g.send(20)
print(avg1)
'''
# 2号
'''
def average():
    sum = 0
    count = 0
    avg = 0
    num = 0
    while 1:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
print(avg1)
avg1 = avg_g.send(20)
print(avg1)
'''
# 3号
'''
def initial(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        ret.__next__()
        return ret
    return inner
@initial
def average():
    sum = 0
    count = 0
    avg = 0
    num = 0
    while 1:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count
avg_g = average()
avg1 = avg_g.send(10)
print(avg1)
avg1 = avg_g.send(20)
print(avg1)

3.生成器表达式

li = ['鸡蛋%s'%i for i in range(10)]  # 列表推导式
print(li)

g = (i for i in range(10))
print(g)

4.yield from 用法

def gen1():
    for c in 'AB':
        yield c
    for i in range(3):
        yield i

print(list(gen1()))

def gen2():
    yield from 'AB'
    yield from range(3)

print(list(gen2()))

5.各种推导式

# 30以内能被3整除的数 列表推导式
'''
g = (i for i in range(30) if i % 3 == 0)
for i in g:
    print(i)
print([i for i in range(30) if i % 3 == 0])
'''
# 嵌套列表中 名字含有两个e的名字,,,str.count
'''
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
li = [name for i in names for name in i if name.count('e') == 2]
print(li)
'''
# 字典推导式 1.对调key 和 value
'''
mcase = {'a': 10, 'b': 34}
mcase_frequency = {mcase[k]: k for k in mcase.keys()}
print(mcase_frequency)
'''
# 2.合并大小写对应的value值,将k统一成小写
'''
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_1 = {i.lower() : mcase.get(i.upper(),0)+ mcase.get(i.lower(),0) for i in mcase}
print(mcase_1)
'''
# 集合推导式
'''
squared = {x**2 for x in [1, -1, 2]}
print(squared)
'''

6.练习

# 例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
li = ['asd', 'asdd', 'qwe23','a','as','asd']
li1 = [i.upper() for i in li if len(i)>= 3]
print(li1)
# 例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
li = [(x,y) for x in range(0,6,2) for y in range(1,6,2)]
print(li)
# 例3:  求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
M = [[1,2,3],[4,5,6],[7,8,9]]
li = [row[2] for row in M]
print(li)

 

posted @ 2019-03-28 11:06  王二被占用  阅读(139)  评论(0)    收藏  举报