Python编码风格

news/2024/7/20 12:30:56 标签: python, 内存管理, c/c++

编写python代码的PEP8标准(http://www.python.org/dev/peps/pep-0008/)

  • 每个缩进层次使用4个空格。
  • 每行最多79个字符
  • 顶层的函数或类的定义之间空两行
  • 采用ASCII或UTF-8编码文件
  • 在文件顶端,注释和文档说明下面,每行每条import导入一个模块,同时按照标准库,第三方库和本地库导入顺序分组
  • 小括号,中括号,大括号,逗号之前没有额外空格
  • 类命名采用驼峰命名发

 

完了以后可以使用pep8来检查python文件是否符合PEP8标准。

1. python中的变量不需要先定义在使用,可以直接使用,重新使用可以付给不同类型的值。

2. 变量命名遵循C语言命名规则。

3. 大小写敏感。

4. 变量引用计数。

5. del语句可以直接释放资源,变量名删除,引用计数减一。

6. 变量内存自动管理回收,垃圾收集。

7. 指定编码在文件开头加入 #--coding:UTF-8-- 或者#coding=UTF-8

 

python">In [6]: a=12                    #无需定义,直接使用,python解释器根据右侧决定左侧类型

In [7]: print a
12

In [8]: id(a)                     #变量a在内存中的编码,
Out[8]: 25014352

In [9]: type(a)                 #变量a的类型
Out[9]: int

In [10]: b=12.33333

In [11]: id(b)                   #变量b在内存中所占用的内存编码
Out[11]: 25360264

In [12]: type(b)
Out[12]: float

In [13]: a="zhangsan"     #变量a重新指向一个新的字符串

In [14]: print a
zhangsan

In [15]: id(a)#变量a在内存中的编码为保存“zhangsan”的地方,原来a指向的内存编码里的内容并没有立即释放
Out[15]: 139844847653680

In [16]: type(a)
Out[16]: str     #变量a现在指向一个字符串
                                    

 python是动态类型语言,“引用”“对象”分离,如下几个python内置函数可以帮我我们理解python的内存存储:

id()    : 返回对象的内存地址

type()  : 返回对象的类型

is 关键字  : 用于判断两个引用所指的对象是否相同

sys.getrefcount()  :查看对象的引用计数

globals()  :查看词典

 

python缓存了整数和短字符串,因此每个对象只存了一份,长的字符串和其他字符串可以有多个相同的对象。

python">In [18]: a="zhangsan is beijing"

In [19]: b="zhangsan is beijing"

In [20]: print(a is b)
False

In [21]: a=[]

In [22]: b=[]

In [23]: print(a is b)
False

 在python中,每个对象都存有指向该对象的引用总数,即引用计数(reference count),当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用,因此getrefcount()所得到的结果会比期望值多1.

python">In [25]: import sys

In [26]: 

In [26]: print(sys.getrefcount(a))
2

In [27]: 

In [27]: from sys import getrefcount

In [28]: 

In [28]: print(getrefcount(b))
2

 python的容器对象(container),例如表,词典等等的,可以包含多个对象,容器对象中包含的并不是元素对象本身,是指向各个元素对象的引用,对象应用对象。

引用减少

python">In [43]: a=1

In [44]: b=a

In [45]: print(getrefcount(b))
1558

In [46]: del a

In [47]: print(getrefcount(b))
1557

 del也可以删除容器中的元素

python">In [48]: x=[1,2,3]

In [49]: del x[0]

In [50]: print(x)
[2, 3]

 当某个引用指向对象A,当这个引用重新指向其他对象时,对象A的引用计数减少1个。

python">In [51]: y=[1,2,3]

In [52]: l=y

In [53]: print(getrefcount(l))
3

In [54]: y=7

In [55]: print(getrefcount(l))
2

 python的垃圾回收

简而言之,当python的某个对象引用计数将为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。然而垃圾回收时,python不能进行其他的任务了,频繁的垃圾回收将大大的降低python的工作效率,如果内存中的对象不多,就没有必要哦,python只会在特定条件下自动启动垃圾回收。当python运行时,会记录其中分配对象(object allocation)和取消对象(object deallocation)的次数,当两者的差值高于某个阀值时,垃圾回收会自动启动。

查看阀值:

python">In [56]: import gc

In [57]: print(gc.get_threshold())
(700, 10, 10)

 后面的两个10是分代回收相关的阀值,700是垃圾回收启动的阀值。可以通过set_threshold()重新设置阀值。

也可以手动启动垃圾回收gc.collect()

 

分代回收

python也有分代回收的策略(generation),这个策略的基本假设是存活时间越久的对象,我们的程序往往会产生大量的对象,许多对象很快产生和消失,但也有一些对象长期被使用。出于信任和效率,对于这样一些“长寿”对象,我们相信它们的用处,所以减少在垃圾回收中扫描它们的频率。

Python作为一种动态类型的语言,其对象和引用分离。这与曾经的面向过程语言有很大的区别。为了有效的释放内存,Python内置了垃圾回收的支持。Python采取了一种相对简单的垃圾回收机制,即引用计数,并因此需要解决孤立引用环的问题。Python与其它语言既有共通性,又有特别的地方。对该内存管理机制的理解,是提高Python性能的重要一步

 简单函数

1. def是定义函数的关键字。

2. 下面的x和y为形参,不需要类型修饰。

3. 函数的定义行需要“:”

4. 函数体整体缩进。

5. 函数可以拥有返回值,若无返回值,返回None,相当于C中的NULL。

python">def add(x,y):
	z=x+y
	return z
res=add(3,5)
print(res)

 局部变量和全局变量

局部变量的作用域覆盖全局变量(当局部变量定义了和全局变量一样的值的时候,全局变量就失效了。)

def p_num():
    num=5
    print num
num=10
p_num()
print(num)

结果为

5

10

函数内有局部变量定义,解释器不使用局部变量,局部变量的定义晚于被引用,就报错。(就是在编译阶段就出错了)

python">def p_num():
	print(num)
	num=5
	print(num)
num=10
p_num()
print(num)

 Traceback (most recent call last):
  File "/home/jiefy/work/2.py", line 6, in <module>
    p_num()
  File "/home/jiefy/work/2.py", line 2, in p_num
    print(num)
UnboundLocalError: local variable 'num' referenced before assignment

函数内部可以直接访问全局变量

python">def p_num():
	print(num)
num=10
p_num()
print(num)

10
10
[Finished in 0.1s]

函数内部修改全局变量,使用global关键字。

 

转载于:https://www.cnblogs.com/xindeng/p/7521412.html


http://www.niftyadmin.cn/n/978439.html

相关文章

Visual Studio使用技巧笔记(引用程序集自动复制dll到引用项目目录)

copy /y $(TargetPath) $(SolutionDir)\[您项目引用dll文件的目录]\$(TargetFileName) 例如&#xff1a;copy /y $(TargetPath) $(SolutionDir)\Dynamic.CallEntryTests\dlls\$(TargetFileName) 转载于:https://www.cnblogs.com/oceanho/p/4838916.html

LeetCode021 Merge Two Sorted Listss C语言

1Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.题意&#xff1a;合并两个有序单链表&#xff0c;合并后的仍然是有序的。。。。。。。。。。。。。。。。。。。 123456789…

POJ 2488 A Knight's Journey DFS

看到此题就要想到用DFS&#xff0c;但是题目还有一个弯子要注意&#xff1a; &#xff08;Find a path such that the knight visits every square once. The knight can start and end on any square of the board..&#xff09;骑士可以从任意地方开始&#xff0c;可以在任意…

HTML5 canvas 元素用于图形的绘制,通过脚本(通常是javascript)完成

2019独角兽企业重金招聘Python工程师标准>>> HTML5 <canvas> 元素用于图形的绘制,通过脚本(通常是javascript)完成 <canvas> 标签只是图形容器,您必须使用脚本来绘制图形 可以通过多种方法使用canvas绘制路径\盒\圆以及添加图像 创建一个画布&#xff0…

让SecureCRT终端字体显示颜色的操作

勾选下面红框中的内容就好啦 效果如下 本文转自 归来仍少年 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/shaoniana/1969083

学习angular.js之:ng-app

刚开始自学angular&#xff0c;遇到一个问题&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><script type"text/javascript" src"angular.min.…

亚泰史诗游戏攻略_史诗游戏与苹果大战

亚泰史诗游戏攻略This appeared in The Millennial Source这出现在千禧年的来源 Apple Inc. has come under increasing fire in the last few months over the policies of its iOS App Store, which some developers claim breaches antitrust rules and stifles competitio…

设置textfield 文字左边距

默认情况下,当向textField输入文字时,文字会紧贴在textField左边框上.我们可以通过设置textField的leftView,设置一个只有宽度的leftView.这样还不够,因为默认leftView是不显示的.还需要将leftViewMode设置为UITextFieldViewModeAlways.这样就完成了. (小技巧:通过查询UIText…