暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(三)推导式、迭代器与生成器

统计美学 2021-10-06
477

NO.1

推导式 comprehensions

迭代器和生成器对于Python初学者不是很好理解,所以今天在正式讲解它们前,我们先上一碟开胃小菜——推导式,虽说这是开胃小菜,但推导式可以说是python独特的炫技神器了~

# =============================================================================# 打包赋值与连续赋值# =============================================================================x, y, z = list('hohai'), tuple(), range(10)a = b = c = range(10)# =============================================================================# 三元表达式/条件表达式 expr1 if expr2 else expr3# 目的:简化编程,可搭配匿名函数使用# =============================================================================1 if True else 2pow(2, 3) if chr(48) > 'a' else pow(3, 2)list(map(lambda i: pow(i, 2) if not i % 2 and i % 4 else i, range(10)))# =============================================================================# 推导式:列表、字典、集合推导式(comprehension)# 目的:快速创建特定列表、字典和集合,注意不存在字符串和元组推导式# =============================================================================list1 = list()for i in range(10):    if not i % 2 and i % 4:        list1.append(i)print(list1)[pow(i, 2) for i in range(10)] # 列表推导式[i for i in range(10) if not i % 2 and i % 4] # 列表推导式的条件子句{i: i % 4 == 0 for i in range(10) if not i % 2} # 字典推导式{i for i in range(10) if not i % 2 and i % 4} # 集合推导式# =============================================================================# 3、是元组推导式吗?--> 生成器表达式!# =============================================================================genexpr = (pow(i, 2) for i in range(10))type(genexpr)next(genexpr)next(genexpr)next(genexpr)for i in genexpr:    print(i)sum((pow(i, 2) for i in range(10))) # 生成器表达式作为函数参数时可以不加()!!

复制

NO.2

迭代器 iterators

迭代器提供迭代方法的可迭代对象,即能够使用next()函数依次访问其元素,是可迭代的充分不必要条件,即迭代器对象必定是可迭代对象,可迭代对象不一定是迭代器,如:range、set是可迭代的对象,但它们不是迭代器!

迭代器常见类型包括:range_iterator, list_iterator, str_iterator, tuple_iterator, dict_iterator, set_iterator

关于迭代,Python提供了两个BIF:iter(iterable), next(iterator[, default])

  • 对一个容器对象调用iter(iterable)得到对应类型的迭代器

  • 调用迭代函数next()会返回其中的下一个元素,第一次调用则返回第一个元素

  • 当迭代器中没有值可以返回时,返回默认值default,否则抛出StopIteration

# <codecell> 迭代器 iteratortup = tuple('hohai university')iterable = iter(tup)type(iterable) # tuple_iteratornext(iterable) # 当没有元素可以返回的时候抛出StopIteration# while循环是for循环的实现方式# for会先将可迭代对象转换为对应的迭代器,并自动调用next()方法,处理StopIteration异常!for each in range(10):    print(each)iterator = iter(range(10))while True:    try:        each = next(iterator)    except StopIteration:        break    print(each)# 注意,如下两种调用迭代器的方式是不同的hohai = iter('hohai')next(hohai)next(hohai) # 每次执行调用的都是同一个的迭代器对象next(iter('hohai')) # 每次执行都创建了一个新的迭代器,每次都返回其中的第一个元素
复制

NO.3

生成器 generators

从功能上看,生成器是可以逐一生成元素的可迭代对象,从形式上看它是一个含有yield关键字的函数;生成器有效地避免了创建迭代器对象所占用的大量内存空间;可以认为它是对含有yield函数的封装,除了普通函数的基本特性之外,它最大的特点是拥有记忆功能!

# <codecell> 生成器 generator# 定义一个生成器gen(n),用于生成[0, n)中的整数for i in range(10):    print(i)def gen(n):    print('this is a generator!')    i = 0    while i < n:        yield i        i += 1type(gen(10)) # generator# 创建生成器对象并引用gen1 = gen(10)for i in gen1:    print(i)# 注意,生成器属于可变数据类型!# 当一个生成器被使用后(调用了next()函数),其挂起位置已被更新(后移)# 若需要再次使用迭代器,则需要重新创建一个生成器对象并引用!!!gen2 = gen(10)for i in gen2:    print(i)

复制

扫描二维码获取

更多精彩

统计美学


文章转载自统计美学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论