Python 编程骚操作连载(二)- 类与对象

简介: Python 编程骚操作连载(二)- 类与对象

一、可迭代对象与迭代器对象

在遍历一个非常大的文件时如果一次性读取全部内容然后在进行输出可能会导致内存不够的想象,正确的方式应该是读取一条输出一条,这样可以极大的节约内容空间,那么如何实现对象的迭代?

首先来看看 可迭代迭代器 的区别:

  • 可迭代可迭代对象,指的是可以通过 for 循环进行遍历的对象,常见的 list, string, tuple, set, dict 等都是可迭代对象,数字不是可迭代对象。如果一个对象实现了__iter__方法,这个对象就是可迭代对象。
  • 迭代器迭代器对象 指实现了__iter__方法和__next__方法的对象,迭代器 对象可以通过调用 iter 函数且入参为可迭代对象 生成。

可迭代对象不一定是迭代器,迭代器一定是可迭代对象,可迭代对象只需实现一个 __iter__ 方法,而迭代器需要实现 __iter__ 方法和 __next__ 方法。

# 可迭代对象
list_data = ['peter', 'tom', 'clint', 'stark']
string_data = 'Stark'
for item in list_data:
    print(item)
for str in string_data:
    print(str)
复制代码

执行上述代码,输出结果如下:

peter
tom
clint
stark
S
t
a
r
k
复制代码

Python 中 liststring 等都可以使用 for 循环进行遍历,都是可迭代对象

list_data = ['peter', 'tom', 'clint', 'stark']
string_data = 'Stark Industry'
print(iter(list_data))
print(type(iter(list_data)))
print(iter(string_data))
print(type(iter(string_data)))
print(iter(1))
复制代码

执行上述代码,输入结果如下:

<list_iterator object at 0x102692d90>
<class 'list_iterator'>
<str_iterator object at 0x102692d90>
<class 'str_iterator'>
<font color="orange"> Traceback (most recent call last):
"/python-tricks/ex1.py", line 17, in <module>
    print(iter(1))
TypeError: 'int' object is not iterable
复制代码

iter 函数传入可迭代对象返回的是一个迭代器对象 list_iterator object at 0x102692d90, 对象的类型是 class 'list_iterator',iter 函数传入一个数字对象是无法返回迭代器的,应为int 类型数字是不可迭代的。

list_data = ['peter', 'tom', 'clint', 'stark']
string_data = 'Stark Industry'
print(dir(list_data))
print(list_data.__iter__())
print(iter(list_data))
复制代码

执行上述代码,输出内容如下:

3ab0df36bb164cdfa8d2a7c2ec4415f3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

list 可迭代对象实现了 __iter__  方法,并且根据输出结果来看可迭代对象调用__iter__ 方法的返回值和 iter 函数传入一个可迭代对象的返回值是相同的。

iter 函数调用时会首先找到 __iter__ 方法,如果该方法没有找到,存在在 __getitem__方法也是可以的,字符串在 Python2 中只包含了 __getitem__ 方法,在 Python3 中两个方法都包含。

迭代器可以调用 __next__ 方法进行迭代输出元素,也可以通过 next 方法传入一个迭代器对象来进行迭代。

list_data = ['peter', 'tom', 'clint', 'stark']
list_iterator = iter(list_data)
print(dir(list_iterator))
print(next(list_iterator))
print(next(list_iterator))
print(next(list_iterator))
print(next(list_iterator))
print(next(list_iterator))
复制代码

执行上述代码,输出结果如下:

7712c556938b4bb983f4e44bba3bb78b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

列表中只有四个元素,当迭代到第 5 个元素时列表不存在,所以抛出异常。


相关文章
|
13天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
13天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1天前
|
Python
Python 一步一步教你用pyglet制作可播放音乐的扬声器类
Python 一步一步教你用pyglet制作可播放音乐的扬声器类
12 0
|
6天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
6天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
7天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
20 0
|
8天前
|
Python
Python金融应用编程:衍生品定价和套期保值的随机过程
Python金融应用编程:衍生品定价和套期保值的随机过程
22 0
|
8天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
50 0
|
8天前
|
索引 Python
python 格式化、set类型和class类基础知识练习(上)
python 格式化、set类型和class类基础知识练习
32 0
|
9天前
|
机器学习/深度学习 算法 定位技术
python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题
python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题
23 1

热门文章

最新文章