Python学习:内建属性、内建函数的教程

简介: 本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。

1. 内建属性

python3中查看类的内建属性和方法:

python

代码解读

复制代码

 >>> class Person:
 ...     pass
 ...
 >>> dir(Person)
 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的 __init__方法。

常用内建属性 说明 触发方式
__init__ 构造初始化函数 创建实例后,赋值时使用,在__new__
__new__ 生成实例所需属性 创建实例时
__class__ 实例所在的类 实例.__class__
__str__ 实例字符串表示(可读性) print(类实例),如没实现则使用repr结果
__repr__ 实例字符串表示(准确性) print(repr(类实例))
__del__ 析构 del 实例
__dict__ 实例自定义属性 vars(实例.__dict__)
__doc__ 类文档,子类不继承 help(类或实例)
__getattribute__ 属性访问拦截器 访问实例属性时
__bases__ 类的所有父类构成元素 类名.__bases__

示例:__getattribute__

python

代码解读

复制代码

class Lesson(object):
    def __init__(self,subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    # 属性访问时拦截器:当访问属性或方法名时,均会调用此方法
    # 作用:扩展功能,比如记录日志、过滤拦截等
    def __getattribute__(self,obj):
        if obj == 'subject1':
            print('log subject1')
            return 'redirect python'
        else:   # 测试时注释掉这2行,将找不到其他属性,均返回None,但不会报错
            return object.__getattribute__(self,obj)

    def show(self):
        print('this is Itcast')

s = Lesson("python")
print(s.subject1)
print(s.subject2)

运行结果:

python

代码解读

复制代码

log subject1
redirect python
None

__getattribute__ 的坑

python

代码解读

复制代码

class Person(object):
    def __getattribute__(self,obj):
        print("---test---")
        if obj.startswith("a"):
            return "hahha"
        else:
            return self.test  # 坑在此:self.xxx

    def test(self):
        print("heihei")


t = Person()
t.a  # 返回hahha
t.b  # 会让程序死掉

原因:

程序执行else里面的代码时,即return self.test,因为return需要把self.test的值返回,那么首先要获取self.test的值(test方法名所对应的函数体的地址),因为self此时就是t这个对象,所以self.test就是t.test,此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产生了递归调用,由于这个递归过程中没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序崩溃。

因此注意,以后不要在__getattribute__方法中调用 self.xxx 。

2. 内建函数

启动python解释器,输入dir(__builtins__),,可以看到很多python解释器启动后默认加载的属性和函数,这些函数称之为内建函数(Build-in Function),这些函数因为在编程时使用较多,cpython解释器用c语言实现了这些函数,启动解释器时默认加载。

这些函数数量众多,不宜记忆,开发时不是都用到的,待用到时再使用 help(function) 查看如何使用,或结合百度查询即可,在这里介绍些常用的内建函数。

range函数

python

代码解读

复制代码

range(stop) -> list of integers
range(start, stop[, step]) -> list of integers
  • start:计数从start开始。默认是从0开始。例如:range(5) 等价于 range(0, 5)
  • stop:到stop结束,但不包括stop.例如:range(0, 5) 是 [0, 1, 2, 3, 4]
  • step:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

python2中range返回列表,python3中range返回一个迭代器。如果想得到列表,可通过list函数:

python

代码解读

复制代码

list(range(5))

map函数

map函数会根据提供的函数,对指定序列做映射。

python

代码解读

复制代码

map(function, sequence[, sequence, ...]) -> list
  • function:是一个函数
  • sequence:是一个或多个序列,取决于function需要几个参数

参数序列中的每一个元素分别调用function函数,返回包含每次function函数返回值的list(python3中返回迭代器)。

示例:

python

代码解读

复制代码

>>> list(map(lambda x: x*x, [1, 2, 3]))  #
[1, 4, 9]
>>> list(map(lambda x,y: x+y, [1,2,3], [4,5,6]))
[5, 7, 9]
>>> def f1(x, y):
...     return (x, y)
...
>>> l1 = [0, 1, 2, 3]
>>> l2 = ["a", "b", "c", "d"]
>>> list(map(f1, l1, l2))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

filter函数

filter函数会对指定序列执行过滤操作。

python

代码解读

复制代码

filter(...)
    filter(function or None, sequence) -> list, tuple, or string

    Return those items of sequence for which function(item) is true.  If
    function is None, return the items that are true.  If sequence is a tuple
    or string, return the same type, else return a list.
  • function:接受一个参数,返回布尔值
  • sequence:序列可以是 str,tuple,list

filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。返回值的类型和参数sequence的类型相同(python3中返回迭代器)。

示例:

python

代码解读

复制代码

>>> a = filter(lambda x: x%2, [0,1,2,3,4])  # 非0的值均为True
>>> a
<filter object at 0x01D18358>
>>> list(a)
[1, 3]
>>>
#Python学习交流群:711312441
>>> filter(None, "she")
<filter object at 0x01D18220>
>>> a = filter(None, "she")
>>> next(a)
's'
>>> next(a)
'h'
>>> next(a)
'e'

reduce函数

reduce函数会对参数序列中元素进行累积。

python

代码解读

复制代码

reduce(...)
    reduce(function, sequence[, initial]) -> value
  • function:该函数有两个参数
  • sequence:序列可以是 str,tuple,list
  • initial:固定初始值

reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。 第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial 作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。 注意function函数不能为None。

在Python3中,reduce函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里用的话要先引入:from functools import reduce

示例:

python

代码解读

复制代码

>>> from functools import reduce
>>> reduce(lambda x, y: x+y, [1,2,3,4])
10
>>> reduce(lambda x, y: x+y, [1,2,3,4], 5)
15
>>> reduce(lambda x, y: x+y, ["a","b","c"], "d")
'dabc'

sorted函数

python

代码解读

复制代码

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

示例:

python

代码解读

复制代码

>>> sorted([1,4,5,9,1,2])
[1, 1, 2, 4, 5, 9]
>>> sorted([1,4,5,9,1,2], reverse=1)
[9, 5, 4, 2, 1, 1]
>>> sorted(["c","d","a","t"])
['a', 'c', 'd', 't']
>>> sorted(["c","d","a","t"], reverse=1)
['t', 'd', 'c', 'a']


转载来源:https://juejin.cn/post/7178035976147566648

相关文章
|
6天前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
103 1
|
6天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
43 1
|
6天前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
60 1
|
6天前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
59 0
|
6天前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
48 0
|
6天前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
50 3
|
12月前
|
存储 算法 API
Python学习五:函数、参数(必选、可选、可变)、变量、lambda表达式、内置函数总结、案例
这篇文章是关于Python函数、参数、变量、lambda表达式、内置函数的详细总结,包含了基础知识点和相关作业练习。
156 0
|
存储 Python Windows
【Python学习篇】Python实验小练习——函数(十)
【Python学习篇】Python实验小练习——函数(十)
97 1
|
存储 Python
【Python学习篇】Python——函数(九)
【Python学习篇】Python——函数(九)
135 1
|
API Python
Python学习日记(二:函数和逻辑操作)
Python中的函数和逻辑操作至关重要。函数包括可变和不可变参数。
117 0

推荐镜像

更多