IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> list_comprehension anditerator_learning and generator_learning -> 正文阅读

[数据结构与算法]list_comprehension anditerator_learning and generator_learning

推导式

list_data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
#显示定义一个列表, 1, 2, 3,

# for i in range(1, 10):
#     print(i)

list_data = list(range(1, 10))
print(list_data)

# 1, 2, 3, 4, 5, 6, 7, 8, 9 这些数的平方
#列表推导式:方便我们去建立列表

list_data = [i * i for i in range(1, 10)]
print(list_data)

"""
[表达式 for 临时变量 in iterable 过滤]
简洁的一条语句的形式去创建列表
"""
list_data = [i * i for i in range(1, 10) if i > 4]
print(list_data)

#practise: 1-10, 去取出 偶数的平方
#practise2: (red, blue, black)
#           (L, M, S)
#去给我列出来,每个颜色对应的尺码
color_tuple = ("red", "blue", "black")
size_tuple = ("L", "M", "S")

clothes_list = [(i, j) for i in color_tuple for j in size_tuple]
clothes_list = [(i, j) for i in size_tuple for j in color_tuple if j == "red"]
print(clothes_list)

# for i in color_tuple:
#     for j in size_tuple:
#         print((i, j))

def my_square(x):
    return x * x

list_data = [my_square(i) for i in range(1, 10)]
print(list_data)


"""
字典推导式:{}
{表达式1:表达式2 for 临时变量 in iterable 过滤}
字典中元素的格式: key:value
"""
#practise: 1-10 ,去取它的平方,1: key=1, value=1
#key=本身,value=平方, 取除掉偶数,只保留奇数
#现在的要求是:保留奇数,但是原先偶数的key不变,值设为-1
#1: 1, 2: 4, 3: 9
#1: 1, 2: -1, 3: 9, 4:-1
#把key:-1 2: 4 => 2: -1
#提示: value1 if condition else value2
flag = 0
data = 1 if flag else 2
print(data)

迭代器

"""
1.Python中什么是迭代器?
    迭代器就是实现了迭代协议的对象

    迭代器是一个可以记住遍历的位置的对象
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
    迭代器是可迭代的对象
    迭代器有两个基本的方法:iter() 和 next()。
    迭代器是实现了__next__()方法
2.什么是迭代协议?
     只要某个类型(类)定义了__iter__()和__next__()方法就表示支持迭代协议。
        __iter__()需要返回一个可迭代对象:
                  只要定义了__iter__()就表示能够通过for/in/map/zip等迭代工具进行对应的迭代
        __next__(): 下一个,说了迭代器从第一个元素开始, 可以记住遍历位置的对象
                    第一个,下一个:第二个,下一个,第三个
3.实现自己的迭代器:
     __iter__: 返回迭代器本身, 返回self
     __next__: 通过访问这个__next__来获取下一个元素
               写的是如何获取下一个元素,以及元素的位置, 终止条件
               抛出StopIteration异常
  我去迭代自己的迭代器的时候(for访问的时候),如何判定循环终止,或者说所有的元素
  被访问完毕?
  for循环如何去判定可迭代对象,迭代到末尾了结束了?
     通过判定可迭代对象的__next__是否抛出StopIteration异常
     for循环可以捕获StopIteration异常的,如果捕获到了,人为迭代结束


"""
data = 1
class MyIterator:
    def __init__(self, value): #9
        self.stop = value
        self.start = 0

    def __iter__(self):
        return self


    def __next__(self):
        #起始是0, 结束9
        if self.start < self.stop: #start < stop
            data = self.start
            self.start += 1        #start+1
            return data
        else:                      #手动去抛出异常
            raise StopIteration #停止迭代的异常
            # print(-1)
# for i in range(10): #0-9 #start, stop, step
#     print(i)
my_iteraotr = MyIterator(10)
for i in my_iteraotr:
    print(i)

# my_iteraotr = MyIterator(10)
print(next(my_iteraotr)) #=> my_iterator.__next__
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
print(next(my_iteraotr))
# print(next(my_iteraotr))
#作业:

# print({1: 2, 2: 3}.keys())
# print(range(10))

生成器

"""
什么是生成器?
   生成器就是一个迭代器
   一边循环一边计算的机制,称为生成器
   使用了 yield 的函数被称为生成器
扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,
即按需一次获取一个数据项。这就是迭代器模式

#生成器: 生成,产生, 器:工具
       产生一个元素的工具? 每次产生一个, 调用它才产生

[1, 2, 3, ... 1000000000000000000000]
列表:一次性获取,
惰性获取:每次获取一个: 节省空间

你需要的时候去获取,不需要的时候不获取

什么叫生成器?
带有yield关键字的函数,叫做生成器函数
执行生成器函数,返回的就是一个生成器

yield关键字: 中文:产生

"""


def test_func(arg1):
    return arg1


data = test_func(1)
print(data, type(data))


# 1, int

def test_func2():
    value = yield "123"
    # print(value)
    yield "456"
    yield "789"


# 带有yield关键字的函数,叫做生成器函数
# 执行生成器函数,返回的就是一个生成器

data = test_func2()
# <generator object test_func2 at 0x0000029D05D6C820> <class 'generator'>
print(data, type(data))
# generator: 生成器, data:生成器的对象,类型:生成器

"""
yield的使用形式:yield expression_list
#什么是迭代器:实现了迭代协议(__next__, __iter__)的对象
#生成器就是一个迭代器: 在它内部实现了__iter__, __next__

#__bool__ => bool(obj) => obj.__bool__()
#__next__ => next(obj) => obj.__next__()
"""

"""
执行生成器函数: 产生了一个生成器
问题是:怎么去用这个生成器?

1.当一个生成器函数被调用的时候,它返回一个迭代器,称为生成器
2.生成器(data)来控制生成器函数(test_func2)的执行
3.当生成器(data)的某一个方法?(__next__和generator.send)被调用的时候,生成器函数开始执行。
  can't send non-None value to a just-started generator
  不能发送一个非空值到刚开始的生成器

4.执行到第一个 yield 表达式,执行被挂起
5.通过调用生成器的某一个方法?(__next__或generator.send),生成器函数继续执行
  其实又回到了3-5这个步骤
6.直到抛出StopIteration就结束了(再也没有找到yield表达式)
"""

# print(next(data)) #next(data) => data.__next__ => data生成器-》 迭代器 -》 __next__
# print(next(data))
# print(next(data))
# print(next(data))

# print(data.send(None)) #调用了send方法,生成器函数开始执行,执行第一个yield "123"挂起
# 给调用者返回了"123" => 123
# print(data.send(666))  #继续调用send方法, 生成器函数继续执行,send:666 => yield "123"
# value = 666, print(value) => 666
# yield "456"挂起
# 返回"456"给调用者
# TypeError: can't send non-None value to a just-started generator

test_data = 2 * 2

# 执行2 * 2
# 执行赋值给 test_data

"""
yield expression_list => expression_list 计算完成后,返回给谁了?
    yield返回给生成器的调用者的值是expression_list => "123"
data = yield expression_list =》 data 是什么的值
    yield expression_list计算完的值是None

通过调用一个方法:__next__
另外一个方法send: 发送的意思,data.send(value) => 发送给谁了

"""

for i in data:
    print(i)

# 生成器推导式:
# 表达式,推导式
# 一条语句产生一个生成器
"""
语法形式:
(表达式 for 临时变量 in iterable 过滤)
"""

gen = (i for i in range(10))
print(gen, type(gen))

print(next(gen))
print(gen.send(123))
print(gen.send(123))
print(next(gen))
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:08:35  更:2021-10-19 12:09:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:24:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码