Python学习进阶教程(5)—内置函数(之五)

(本号正在连续推出以Python官网文档为主线的完整的系统的学习Python的系列文章和视频,感兴趣的朋友们欢迎搜索关注。本文及后续文章如无特别声明均以Windows平台作为演示平台,Python版本为:3.8.1)


注意:开始学习“Python学习进阶教程”系列内容前须已经学习过“Python学习入门教程”系列内容】


class object

返回一个没有特征的新对象。object是所有类的基础。它具有对所有Python类实例都通用的方法。这个函数不接受任何参数。

注意:对象没有__dict__,所以你不能给对象类的一个实例分配任意的属性。


oct(x)

将整数转换为前缀为“0o”的八进制字符串。结果是一个有效的Python表达式。如果x不是Python的int对象,它必须定义一个返回整数的__index__()方法。例如:

<code>>>> oct(8)
'0o10'
>>> oct(-56)
'-0o70'/<code>

如果要将整数转换为带前缀“0o”或不带前缀的八进制字符串,可以使用以下任何一种方法。

<code>>>> '%#o' % 10, '%o' % 10
('0o12', '12')
>>> format(10, '#o'), format(10, 'o')
('0o12', '12')
>>> f'{10:#o}', f'{10:o}'
('0o12', '12')/<code>

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打开file并返回一个对应的file对象。如果文件无法打开,则会引发OSError。

file是一个类似于路径的对象,它提供要打开的文件的路径名(绝对路径名或相对于当前工作目录的路径名)或文件描述符(为整数)。(如果给出了一个文件描述符,那么它在返回的I/O对象关闭时关闭,除非将closefd设置为False。)

mode是一个可选的字符串,它指定打开文件的模式。默认为“r”,是在文本模式下打开阅读。其他常见的值有:“w”表示写入(如果文件已经存在,则将其截断)、“x”表示独占创建,“a”表示附加(在某些Unix系统中,这意味着所有的写入都附加到文件的末尾,而不管当前的查找位置)。在文本模式中,如果没有指定编码,则使用的编码依赖于平台。调用local .getpreferredencoding(False)可获取当前的语言环境编码。(读取和写入原始字节使用二进制模式,不指定编码。)可用的模式有:

Python学习进阶教程(5)—内置函数(之五)

默认模式是“r”(打开用于读取文本,是“rt”的同义词)。模式“w+”和“w+b”打开并截断文件。模式'r+'和'r+b'打开文件,没有截断。

Python区分了二进制和文本I/O。以二进制模式打开的文件(包括mode参数中的'b')将内容作为字节对象返回,而不进行任何解码。在文本模式下(默认情况下,或者在mode参数中包含't'时),文件的内容作为str返回,这些字节首先使用与平台相关的编码进行解码,如果给定,则使用指定的编码。

有一个额外的模式允许使用字符'U',它不再有任何作用,已不推荐了。该模式以前在文本模式中用来启用通用换行,这已成为Python 3.0中的默认行为。

注意:Python不依赖于底层操作系统的文本文件概念;所有的处理都是由Python本身完成的,因此是与平台无关的。

buffering是一个可选的整数,用于设置缓冲策略。传递0给buffering将关闭缓冲(仅允许在二进制模式下),传递1将选择行缓冲(仅可在文本模式下使用),传递> 1的整数表示固定大小的块缓冲区的大小(以字节为单位)。当没有给出缓冲参数时,默认的缓冲策略如下:

  • 二进制文件以固定大小的块缓冲;缓冲区的大小是通过尝试确定底层设备的“块大小”以及io.DEFAULT_BUFFER_SIZE来选择的。在许多系统上,缓冲区通常是4096或8192字节长。
  • “交互式”文本文件(isatty()返回True的文件)使用行缓冲。其他文本文件对二进制文件使用上述策略。

encoding是用于指定解码或编码文件的编码名称。这只在文本模式下使用。默认编码是平台相关的(由local .getpreferredencoding()返回),可以使用Python支持的任何文本编码。有关受支持的编码的列表,请参阅codecs模块。

errors是一个可选的字符串,它指定如何处理编码和解码错误。该参数不能用在二进制模式中。可以使用各种标准的错误处理程序,以及任何已注册到codecs.register_error()的错误处理名称。标准名称包括:

  • ‘strict’如果有编码错误,则抛出ValueError异常。与默认值None具有相同的效果。
  • ‘ignore’忽略错误。注意,忽略编码错误会导致数据丢失。
  • ‘repalce’导致替换标记(如“?”)被插入到有格式错误数据的地方。
  • ‘surrogateescape’将把任何不正确字节表示为Unicode私有使用区域中从U+DC80到U+DCFF的代码点。然后,当使用surrogateescape错误处理程序时在写入数据时,这些私有代码点将被转换回字节。这对于处理未知编码的文件很有用。
  • ‘xmlcharrefreplace’仅在写入文件时受支持。不受编码支持的字符将被替换为适当的XML字符引用nnn;。
  • ‘backslashreplace’用Python的反斜杠转义序列替换了格式错误的数据。
  • ‘namereplace’(只在写的时候支持)将不支持的字符替换为\\N{…}转义序列。

newline控制通用换行模式的工作方式(它只适用于文本模式)。可以是None,'', '\\n', '\\r', '\\r\\n'。其工作原理如下:

•当从流中读取输入时,如果newline为None时,则启用通用换行模式。输入中的行可以以'\\n'、'\\r'或'\\r\\n'结尾,这些行在返回给调用者之前被转换成'\\n'。如果newline是“,则启用通用换行模式,但将向调用者返回未翻译的行结束符。如果newline是任何其他合法的值,则输入行仅由给定的字符串结束,并且此行结束符将不变地返回给调用者。

•当将输出写入流时,如果换行符为None,则将任何'\\n'字符转换为系统默认的行分隔符os.linesep。如果换行符是“”或“\\n”,则不进行转换。如果换行符是任何其他合法的值,那么写入的任何'\\n'字符都将被翻译成此给定的字符串。

如果closefd为False,并且给file指定了一个文件描述符而不是文件名,那么在关闭文件时,底层文件描述符将保持打开状态。如果一个文件名被给定,closefd必须为真(默认值),否则将引发错误。

可以通过传递一个可调用的opener来使用自定义的文件打开器。然后,通过使用(file, flags) 调用opener获得file对象的底层文件描述符。opener必须返回一个打开的文件描述符。将os.open作为opener的结果类似于传递None。

新创建的文件是不可继承的。

下面的示例使用os.open()函数的dir_fd参数来打开相对于给定目录的文件:

<code>>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
...     return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
...     print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd)  # don't leak a file descriptor/<code>

open()函数返回的file对象的类型取决于模式。当open()用于以文本模式('w'、'r'、'wt'、'rt'等)打开文件时,它返回io的一个TextIOBase子类 (特别的是io.TextIOWrapper)。当使用缓冲区以二进制模式打开文件时,返回的类是io.BufferedIOBase的一个子类,确切的类是不同的:在read二进制模式下,它返回一个io.BufferedReader;在写入二进制和附加二进制模式中,它返回一个io.BufferedWriter。在读/写模式下,它返回一个io.BufferedRandom。当缓冲被禁用时,返回原始流io.RawIOBase的子类, io.FileIO 。

该调用会引发以参数文件、模式和标志为参数的审计事件open。

ord(c)

给定一个表示一个Unicode字符的字符串,返回一个表示该字符的Unicode编码点的整数。例如,ord('a')返回整数97,ord('€')(欧元符号)返回8364。这是chr()的逆操作。

pow(base, exp[, mod])

返回base的exp次幂;如果mod存在,返回base的exp次幂再模mod(计算效率要好于pow(base, exp) % mod))。双参数形式pow(base, exp)等价于使用power操作符:base**exp。

参数必须具有数值类型。对于混合操作数类型,适用于二元算术运算符的强制规则。对于int操作数,除非第二个参数是负的,否则结果的类型与操作数相同(在强制之后);在这种情况下,所有参数都转换为float,并传递一个float结果。例如,10**2返回100,但是10**-2返回0.01。

对于整型操作数base和exp,如果mod存在,mod也必须是整数类型,mod必须非零。如果mod是存在的,exp是负的,那么base与mod必须互质的。在这种情况下,返回pow(inv_base, -exp, mod),其中inv_base是对base模mod的逆。

下面是一个计算38模97的逆的例子:

<code>>>> pow(38, -1, mod=97)
23
>>> 23 * 38 % 97 == 1
True
print(*objects,sep='', end='\\n',file=sys.stdout,flush=False)/<code>

将object打印到文本流file中,以sep分隔,后跟end。sep、end、file和flush(如果存在)必须作为关键字参数给出。

所有非关键字参数都被转换成像str()的字符串,并写入到流中,以sep分隔,后跟end。sep和end都必须是字符串;它们也可以是None,这将使用默认值。如果没有object,print()将直接写入end。

file参数必须是一个有写(字符串)方法的对象;如果它不存在,则使用sys.stdout。由于打印的参数被转换为文本字符串,所以print()不能与二进制模式文件对象一起使用,此时应使用file.write(…)代替。

是否缓冲输出通常由文件决定,但是如果flush关键字参数为真,则强制刷新流。

class property(fget=None, fset=None, fdel=None, doc=None)

返回一个属性。

fget是一个获取属性值的函数。fset是一个用于设置属性值的函数。fdel是一个用于删除属性的函数。doc为属性创建一个docstring。

一个典型的用法是定义一个托管属性x:

<code>class C:
    def __init__(self):
        self._x = None
 
    def getx(self):

        return self._x
 
    def setx(self, value):
        self._x = value
 
    def delx(self):
        del self._x
 
    x = property(getx, setx, delx, "I'm the 'x' property.")/<code>

如果c是C的一个实例,则c.x将调用getter, c.x = value将调用setter, del c.x将调用deleter。

如果给定doc,doc将是属性的docstring,否则,该属性将复制fget的docstring(如果存在的话)。这使得使用property()作为装饰器轻松创建只读属性成为可能:

<code>class Parrot:
    def __init__(self):
        self._voltage = 100000
 
    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage/<code>

@property装饰器将voltage()方法转换为具有相同名称的只读属性的“getter”,并将voltage的docstring设置为“Get the current voltage”。

属性对象具有可作为修饰符使用的getter、setter和deleter方法,这些修饰符创建属性的副本,并将相应的访问器函数设置为修饰后的函数。这可以用一个例子来解释:

<code>class C:
    def __init__(self):
        self._x = None
 
    @property
    def x(self):
        """I'm the 'x' property."""

        return self._x
 
    @x.setter
    def x(self, value):
        self._x = value
 
    @x.deleter
    def x(self):
        del self._x/<code>

这段代码与第一个示例完全相同。确保为附加函数提供与原始属性相同的名称(本例中为x)。

返回的属性对象还具有与构造函数参数对应的属性fget、fset和fdel。

class range(stop)

class range(start, stop[, step])

range实际上是一个不可变的序列类型,而不是一个函数。range构造函数的参数必须是整数(内置的int或任何实现了__index__()特殊方法的对象)。如果省略了step参数,它的默认值是1。如果省略了start参数,它的默认值是0。如果step设为零,则引发ValueError。

对于正向step,范围r的内容由公式r[i] = start +step*i(其中i >= 0, r[i] < stop)决定。

对于一个负的step,范围的内容仍然由公式r[i] = start + step*i决定,但是约束条件是i >= 0和r[i] > stop。

如果r[0]不满足值约束,则范围对象将为空。range支持负索引,但是它们被解释为从序列的末尾开始索引,序列的末尾由正索引决定。

虽然允许range包含值大于sys.maxsize的值,但是某些特性(比如len())可能会导致溢出错误。

repr(object)

返回一个包含对象的可打印表示形式的字符串。对于许多类型,这个函数试图返回一个字符串,将此字符串传递给eval()将返回一个对象。否则返回的字符串是用括号括起来的类型对象的名称加上额外的信息通常包括对象的名称和地址。类可以通过定义一个__repr__()方法来控制这个函数为它的实例返回什么。

reversed(seq)

返回一个反向迭代器。seq必须是一个具有__reversed__()方法的对象,或者支持序列协议(具有从0开始的整型参数的__len__()方法和__getitem__()方法)的对象。

round(number[, ndigits])

返回小数点后四舍五入为ndigit精度的数字。如果ndigit被省略或为None,它将返回其输入的最接近的整数。

对于支持round()的内置类型,将值四舍五入为最接近的10的- ndigit次方的倍数;如果与两个倍数接近程度相同,则向偶数进行舍入(例如,round(0.5)和round(-0.5)都是0,round(1.5)是2)。任何整数对于ndigit(正数、零或负数)都是有效的。如果省略了ndigit或没有,则返回值为整数。否则返回值的类型与number相同。

对于一般的Python对象号,将其委托给number.__ round__。

注意:round()对于浮点数的行为可能令人意外:例如,round(2.675, 2)给出的是2.67,而不是预期的2.68。这不是一个错误:它是一个事实的结果,即大多数小数部分不能被准确地表示为浮点数。

【结束】

篇尾寄语:万丈高楼平地起,是否具有扎实的基础决定一个人能否走远以及能走多远。Python的学习也是同样的道理!


分享到:


相關文章: