Python代码换行技巧与类方法命名规范详解:提升代码可读性与维护性
目录

函数名后的“->”
描述函数的返回类型
代码太长,需要换行
比如字符串
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
我想在代码中将其更改为两行,以便看起来更好。
需要使用“\”
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
“bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”
一般IDE只要在需要换行的地方按回车即可,会自动添加“\”。
类方法/函数的前导下划线
名称前的单个下划线指定程序员将该名称视为“私有”。这可以看作是一种约定,以便阅读代码的人知道以 _ 开头的名称供内部使用。我说这是一个约定,因为它实际上对解析器意味着一些东西;如果我们从 import * 导入 *,则不会进行以 _ 开头的导入,除非它们明确包含在模块/包的 __all__ 列表名称中。
在名称(尤其是方法名称)之前使用双下划线 (__) 并不是一种约定,它只是对解析器具有特殊含义。 Python 管理这些名称,用于避免与子类定义的名称发生名称冲突。正如 Python 文档指出的那样,任何 __spam 形式的标识符(至少两个前导下划线,最多一个尾随下划线)在文本上都会被 _classname__spam 替换,其中 classname 是当前类名,前导下划线被剥离。
功能与方法
Python中函数和方法的区别:
不与类和实例绑定的函数是函数;绑定到类和实例的函数是方法。 u、r、b 位于字符串之前。在字符串前添加 u。
例:u“我是一个由汉字组成的字符串。”
作用:以下字符串采用Unicode格式编码,一般用在中文字符串前面,防止因源代码存储格式问题再次使用时出现乱码。
PS:不仅仅针对中文,还可以针对任何字符串。
在字符串前添加 r
示例:r"\n\n\n\n\n\n"
功能:语句后面的字符串是普通字符串。相反,特殊字符串包含:转义字符\n\t等。
用途:一般用于正则表达式、绝对文件地址等。
在字符串前添加 b
作用:python3.x中默认的str是unicode(py2.x中),bytes是str(py2.x中),b""前缀代表bytes
在python2.x中,b前缀没有具体含义,只是为了兼容python3.x的写法
python 中字符串格式化的符号
常见格式符号
%s通过str()字符串转换格式化
%u 无符号十进制整数
%d 有符号十进制整数
%o 八进制整数
%x 十六进制整数,小写字母
%X 十六进制整数,大写字母
%e 浮点数(科学记数法)
%E 浮点数(科学记数法,用E代替e)
%f 浮点实数
%g 浮点数(根据值的大小使用 %e 或 %f)
%G 浮点数(类似于%g)
i=1
while i<10: #控制行,1到9
j=1
while j <= i: #控制每行显示的数量,1到9
print("%d*%d=%d"%(i,j,i*j),end=' ') #输出
j+=1 #每行显示的数量加1
print("\n") #每一行结束换行
i+=1 #行数加1
可变和不可变对象
在Python中,字符串、元组和数字是不可变对象,而列表、字典等是可修改对象。
不可变类型:变量被分配a=5,然后a=10。这里实际上生成了一个新的int值对象10,a指向它,而5则被丢弃。并不会改变a的值,相当于重新生成了a。 。
变量类型:变量赋值la=[1,2,3,4]然后赋值la[2]=5改变列表la第三个元素的值。 la本身并没有被移动,只是修改了它的部分内部值。
Python3导入使用
import 语句有什么用? import语句用于导入其他python文件(称为模块)并使用模块中定义的类、方法或变量,以达到代码复用的目的。
导入模块名称。即导入后直接连接模块名称。在这种情况下,Python 将在两个地方查找该模块。第一个是 sys.path(通过运行代码 import sys; print(sys.path) 进行检查)。 os 模块所在目录在 sys.path 列表中,一般安装的 Python 库的目录都可以在 sys.path 中找到(前提是将 Python 安装目录添加到计算机的环境变量中),所以对于安装好的库,我们可以直接导入它们。第二个地方是运行文件(这里是m1.py)所在的目录。因为m2.py和运行文件在同一个目录下,所以上面的写法没有问题。
从包名导入模块名。通常,模块的集合称为包。与第一种写法类似,Python会在sys.path和运行文件目录两个地方寻找包,然后导入包中名为module_name的模块。
如果需要引用其他路径下的py文件,则需要使用sys.path.append(" ")来引用py文件所在的路径。然后就可以使用py文件中的类和函数了。
import sys
sys.path.append('../A/') #aa在A文件夹下
from aa import classA #classA是aa中的一个类
Python2和Python3中dict的区别
例如,在 Python2 中 dict.keys() 返回一个列表
dict={'姓名':'明','年龄':20}
字典.keys()
输出:['姓名','年龄']
Python3中的dict.keys()返回一个dict_keys对象
dict={'姓名':'明','年龄':20}
字典.keys()
输出: dict_keys(['姓名', '年龄'])
添加list后就可以等价了。
列表(dict.keys())
输出:['姓名','年龄']
python 修饰符@
Python函数修饰符@的作用是在现有函数的基础上添加额外的功能,常用于日志插入、性能测试、事务处理等。
创建函数修饰符的规则:
(1) 修饰符是一个函数
(2) 修饰符将被修饰的函数作为参数
(3) 修饰符返回一个新函数
(4) 修饰符维护被维护函数的签名
def log(func):
def wrapper():
print('log开始 ...')
func()
print('log结束 ...')
return wrapper
@log
def test():
print('test ..')
test()
Tuple - 元组(python概念)
元组与列表和数组的区别在于,元组一旦定义就不能修改;但是,列表和数组可以。此外,元组属性与列表类似。
Python元组的升级版——namedtuple(命名元组)
由于元组的局限性:元组内部的数据无法命名,所以我们常常不知道元组的含义,所以这里引入了collections.namedtuple工厂函数来构造带有字段名称的元组。元组。命名元组的实例消耗与普通元组相同的内存量,因为字段名称存储在相应的类中。该类也比普通对象实例小,因为Python不使用 __dict__ 来存储这些实例的属性。
nametuple对象的定义格式如下:
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个命名元组子类typename,其中参数含义如下:
ndarray
NumPy 最重要的特性之一是它的 N 维数组对象 ndarray,它是一系列相同类型数据的集合。集合中元素的索引以0下标开始。
ndarray 对象是一个多维数组,用于存储相同类型的元素。
ndarray中的每个元素在内存中都有相同的存储大小区域。
ndarray 内部由以下部分组成:
ndarray内部结构:
轴=-1
在python中,-1代表最后一个
如果你的矩阵形状=[3,4,5],那么对于这个矩阵,axis=-1实际上等于axis=2
** 算术运算中的运算符
代表力量
>>> 2 * 5
10
>>> 2 ** 5
32
Python参数传递
在传值过程中,被调用函数的形参被视为被调用函数的局部变量,即在栈中开辟一块内存空间来存储被调用函数放入的实参的值调用函数,以便想要成为实际参数的副本。值传递的特点是被调用函数对形参的任何操作都作为局部变量进行,不会影响调用函数实参变量的值。
在引用传递过程中,虽然被调用函数的形参也以局部变量的形式在栈上开辟内存空间,但此时存储的却是调用函数放入的实参变量的地址。被调用函数对形参的任何操作都按间接寻址处理,即通过栈中存储的地址访问调用函数中的实参变量。因此,被调用函数对形参执行的任何操作都会影响调用函数中的实参变量。
Python 不允许程序员选择是按值传递还是按引用传递。 python中传递参数的方法必须是“传递对象引用”。该方法相当于值传递和引用传递的组合。如果函数接收到对不可变对象(数字、字符或元组)的引用,则它无法直接修改原始对象 - 这相当于通过“值”传递对象。如果函数接收到对可变对象(字典、列表)的引用,它可以修改该对象的原始值 - 相当于通过“按引用传递”来传递对象。
例子
def foo(arg):
arg = 2
print(arg)
a = 1
foo(a) # 输出:2
print(a) # 输出:1
def bar(args):
args.append(1)
b = []
print(b)# 输出:[]
print(id(b)) # 输出:4324106952
bar(b)
print(b) # 输出:[1]
print(id(b)) # 输出:4324106952
numpy中矩阵乘法、星乘(*)和点乘(.dot)的区别
星乘(elementwise)表示矩阵中相应位置的乘法(element-wise multiplication),矩阵a*b下标(0,0) = 矩阵a下标(0,0) x 矩阵b下标(0,0);
点积是指求矩阵的内积,二维数组称为矩阵积(mastrixproduct)。
== 和 之间的区别是
Python中一切都是对象,整数也是对象,无一例外。要比较对象是否相等,可以使用 == 或 is。
is比较两个对象的id值是否相等,即两个对象是否是同一个实例对象,是否指向同一个内存地址。
== 比较两个对象的内容是否相等。默认情况下,调用对象的 __eq__() 方法。
为了 _
对于 _ 在范围内 (n)
_是一个占位符,表示不关心变量的值,只是用来循环n次。
例如,如果只想获取序列的头和尾,可以使用 _
事实上,和range(n)中的each的含义是一样的。 _ 只是一个代词,可以是each,也可以是任何其他符合标准的符号。只是为了方便后续参考。
修改全局变量
如果确定要引用和修改全局变量,必须加上global关键字
a = 3
def Fuc():
global a
print (a)
a=a+1
Fuc()
/和//
Python 3之后:“/”表示浮点除法,返回浮点结果; “//”表示整数除法。
相对路径
“/”:代表根目录。在Windows系统中,代表某个磁盘的根目录,如“E:\”
“./”:表示当前目录; (表示当前目录时,也可以去掉“./”,直接写文件名或下级目录)
“../”:表示上级目录
其他安装路径
我的位于 C:\Users\xxx (此处为用户名)\AppData\Local\Programs\Python
吉尔
首先要明确的是,GIL 不是 Python 的特性。这是实现Python解析器(CPython)时引入的概念。就像C++是一套语言(语法)标准,但可以使用不同的编译器将其编译成可执行代码。著名的编译器如GCC、INTEL C++、Visual C++等。Python也是如此。同一段代码可以通过CPython、PyPy、Psyco等不同的Python执行环境来执行。例如,JPython 没有 GIL。但是,CPython 是大多数环境中默认的 Python 执行环境。因此,在很多人的概念中,CPython就是Python,并且理所当然地认为GIL是Python语言的缺陷。所以这里我们要明确一点:GIL不是Python的特性,Python根本不需要依赖GIL。
那么CPython实现中的GIL是什么呢? GIL的全称是Global Interpreter Lock。为了避免误导,我们看一下官方的解释:
在 CPython 中,全局解释器锁(GIL)是一个互斥体,可防止多个本机线程同时执行 Python 字节码。这个锁是必要的,主要是因为CPython的内存管理不是线程安全的。 (然而,自从 GIL 存在以来,其他功能已经变得依赖于它强制执行的保证。)