面向对象的快捷方式
本章详细讨论Python中的各种内置函数、文件I/O操作和重载概念。
Python 内置函数
Python 解释器有许多称为内置函数的函数,可以随时使用。在最新版本中,Python 包含 68 个内置函数,如下表所示 -
内置功能 | ||||
---|---|---|---|---|
绝对值() | 字典() | 帮助() | 分钟() | 设置属性() |
全部() | 目录() | 十六进制() | 下一个() | 片() |
任何() | divmod() | ID() | 目的() | 排序() |
ASCII() | 枚举() | 输入() | 十月() | 静态方法() |
垃圾桶() | 评估() | 整数() | 打开() | 字符串() |
布尔() | 执行() | isinstance() | 订单() | 和() |
字节数组() | 筛选() | 是子类() | 战俘() | 极好的() |
字节() | 漂浮() | 迭代器() | 打印() | 元组() |
可调用() | 格式() | 长度() | 财产() | 类型() |
chr() | 冻结集() | 列表() | 范围() | 变量() |
类方法() | 获取属性() | 当地人() | 代表() | 压缩() |
编译() | 全局变量() | 地图() | 反转() | __进口__() |
复杂的() | 哈萨特() | 最大限度() | 圆形的() | |
德拉特() | 散列() | 内存视图() | 放() |
本节简要讨论一些重要的功能 -
len() 函数
len() 函数获取字符串、列表或集合的长度。它返回对象的长度或项目数,其中对象可以是字符串、列表或集合。
>>> len(['hello', 9 , 45.0, 24]) 4
len() 函数内部的工作方式类似于list.__len__()或tuple.__len__()。因此,请注意 len() 仅适用于具有 __ len__()方法的对象。
>>> set1 {1, 2, 3, 4} >>> set1.__len__() 4
然而,在实践中,我们更喜欢len()而不是__len__()函数,因为以下原因 -
它更有效率。并且没有必要编写特定的方法来拒绝对特殊方法(例如 __len__ )的访问。
易于维护。
它支持向后兼容性。
反转(顺序)
它返回反向迭代器。seq 必须是具有 __reversed__() 方法或支持序列协议(__len__() 方法和 __getitem__() 方法)的对象。当我们想要从后到前循环项目时,它通常用在for循环中。
>>> normal_list = [2, 4, 5, 7, 9] >>> >>> class CustomSequence(): def __len__(self): return 5 def __getitem__(self,index): return "x{0}".format(index) >>> class funkyback(): def __reversed__(self): return 'backwards!' >>> for seq in normal_list, CustomSequence(), funkyback(): print('\n{}: '.format(seq.__class__.__name__), end="") for item in reversed(seq): print(item, end=", ")
最后的 for 循环打印正常列表的反向列表以及两个自定义序列的实例。输出显示,reverse()适用于所有三个,但当我们定义__reversed__时,结果却截然不同。
输出
执行上面给出的代码时,您可以观察到以下输出 -
list: 9, 7, 5, 4, 2, CustomSequence: x4, x3, x2, x1, x0, funkyback: b, a, c, k, w, a, r, d, s, !,
枚举
enumerate ()方法向可迭代对象添加一个计数器并返回枚举对象。
enumerate () 的语法是 -
enumerate(iterable, start = 0)
这里第二个参数start是可选的,默认情况下索引从零 (0) 开始。
>>> # Enumerate >>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor'] >>> enumerate(names) <enumerate object at 0x031D9F80> >>> list(enumerate(names)) [(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')] >>>
因此enumerate()返回一个迭代器,该迭代器生成一个元组,该元组保留所传递序列中元素的计数。由于返回值是一个迭代器,直接访问它并没有多大用处。enumerate() 的一个更好的方法是在 for 循环中保持计数。
>>> for i, n in enumerate(names): print('Names number: ' + str(i)) print(n) Names number: 0 Rajesh Names number: 1 Rahul Names number: 2 Aarav Names number: 3 Sahil Names number: 4 Trevor
标准库中还有许多其他函数,这里是一些更广泛使用的函数的另一个列表 -
hasattr、getattr、setattr和delattr,它们允许通过字符串名称来操作对象的属性。
all和any,接受可迭代对象,如果所有或任何项目评估为 true,则返回True 。
nzip,它接受两个或多个序列并返回一个新的元组序列,其中每个元组包含每个序列的单个值。
文件输入/输出
文件的概念与术语“面向对象编程”相关。Python 封装了操作系统提供的抽象接口,使我们能够使用文件对象。
open ()内置函数用于打开文件并返回文件对象。它是最常用的带有两个参数的函数 -
open(filename, mode)
open() 函数调用两个参数,第一个是文件名,第二个是模式。这里的模式可以是'r'表示只读模式,'w'表示只写(同名的现有文件将被删除),'a'打开文件进行追加,写入文件的任何数据都会自动添加到最后。'r+' 打开文件以进行读取和写入。默认模式为只读。
在 Windows 上,模式后附加“b”将以二进制模式打开文件,因此还有“rb”、“wb”和“r+b”等模式。
>>> text = 'This is the first line' >>> file = open('datawork','w') >>> file.write(text) 22 >>> file.close()
在某些情况下,我们只想追加到现有文件而不是覆盖它,因为我们可以提供值“a”作为模式参数,以追加到文件末尾,而不是完全覆盖现有文件内容。
>>> f = open('datawork','a') >>> text1 = ' This is second line' >>> f.write(text1) 20 >>> f.close()
一旦打开文件进行读取,我们就可以调用 read、readline 或 readlines 方法来获取文件的内容。read 方法将文件的全部内容作为 str 或 bytes 对象返回,具体取决于第二个参数是否为“b”。
为了提高可读性,并避免一次性读取大文件,通常最好直接在文件对象上使用 for 循环。对于文本文件,它将读取每一行,一次一行,我们可以在循环体内处理它。然而,对于二进制文件,最好使用 read() 方法读取固定大小的数据块,并传递要读取的最大字节数的参数。
>>> f = open('fileone','r+') >>> f.readline() 'This is the first line. \n' >>> f.readline() 'This is the second line. \n'
写入文件,通过文件对象的 write 方法将字符串(二进制数据的字节)对象写入文件。writelines 方法接受字符串序列并将每个迭代值写入文件。writelines 方法不会在序列中的每个项目后附加新行。
最后,当我们完成读取或写入文件时,应该调用 close() 方法,以确保所有缓冲的写入都写入磁盘,文件已被正确清理,并且与文件相关的所有资源都被释放回操作系统。调用 close() 方法是更好的方法,但从技术上讲,当脚本存在时,这会自动发生。
方法重载的替代方案
方法重载是指拥有多个具有相同名称的方法,这些方法接受不同的参数集。
给定一个方法或函数,我们可以自己指定参数的数量。根据函数定义,可以使用零个、一个、两个或多个参数来调用它。
class Human: def sayHello(self, name = None): if name is not None: print('Hello ' + name) else: print('Hello ') #Create Instance obj = Human() #Call the method, else part will be executed obj.sayHello() #Call the method with a parameter, if part will be executed obj.sayHello('Rahul')
输出
Hello Hello Rahul
默认参数
函数也是对象
可调用对象是可以接受一些参数并且可能返回一个对象的对象。函数是 Python 中最简单的可调用对象,但也有其他对象,例如类或某些类实例。
Python 中的每个函数都是一个对象。对象可以包含方法或函数,但对象不一定是函数。
def my_func(): print('My function was called') my_func.description = 'A silly function' def second_func(): print('Second function was called') second_func.description = 'One more sillier function' def another_func(func): print("The description:", end=" ") print(func.description) print('The name: ', end=' ') print(func.__name__) print('The class:', end=' ') print(func.__class__) print("Now I'll call the function passed in") func() another_func(my_func) another_func(second_func)
在上面的代码中,我们能够将两个不同的函数作为参数传递给第三个函数,并为每个函数获得不同的输出 -
The description: A silly function The name: my_func The class:Now I'll call the function passed in My function was called The description: One more sillier function The name: second_func The class: Now I'll call the function passed in Second function was called
可调用对象
正如函数是可以设置属性的对象一样,可以创建一个可以像函数一样被调用的对象。
在 Python 中,任何具有 __call__() 方法的对象都可以使用函数调用语法进行调用。