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

相关文章
|
2天前
|
数据库 Python
Python学习的自我理解和想法(18)
这是我在学习Python第18天的总结,内容基于B站千锋教育课程,主要涉及面向对象编程的核心概念。包括:`self`关键字的作用、魔术方法的特点与使用(如构造函数`__init__`和析构函数`__del__`)、类属性与对象属性的区别及修改方式。通过学习,我初步理解了如何利用这些机制实现更灵活的程序设计,但深知目前对Python的理解仍较浅显,欢迎指正交流!
|
4天前
|
数据采集 机器学习/深度学习 自然语言处理
Python学习的自我理解和想法(16)
这是我在B站千锋教育课程中学Python的第16天总结,主要学习了`datetime`和`time`模块的常用功能,包括创建日期、时间,获取当前时间及延迟操作等。同时简要介绍了多个方向的补充库,如网络爬虫、数据分析、机器学习等,并讲解了自定义模块的编写与调用方法。因开学时间有限,内容精简,希望对大家有所帮助!如有不足,欢迎指正。
|
2天前
|
Python
Python学习的自我理解和想法(19)
这是一篇关于Python面向对象学习的总结,基于B站千锋教育课程内容编写。主要涵盖三大特性:封装、继承与多态。详细讲解了继承(包括构造函数继承、多继承)及类方法与静态方法的定义、调用及区别。尽管开学后时间有限,但作者仍对所学内容进行了系统梳理,并分享了自己的理解,欢迎指正交流。
|
2天前
|
设计模式 数据库 Python
Python学习的自我理解和想法(20)
这是我在B站千锋教育课程中学习Python第20天的总结,主要涉及面向对象编程的核心概念。内容包括:私有属性与私有方法的定义、语法及调用方式;多态的含义与实现,强调父类引用指向子类对象的特点;单例设计模式的定义、应用场景及实现步骤。通过学习,我掌握了如何在类中保护数据(私有化)、实现灵活的方法重写(多态)以及确保单一实例(单例模式)。由于开学时间有限,内容简明扼要,如有不足之处,欢迎指正!
|
3天前
|
人工智能 索引 Python
[oeasy]python091_列表_索引_index_中括号_索引函数
本文介绍了Python中列表与字符串的索引及index函数用法。通过range生成列表,使用索引[]访问和修改列表元素,index函数查找元素位置。字符串支持索引访问但不可直接修改。还探讨了16进制数在Python中的表示方法,以及日期、月份等特殊字符的Unicode范围。最后总结了列表与字符串操作的区别,并预告后续内容,提供蓝桥云课、GitHub和Gitee链接供进一步学习。
40 20
|
2天前
|
定位技术 Python Windows
Python学习的自我理解和想法(21)
这是一篇关于Python文件操作的学习总结,基于B站千锋教育课程内容整理而成。文章详细介绍了文件操作的基础知识,包括参数(路径、模式、编码)、注意事项(编码一致性、文件关闭)以及具体操作(创建、读取、写入文件)。同时,深入解析了路径的概念,区分绝对路径与相对路径,并通过示例演示两者在实际应用中的差异。此外,还强调了不同模式(如&quot;w&quot;覆盖写入和&quot;a&quot;追加写入)对文件内容的影响。整体内容逻辑清晰,适合初学者掌握Python文件操作的核心技巧。
|
2天前
|
Python
Python学习的自我理解和想法(17)
这是我在学习Python第17天的心得总结,基于B站千锋教育课程。今天主要学习了面向对象设计,包括其优缺点、基本概念(类与对象)、定义类、创建对象及调用方法等内容。面向对象编程虽增加了复杂性,但具备可重用性、可维护性、可扩展性和可理解性等优势。文中结合实例阐述了类与对象的关系,并分享了个人理解。因开学时间有限,内容简略,不足之处敬请指正,感谢阅读!
|
3天前
|
开发框架 Java .NET
Python中main函数:代码结构的基石
在Python中,`main`函数是程序结构化和模块化的重要组成部分。它实现了脚本执行与模块导入的分离,避免全局作用域污染并提升代码复用性。其核心作用包括:标准化程序入口、保障模块复用及支持测试驱动开发(TDD)。根据项目复杂度,`main`函数有基础版、函数封装版、参数解析版和类封装版四种典型写法。 与其他语言相比,Python的`main`机制更灵活,支持同一文件作为脚本运行或模块导入。进阶技巧涵盖多文件项目管理、命令行参数处理、环境变量配置及日志集成等。此外,还需注意常见错误如全局变量污染和循环导入,并通过延迟加载、多进程支持和类型提示优化性能。
21 0
|
4天前
|
Python
Python学习的自我理解和想法(15)
这是作者学习Python第15天的总结,基于B站千锋教育课程内容。文章主要介绍了`OS模块`和`random模块`的常用功能。`OS模块`涵盖文件与文件夹的操作,如获取当前目录、创建/删除文件夹、重命名、判断文件是否存在等;`random模块`则包含生成随机数及从列表中随机抽取数据的功能。因开学时间有限,内容精简为每天一到两个模块的学习笔记,附带作者的理解与语法示例,欢迎指正交流。
|
6月前
|
数据可视化 IDE 开发工具
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
541 13

热门文章

最新文章

下一篇
oss创建bucket