干货收藏 | 大佬带你一起走进 Python——类的内部

【干货】建议收藏!!全网最完整的Python操作Excel数据封装函数 Python操作Excel写在前面分析准备认识Excel格式区别库的使用整体思路 写在前面 对比其它编程语言,我们都知道Python最大的优势是代码简单,有丰富的第三方开源库供开发者使用。伴随着近几年数据分析的热度,Python也成为最受欢迎的编程语言之一。而对于数据的读取和存储,对于普通人来讲,除了数据库之外,最常见的就是微软的Excel。 分析准备 认识Excel Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件 阅读详情

 

这篇文章和大家一起聊一聊 Python 3.8 中类和对象背后的一些概念和实现原理,主要尝试解释 Python 类和对象属性的存储,函数和方法,描述器,对象内存占用的优化支持,以及继承与属性查找等相关问题。

让我们从一个简单的例子开始:

class Employee:

outsource = False

def __init__(self, department, name):

self.department = department

self.name = name

@property

def inservice(self):

return self.department is not None

def __repr__(self):

return f"<Employee: {self.department}-{self.name}>"

employee = Employee('IT', 'bobo')

employee 对象是 Employee 类的一个实例,它有两个属性 department 和 name,其值属于该实例。outsource 是类属性,所有者是类,该类的所有实例对象共享此属性值,这跟其他面向对象语言一致。

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号947618024,可领取python学习资料,会节约很多时间,减少很多遇到的难题。

更改类变量会影响到该类的所有实例对象:


>>> e1 = Employee('IT', 'bobo')

>>> e2 = Employee('HR', 'cici')

>>> e1.outsource, e2.outsource

(False, False)

>>> Employee.outsource = True

>>> e1.outsource, e2.outsource

>>> (True, True)

这仅限于从类更改,当我们从实例更改类变量时:

>>> e1 = Employee('IT', 'bobo')

>>> e2 = Employee('HR', 'cici')

>>> e1.outsource, e2.outsource

(False, False)

>>> e1.outsource = True

>>> e1.outsource, e2.outsource

(True, False)

是的,当你试图从实例对象修改类变量时,Python 不会更改该类的类变量值,而是创建一个同名的实例属性,这是非常正确且安全的。在搜索属性值时,实例变量会优先于类变量,这将在继承与属性查找一节中详细解释。

值得特别注意的是,当类变量的类型是可变类型时,你是从实例对象中更改的它们的:


>>> class S:

... L = [1, 2]

...

>>> s1, s2 = S(), S()

>>> s1.L, s2.L

([1, 2], [1, 2])

>>> t1.L.append(3)

>>> t1.L, s2.L

([1, 2, 3], [1, 2, 3])

好的实践方式是应当尽量的避免这样的设计。

属性的存储

本小节我们一起来看看 Python 中的类属性、方法及实例属性是如何关联存储的。

实例属性

在 Python 中,所有实例属性都存储在 __dict__ 字典中,这就是一个常规的 dict,对于实例属性的维护即是从该字典中获取和修改,它对开发者是完全开放的。

>>> e = Employee('IT', 'bobo')

>>> e.__dict__

{'department': 'IT', 'name': 'bobo'}

>>> type(e.__dict__)

dict

>>> e.name is e.__dict__['name']

True

>>> e.__dict__['department'] = 'HR'

>>> e.department

'HR'

 

正因为实例属性是采用字典来存储,所以任何时候我们都可以方便的给对象添加或删除字段:

>>> e.age = 30 # 并没有定义 age 属性

>>> e.age

30

>>> e.__dict__

{'department': 'IT', 'name': 'bobo', 'age': 30}

>>> del e.age

>>> e.__dict__

{'department': 'IT', 'name': 'd'}

我们也可以从字典中实例化一个对象,或者通过保存实例的 __dict__ 来恢复实例。

>>> def new_employee_from(d):

... instance = object.__new__(Employee)

... instance.__dict__.update(d)

... return instance

...

>>> e1 = new_employee_from({'department': 'IT', 'name': 'bobo'})

>>> e1

<Employee: IT-bobo>

>>> state = e1.__dict__.copy()

>>> del e1

>>> e2 = new_employee_from(state)

>>> e2

>>> <Employee: IT-bobo>

因为 __dict__ 的完全开放,所以我们可以向其中添加任何 hashable 的 immutable key,比如数字:

>>> e.__dict__[1] = 1

>>> e.__dict__

{'department': 'IT', 'name': 'bobo', 1: 1}

这些非字符串的字段是我们无法通过实例对象访问的,为了确保不会出现这样的情况,除非必要的情况下,一般最好不要直接对 __dict__ 进行写操作,甚至不要直接操作 __dict__。

所以有一种说法是 Python is a "consenting adults language"。

这种动态的实现使得我们的代码非常灵活,很多时候非常的便利,但这也付出了存储和性能上的开销。所以 Python 也提供了另外一种机制(__slots__)来放弃使用 __dict__,以节约内存,提高性能,详见 __slots__ 一节。

类属性

同样的,类属性也在存储在类的 __dict__ 字典中:


>>> Employee.__dict__

mappingproxy({'__module__': '__main__',

'outsource': True,

'__init__': <function __main__.Employee.__init__(self, department, name)>,

'inservice': <property at 0x108419ea0>,

'__repr__': <function __main__.Employee.__repr__(self)>,

'__str__': <function __main__.Employee.__str__(self)>,

'__dict__': <attribute '__dict__' of 'Employee' objects>,

'__weakref__': <attribute '__weakref__' of 'Employee' objects>,

'__doc__': None}

>>> type(Employee.__dict__)

mappingproxy

与实例字典的『开放』不同,类属性使用的字典是一个 MappingProxyType 对象,它是一个不能 setattr 的字典。这意味着它对开发者是只读的,其目的正是为了保证类属性的键都是字符串,以简化和加快新型类属性的查找和 __mro__ 的搜索逻辑。


>>> Employee.__dict__['outsource'] = False

TypeError: 'mappingproxy' object does not support item assignment

因为所有的方法都归属于一个类,所以它们也存储在类的字典中,从上面的例子中可以看到已有的 __init__ 和 __repr__ 方法。我们可以再添加几个来验证:

class Employee:

# ...

@staticmethod

def soo():

pass

@classmethod

def coo(cls):

pass

def foo(self):

pass

>>> Employee.__dict__

mappingproxy({'__module__': '__main__',

'outsource': False,

'__init__': <function __main__.Employee.__init__(self, department, name)>,

'__repr__': <function __main__.Employee.__repr__(self)>,

'inservice': <property at 0x108419ea0>,

'soo': <staticmethod at 0x1066ce588>,

'coo': <classmethod at 0x1066ce828>,

'foo': <function __main__.Employee.foo(self)>,

'__dict__': <attribute '__dict__' of 'Employee' objects>,

'__weakref__': <attribute '__weakref__' of 'Employee' objects>,

'__doc__': None})

继承与属性查找

目前为止,我们已经知道,所有的属性和方法都存储在两个 __dict__ 字典中,现在我们来看看 Python 是如何进行属性查找的。

Python 3 中,所有类都隐式的继承自 object,所以总会有一个继承关系,而且 Python 是支持多继承的:


>>> class A:

... pass

...

>>> class B:

... pass

...

>>> class C(B):

... pass

...

>>> class D(A, C):

... pass

...

>>> D.mro()

[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>]

mro() 是一个特殊的方法,它返回类的线性解析顺序。

 

属性访问的默认行为是从对象的字典中获取、设置或删除属性,例如对于 e.f 的查找简单描述是:

e.f 的查找顺序会从 e.__dict__['f'] 开始,然后是 type(e).__dict__['f'],接下来依次查找 type(e) 的基类(__mro__ 顺序,不包括元类)。 如果找到的值是定义了某个描述器方法的对象,则 Python 可能会重载默认行为并转而发起调用描述器方法。这具体发生在优先级链的哪个环节则要根据所定义的描述器方法及其被调用的方式来决定。

所以,要理解查找的顺序,你必须要先了解描述器协议。

简单总结,有两种描述器类型:数据描述器和和非数据描述器。

如果一个对象除了定义 __get__() 之外还定义了 __set__() 或 __delete__(),则它会被视为数据描述器。仅定义了 __get__() 的描述器称为非数据描述器(它们通常被用于方法,但也可以有其他用途)

由于函数只实现 __get__,所以它们是非数据描述器。


Python 的对象属性查找顺序如下:

  1. 类和父类字典的数据描述器
  2. 实例字典
  3. 类和父类字典中的非数据描述器

请记住,无论你的类有多少个继承级别,该类对象的实例字典总是存储了所有的实例变量,这也是 super 的意义之一。

下面我们尝试用伪代码来描述查找顺序:

def get_attribute(obj, name):

class_definition = obj.__class__

descriptor = None

for cls in class_definition.mro():

if name in cls.__dict__:

descriptor = cls.__dict__[name]

break

if hasattr(descriptor, '__set__'):

return descriptor, 'data descriptor'

if name in obj.__dict__:

return obj.__dict__[name], 'instance attribute'

if descriptor is not None:

return descriptor, 'non-data descriptor'

else:

raise AttributeError

>>> e = Employee('IT', 'bobo')

>>> get_attribute(e, 'outsource')

(False, 'non-data descriptor')

>>> e.outsource = True

>>> get_attribute(e, 'outsource')

(True, 'instance attribute')

>>> get_attribute(e, 'name')

('bobo', 'instance attribute')

>>> get_attribute(e, 'inservice')

(<property at 0x10c966d10>, 'data descriptor')

>>> get_attribute(e, 'foo')

(<function __main__.Employee.foo(self)>, 'non-data descriptor')

由于这样的优先级顺序,所以实例是不能重载类的数据描述器属性的,比如 property 属性:

>>> class Manager(Employee):

... def __init__(self, *arg):

... self.inservice = True

... super().__init__(*arg)

...

>>> m = Manager("HR", "cici")

AttributeError: can't set attribute

发起描述器调用

上面讲到,在查找属性时,如果找到的值是定义了某个描述器方法的对象,则 Python 可能会重载默认行为并转而发起描述器方法调用。

描述器的作用就是绑定对象属性,我们假设 a 是一个实现了描述器协议的对象,对 e.a 发起描述器调用有以下几种情况:

  • 直接调用:用户级的代码直接调用e.__get__(a),不常用
  • 实例绑定:绑定到一个实例,e.a 会被转换为调用: type(e).__dict__['a'].__get__(e, type(e))
  • 类绑定:绑定到一个类,E.a 会被转换为调用: E.__dict__['a'].__get__(None, E)

在继承关系中进行绑定时,会根据以上情况和 __mro__ 顺序来发起链式调用。

函数与方法

我们知道方法是属于特定类的函数,唯一的不同(如果可以算是不同的话)是方法的第一个参数往往是为类或实例对象保留的,在 Python 中,我们约定为 cls 或 self, 当然你也可以取任何名字如 this(只是最好不要这样做)。

上一节我们知道,函数实现了 __get__() 方法的对象,所以它们是非数据描述器。在 Python 访问(调用)方法支持中正是通过调用 __get__() 将调用的函数绑定成方法的。

在纯 Python 中,它的工作方式如下(示例来自描述器使用指南):


class Function:

def __get__(self, obj, objtype=None):

if obj is None:

return self

return types.MethodType(self, obj) # 将函数绑定为方法

在 Python 2 中,有两种方法: unbound method 和 bound method,在 Python 3 中只有后者。

bound method 与它们绑定的类或实例数据相关联:

>>> Employee.coo

<bound method Employee.coo of <class '__main__.Employee'>>

>>> Employee.foo

<function __main__.Employee.foo(self)>

>>> e = Employee('IT', 'bobo')

>>> e.foo

<bound method Employee.foo of <Employee: IT-bobo>>

借助描述符协议,我们可以在类的外部作用域手动绑定一个函数到方法,以访问类或实例中的数据,我将以这个示例来解释当你的对象访问(调用)类字典中存储的函数时将其绑定成方法(执行)的过程:

现有以下函数:

>>> def f1(self):

... if isinstance(self, type):

... return self.outsource

... return self.name

...

>>> bound_f1 = f1.__get__(e, Employee) # or bound_f1 = f1.__get__(e)

>>> bound_f1

<bound method f1 of <Employee: IT-bobo>>

>>> bound_f1.__self__

<Employee: IT-bobo>

>>> bound_f1()

'bobo'

总结一下:当我们调用 e.foo() 时,首先从 Employee.__dict__['foo'] 中得到 foo 函数,在调用该函数的 foo 方法 foo.__get__(e) 将其转换成方法,然后执行 foo() 获得结果。这就完成了 e.foo() -> f(e) 的过程。

如果你对我的解释感到疑惑,我建议你可以阅读官方的描述器使用指南以进一步了解描述器协议,在该文的函数和方法和静态方法和类方法一节中详细了解函数绑定为方法的过程。同时在 Python 类一文的方法对象一节中也有相关的解释。

__slots__

Python 的对象属性值都是采用字典存储的,当我们处理数成千上万甚至更多的实例时,内存消耗可能是一个问题,因为字典哈希表的实现,总是为每个实例创建了大量的内存。所以 Python 提供了一种 __slots__ 的方式来禁用实例使用 __dict__,以优化此问题。

通过 __slots__ 来指定属性后,会将属性的存储从实例的 __dict__ 改为类的 __dict__ 中:


class Test:

__slots__ = ('a', 'b')

def __init__(self, a, b):

self.a = a

self.b = b

>>> t = Test(1, 2)

>>> t.__dict__

AttributeError: 'Test' object has no attribute '__dict__'

>>> Test.__dict__

mappingproxy({'__module__': '__main__',

'__slots__': ('a', 'b'),

'__init__': <function __main__.Test.__init__(self, a, b)>,

'a': <member 'a' of 'Test' objects>,

'b': <member 'b' of 'Test' objects>,

'__doc__': None})

关于 __slots__ 我之前专门写过一篇文章分享过,感兴趣的同学请移步理解 Python 类属性 __slots__ 一文。

补充

__getattribute__ 和 __getattr__

也许你还有疑问,那函数的 __get__ 方法是怎么被调用的呢,这中间过程是什么样的?

在 Python 中 一切皆对象,所有对象都有一个默认的方法 __getattribute__(self, name)。

该方法会在我们使用 . 访问 obj 的属性时会自动调用,为了防止递归调用,它总是实现为从基类 object 中获取 object.__getattribute__(self, name), 该方法大部分情况下会默认从 self 的 __dict__ 字典中查找 name(除了特殊方法的查找)。

话外:如果该类还实现了 __getattr__,则只有 __getattribute__ 显式地调用或是引发了 AttributeError 异常后才会被调用。__getattr__ 由开发者自己实现,应当返回属性值或引发 AttributeError 异常。

而描述器正是由 __getattribute__() 方法调用,其大致逻辑为:

def __getattribute__(self, key):

v = object.__getattribute__(self, key)

if hasattr(v, '__get__'):

return v.__get__(self)

return v

请注意:重写 __getattribute__() 会阻止描述器的自动调用。

函数属性

函数也是 Python function 对象,所以一样,它也具有任意属性,这有时候是有用的,比如实现一个简单的函数调用跟踪装饰器:

def calltracker(func):

@wraps(func)

def wrapper(*args, **kwargs):

wrapper.calls += 1

return func(*args, **kwargs)

wrapper.calls = 0

return wrapper

@calltracker

def f():

return 'f called'

>>> f.calls

0

>>> f()

'f called'

>>> f.calls

1

 

最后多说一句,想学习Python可联系小编,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以进q裙947618024领取。

本文章素材来源于网络,如有侵权请联系删除。

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期 CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分; 阅读详情

相关推荐

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 250

python中的字典类型

字典值可以没有限制地取任何 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。**注意: dict ** 作为 Python 的关键字和内置函数,变量名不建议命名为。通过次访问可以避免上面的错误,并且可以指定当key不存在时value的值。键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。这样的访问会存在一个问题,当你访问一个不存在的key是会报异常。能删单一的元素也能清空字典,清空只需一项操作。

杨海吉 885

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

python对象class转json异常AttributeError: ‘mappingproxy‘ object has no attribute ‘dict‘

这几天在写python脚本的时候,需要将class对象转化为json字符串,作为参数进行接口调用。的列表中,所有的对象都是同一个,且均为最后更新的那个。并且,class对象是不能被json格式化的,故报了以上的异常。经过一番幸苦查找,终于定位到原因,其实很低级的错误。在嵌套class的时候,我有一个地方声明对象实例时,漏掉了。的写法是创建一个对象实例,和Java的用法一样,这也就比较好理解。的写法,直接访问的是对象,而非对象实例,因此我最终组成的。python中,这两种写法都有,不带。

猫舍 925

Android音频子系统分析-car_audio_configuration.xml

先附上一个例子,再逐一解释。概括来说,该文件描述了车里有哪些区域,每个区域划分了多少组,每个组包含了哪些设备,每个设备接收哪些类型的音频流。

不定时记录分享一些有用没用的东西 989

YOLOv11损失函数进阶:融合SmoothL1与FocalLoss,让检测精度再涨10%的实战教程

在YOLOv11的这里的beta参数控制“L1与L2的过渡阈值”,默认设为1.0即可兼容多数场景。同样在# 计算动态alpha(基于类别样本数,需提前统计self.class_counts)# 交叉熵基础# FocalLoss权重else:使用前需统计数据集的(每个类别的样本数),并传入的alpha参数。损失函数是YOLOv11精度的“灵魂”——SmoothL1让边界框回归“稳、准、狠”,改进FocalLoss让类别分类“雨露均沾”。从代码改造到实战落地,本教程已为你搭建了一条精度跃升的路径。

m0_64661770的博客 213

Python字典的创建、操作以及使用案例

总的来说,Python字典是一种非常重要和常用的数据类型,用于存储和访问键值对数据。字典提供了一种灵活的方式来组织和操作数据,可以使用键来访问和修改值。通过理解字典的特性和用法,可以更好地利用Python编程语言的功能。感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。一、Python所有方向的学习路线Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。二、Python必备开发工具。

qq_41314882的博客 1825

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 627

python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...

1. 类对象和实例对象Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作:可以通过“类名()”的方式实例化一个对象。可以通过“类名.类属性”的方式来访问一个类属性。如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化、实例化,即实例化对象是类对象实例化之后的产物。class Perso...

weixin_39559277的博客 390

OpenCV计算机视觉实战(11)——边缘检测详解

在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。

qq_30167691的博客 4375

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2400

python用户界面_轻量、纯Python文本用户界面控件工具箱

picotuiPicotui is a Text User Interface (TUI) widget library for Python3. It is known to work with CPython3 and Pycopy (Unix version is officially supported for the latter), but should work with any P...

weixin_39867594的博客 252

如何在SpringBoot中实现AI 流式输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1481

python 字典应用程序实例_干货收藏 | 大佬带你一起走进 Python——类的内部

这篇文章和大家一起聊一聊 Python 3.8 中类和对象背后的一些概念和实现原理,主要尝试解释 Python 类和对象属性的存储,函数和方法,描述器,对象内存占用的优化支持,以及继承与属性查找等相关问题。让我们从一个简单的例子开始:class Employee: outsource = False def __init__(self, department, name): self.depart...

weixin_39768247的博客 109

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python干货:程序员收藏的200个标准库,带你轻松入门

文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 stringprep:互联网字符串准备工具 readline:GNU按行读取接口 rlcompleter:GNU按行读取的实现函数 struct:将字节解析为打包的二进制数据 codecs:注册表与基类的编解码器 ![Python干货:程序员收藏的200个标准库,带你轻松入门](https://p6-tt.byteimg.

Python6886的博客 243

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Python入门最完整的基础知识大全【纯干货,建议收藏】

初来乍到,大家好,我是老肖。 作为一个有着9年Python开发经验的老码农,今天我就为大家带来了Python的基础知识点,全篇干货,建议大家动动手指收藏起来,一定能够帮助你顺利入门Python! 1、环境搭建 Python由荷兰数学和计算机科学研究学会的Guido van Rossum于1990 年代初设计。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。 Python具备可移植性,可以在多个平台运行,这里给大家带来的是Windows平台的环境搭建。 (1).

Lapua的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

学习Python,这29个实用小技巧你如果不知道的话,那亏大了!【纯干货,建议收藏】

前言 先收藏,再点赞,今后好运定不断! 各位优快云上的朋友们大家好,先厚脸皮讨要个三连支持吧!希望这篇文章能帮助到你! 好了!废话不多说,直接上干货: 技巧目录前言1、使用字典来存储选择操作2、一行代码计算任何数的阶乘3、找到列表中出现最频繁的数4、重置递归限制5、原地交换两个数字6、链状比较操作符7、使用三元操作符来进行条件赋值8、检查一个对象的内存使用9、使用slots来减少内存开支10、使用lambda来模仿输出方法11、从两个相关的序列构建一个字典12、一行代码搜索字符串的多个前后缀13、在Pyt

smengo的博客 8860

Python代码性能优化归纳总结,干货收藏

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些 Python 代码加速运行的技巧进行整理。

Trb601012的博客 1453

熬夜总结了53个Python干货技巧,建议收藏

来源:zhuanlan.zhihu.com/p/48293468下面是老司机总结的一些干货技巧,非常有价值,尤其是对比c/c++有其他语言编程基础的小伙伴,记得收藏哦!1. 易混淆操作本节...

Python小二 1213

【建议收藏】30个较难Python脚本,纯干货分享

本篇较难,;接上篇文章,对于Pyhon的学习,上篇学习的结束相信大家对于Pyhon有了一定的理解和经验,学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就!加油!

m0_61249789的博客 6780

分享自己最近收藏的电音干货

电音好肤浅,但感官好诚实~希望大家喜欢,欢迎大家分享更好听的音乐

定期分享编程干货~ 97

干货收藏!Python完整代码带你一文看懂抽样

导读:抽样是从整体样本中通过一定的方法选择一部分样本。抽样是数据处理的基本步骤之一,也是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。 作者:宋天龙 来源:大数据DT(ID:bigdatadt) 01 什么时候需要抽样 抽样工作在数据获取较少或处理大量数据比较困难的时期非常流行,这主要有以下几方面原因: 数据计算资源不...

大数据 1479

【全文干货】python—函数详解(值得收藏的学习手册)

一、函数入门 1.概念 函数是可以重复执行一定任务的代码片段,具有独立的固定的输入输出接口。 函数定义的本质,是给一段代码取个名字,方便以后重复使用 为了方便以后调用这个函数,在定义它的时候,就需要明确它的输入(参数)与输出(返回值) 2.定义函数的语法格式 def 函数名(形参列表): #可执行语句 return 返回值 函数名 只要是合法的标识符即可(同变量命名) 为了提高可读性,建议函数名由一个或多个有意义的单词组成,单词之间用下划线_分隔,字母全部小写 形参列表

Zincy星辰 1万+

Python批量处理文件、图片、视频【干货建议收藏】

文章目录1.批量筛选2.批量重命名3.批量保存、复制或移动4.批量下载图片5.批量压缩图片 1.批量筛选 切片 切分 正则 2.批量重命名 直接修改 os 根据规则修改 3.批量保存、复制或移动 复制 移动 保存 保存图片 保存txt 保存到csv 保存数据库mysql 4.批量下载图片 5.批量压缩图片 ...

cungudafa的博客 5980

Python 简明语法总结,干货建议收藏

python基础 数据类型和变量常规类型:整形、浮点型、字符串(以' 或者 " 括起来)、布尔值(True, False 奇怪为什么用大写)。转义使用\多行请用'''...'''表示布尔运算符:and or not空值:Nonepython并无实质常量,只有约定常量,全大写表示(个人觉得使用objective-c的k开头表示法也不错。比如kServerAddress) 字符串和编码在日常编写中似乎用不到到字符编码互转的功能字符串格式化: 'hello , %@' % 'world!' 使用%s占位符,

weixin_48726357的博客 351
上一篇: 大佬教你如何让爬虫可视化——爬下来的东西不分析一波岂不可惜
下一篇: 教你Python的collections.Counter类型
python小丸子
博客等级 码龄6年 30粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值