NO.1

推导式 comprehensions

# =============================================================================# 打包赋值与连续赋值# =============================================================================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

迭代器常见类型包括: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)
复制

扫描二维码获取
更多精彩


统计美学