Python
文章平均质量分 83
Python
日晨难再
杂学旁收
展开
-
Python:setattr()函数和__setattr__()魔术方法
setattr()是一个python内置的函数,用于设置一个对象的属性值,一般情况下,可以通过点运算符(.)完成相同的功能,但是getattr()拥有一个点运算符无法实现的功能,就是允许使用字符串(甚至字符串内容可以不是一个标识符)来表示属性名,从而可以在运行时动态地选择要设置的属性,这对于编写通用的代码或者处理动态数据结构很有用。原创 2024-07-14 21:05:00 · 507 阅读 · 5 评论 -
Python基础:内置类type的用法
在python中,一切数据类型都是对象(即类的实例),包括整数、浮点数、字符串、列表、元组、集合、字典、复数、布尔、函数、自定义类等,它们都是根据相应的类创建的。 python内建类的定义可以在库文件/stdlib/builtins.pyi中找到,下面的例1示例性地给出了整数类型的定义。原创 2024-05-06 20:53:56 · 724 阅读 · 33 评论 -
Python:可迭代对象与迭代器
根据Python官方文档,可迭代对象(iterable)是“一种能够逐个返回其成员项的对象”。具体来说,这种对象要么定义了一个返回迭代器(iterator)的魔术方法__iter__(),要么定义了魔术方法__getitem__(),并使用从0开始的整数索引。原创 2024-04-18 14:42:13 · 1864 阅读 · 28 评论 -
C&Python:比较运算符串联的差异
在C语言和Python中,比较运算符是一个常用的运算符,但这两种语言在某些情况下对比较运算符的解析缺存在差异,本文旨在明确这一点。原创 2024-03-04 15:33:07 · 1466 阅读 · 17 评论 -
Python:getattr()函数和__getattribute__()魔术方法
getattr()是一个python内置的函数,用于获得一个对象的某个属性,一般情况下,可以通过点运算符(.)完成相同的功能,但是getattr()拥有一个点运算符无法实现的功能,就是允许你使用变量来表示属性名,从而可以在运行时动态地选择要获取的属性。这对于编写通用的代码或者处理动态数据结构很有用。原创 2024-03-03 13:30:59 · 488 阅读 · 13 评论 -
C&Python:表达式的求值顺序(evaluation order)
C语言针对表达式的计算,设置了操作符的优先级和结合性这两个特性,优先级用于解析不同优先级的符号,结合性用于解析相同优先级的符号。但是这两个特性并不能完全确定表达式的计算顺序,这就给编译器留下了一定的优化的空间,下面举例说明这一点。假设有如下所示的简单表达式。原创 2024-02-13 16:53:27 · 1566 阅读 · 10 评论 -
Python:词法分析(行结构与显式、隐式行拼接)
1、逻辑结构一个Python程序由许多逻辑行组成,字面意义上的一行指的是末尾有换行符(\n),但在不同的情况下,行末尾的换行符(\n)可能有不同的意义。2、逻辑行 逻辑行的结尾的换行符(\n)被解析为NEWLINE标记。一般来说,一条语句不能跨越逻辑行而存在(除非是复合语句,如if复合语句可以由多个逻辑行组成)。根据显式或隐式行拼接规则,若干个物理行可以组成逻辑行。原创 2023-11-11 22:11:06 · 793 阅读 · 16 评论 -
Python:函数调用的实参
如果任何关键字实参没有与之对应的形式参数名称,将会引发TypeError异常,除非有一个形式参数使用了**expression句法,该形式参数将接受一个包含了多余关键字实参的字典(使用关键字作为键而参数值作为与键对应的值),如果没有多余关键字实参,则它为一个(新的)空字典。其中,primary是原型,代表编程语言中最紧密绑定的操作,它的具体可以为几种形式,可以是一个简单的函数名标识符。第一种是位置实参列表,后面是可选的加*实参和关键词实参列表,最后是可选的加**实参和关键词实参列表。原创 2023-09-16 15:35:38 · 295 阅读 · 10 评论 -
Python:函数定义的形参
带星参数列表的第一种情况是,一个"*"加可选的带单星形参,后面有若干个defparameter,在这之后,还可以有一个"**"加带双星形参。其中参数列表的第一种情况是由/分隔的两部分,其中前半部分是至少一个可以带默认值的形参,被称作defparameter,但它们有位置实参限制,即只能使用位置传递参数,后半部分是无位置限制的参数列表。在另一种情况下,参数列表也可以只有无位置限制的参数列表。函数定义就是定义一个用户自定义的函数对象,它的语法的BNF范式如下所示,有关BNF范式的规则,可以参考之前的文章。原创 2023-09-15 11:07:32 · 436 阅读 · 13 评论 -
Python:列表推导式
列表推导式使得创建特定列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。表达式是元组(例如上例的(x, y))或列表(例如[x, y])时,必须加上括号,即以下语句会报错。子句求值计算而得出一个新列表。列表推导式的方括号内包含以下内容:一个表达式,后面为一个。,该变量在循环结束后仍然存在,可以从代码中看到x的最终值是9。注意,这段代码创建(或覆盖)变量。注意,上面两段代码中,子句,然后,是零个或多个。原创 2023-09-03 11:58:32 · 427 阅读 · 10 评论 -
Python:多变量赋值
如果目标列表包含一个带有星号前缀的目标,这称为“加星”目标:则该对象必须是至少有‘’目标列表项数减一‘’项数的可迭代对象。该可迭代对象前面的项将按从左至右的顺序被赋值给加星目标之前的目标。在Python中还可以解包赋值,此时也需要保证右端的可迭代对象的项数等于左侧的目标列表项数(其实对于赋值号右边有多个表达式的情况,会返回一个包含各表达式的元组),如下例所示,这里同样可以使用加星目标。Python中的赋值语句可以同时对多个变量进行对象绑定(赋值),既可以是多变量链式赋值,也可以是多变量平行赋值,如下所示。原创 2023-09-02 11:55:04 · 1193 阅读 · 7 评论 -
Python:列表的浅拷贝与深拷贝
将列表变量名直接赋值给另一个变量,并不会创建一个新的列表对象,而是使得一个变量多了一个标签(变量名只是对象的一个标签,也可以理解为变量名只储存了对象的地址),所以此时对your_list或my_list的任何更改都会体现在同一个对象上。可以发现,虽然使用这三种方法新建了三个不同的列表对象,但这些对象的内容是一致的,也就是说三个列表对象的内容是同一批地址,此时列表对象的元素中有可变对象(如列表和字典等),则可能会出现意想不到的结果,如下代码所示。首先我们来看以下代码。原创 2023-08-23 20:51:27 · 454 阅读 · 14 评论 -
Python:在定义前“调用”函数或变量
这种形式的函数定义,在C语言中是会报错的,因为b函数并没有在a函数前定义,也没有函数原型声明。而在python中,解释器发现a函数的定义时并不会去检查其内部的其他函数调用或变量赋值是否合法,而只是记录下有函数a,等到运行a()语句时,才会去执行a函数,此时b函数已经被解释器读取,因此不会报错。对于变量,依旧适用,解释器发现a函数的定义时,并不会检查print语句中的c是否定义,而是在c定义完成,执行a语句时才来检查是否有c。原创 2023-08-07 22:56:44 · 427 阅读 · 3 评论