面向对象快捷键



本章详细介绍了Python中的各种内置函数、文件I/O操作和重载概念。

Python内置函数

Python解释器有很多称为内置函数的函数,可以直接使用。在最新版本中,Python包含68个内置函数,如下表所示:

内置函数
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()
delattr() hash() memoryview() set()

本节简要讨论一些重要的函数:

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__。

  • 易于维护。

  • 它支持向后兼容性。

reversed(seq)

它返回反向迭代器。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 循环打印普通列表的反向列表以及两个自定义序列的实例。输出显示 reversed() 对所有三个序列都有效,但是当我们定义 __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() 的语法如下:

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、setattrdelattr,允许通过其字符串名称操作对象的属性。

  • allany,它们接受一个可迭代对象,如果所有项目或任何项目评估结果为真,则返回 True

  • zip,它接受两个或多个序列并返回一个新的元组序列,其中每个元组包含每个序列中的单个值。

文件 I/O

文件的概念与面向对象编程术语相关。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__() 方法的对象都可以使用函数调用语法进行调用。

广告