高级编程
一、可迭代对象
二、推导式
# - 推导式分为 列表推导式、字典推导式、集合推导式等。在这里我们主要说其中一种也是用的最多列表推导式。
# - 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表简单理解就是由一个旧的列表来构建出一个新的列表。
# [表达式 for 变量 in 旧列表]
# [表达式 for 变量 in 旧列表 if 条件]
# 将列表中长度大于4 的名字输出
# 普通方法:
list1 = ['tom', 'niezeyu', 'guoyanru', 'zhangsan', 'lisi']
def fun():
new_list = []
for name in list1:
if len(name) > 4:
new_list.append(name)
return new_list
print(fun()) # ['niezeyu', 'guoyanru', 'zhangsan']
# 用列表推导式:
new_list = [name for name in list1 if len(name) > 5]
new_list1 = [name+'happy new year!' for name in list1 if len(name) > 5]
print(new_list) # ['niezeyu', 'guoyanru', 'zhangsan']
print(new_list1) # ['niezeyuhappy new year!', 'guoyanruhappy new year!', 'zhangsanhappy new year!']
# 练习:求1-100之间能被3整除的数
new_list2 = [i for i in range(1 , 101) if i % 3 ==0]
print(new_list2) # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
# 练习:求1-100之间能被3整除的数,也可以被6整除的数
new_list3 = [i for i in range(1 , 101) if i % 3 ==0 and i % 6 == 0]
print(new_list3) # [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
三、生成器
- 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
- 生成器是可迭代的,也是迭代器
- 列表是可迭代的,但不是迭代器
- 通过iter()函数可以将可迭代的变成一个迭代器
- 方式1:通过推导式的方式创建生成器
# 方式1:通过推导式的方式创建生成器
list0 = [i * 3 for i in range(1, 11)]
print(list) # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
# 如果向一个一个取出怎么办呢?这就用到了我们的生成器
list1 = (i * 3 for i in range(1, 11))
print(list1) # <generator object <genexpr> at 0x000001F57E499200>这表示的是一个生成器的类
print(type(list1)) # <class 'generator'>
# 那么我们怎么调用生成器中的元素呢?
print(list1.__next__()) # 3
print(list1.__next__()) # 6
print(list1.__next__()) # 9
print(next(list1)) # 12 也可以用这种方式显示
# 注意:如果打印的个数超过了生成的元素个数,会报错
- 方式2:通过函数的方式创建,会用到yield
# 方式2:通过函数的方式创建,会用到yield
def fun():
i = 0
while True:
i += 1
# return i
yield i
f = fun()
print(f) # 打印结果为生成器的类<generator object fun at 0x000002071AD092B0>
print(f.__next__()) # 1
print(next(f)) # 2
print(next(f)) # 3
# 注意:return与yield的区别:它们虽然都是想参数返回出去,但是运行完return之后,会将函数内部的代码截断,下次调用这个函数的时候,还是同样的结果,会直接从头开始执行。而yield再调用的是后,会在上一次的基础上,直接继续执行yield上面的代码块。
# 注意:当我们看到yield时,说明这是一个生成器
注意:生成器的特征:一旦将数据取完,那么数据就不存在了
# 生成器的特征:一旦将数据取完,那么数据就不存在了
def fun():
for i in range(10):
yield i
r = fun()
print(r) # <generator object fun at 0x00000159C62D9258>
list1 = [i for i in r]
list2 = [i for i in r]
print(list1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list2) # []
# 为什么list2中取不到数据呢?这是因为在list1中已经将fun函数中的数据取完了,就没又数据可让list2来取了
迭代器
# - 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。
# - 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
# - 生成器是可迭代的,也是迭代器
# - 列表是可迭代的,但不是迭代器
# - 通过iter()函数可以将可迭代的变成一个迭代器
# 可迭代对象是实现了__iter__(),迭代器是实现了__iter__()和__next__()
# __iter__()是返回它自身,__next__()是取下一个元素的
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
iterator = iter(list1)
print(iterator, type(iterator)) # 打印结果为迭代器的类<list_iterator object at 0x0000015E237980B8> <class 'list_iterator'>
list2 = [i for i in iterator]
list3 = [i for i in iterator]
print(list2) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list3) # []
# 同样的可以用next的方法遍历iterator
print(next(iterator)) # 1
print(iterator.__next__()) # 2