本文分享自华为云社区《不得不知的十个常见PY编码习惯》,作者:码乐。

简介

语言在发展和变化,编码习惯也在发生改变。这里简单聊聊 17个python中常见的编码习惯或者风格。

1,可变数据结构: 注意在函数变量不要使用它

def foo(x=[]):
x.append(1)
print(x) >>>foo()
[1] >>>foo()
[1,1] >>>foo() [1,1,1] def foo(p=None):
if p is None:
p = []
p.append(1)
print(p) foo()
[1]
foo([2,3,4])
[2,3,4,1]

1.1模块的循环导入

我们定义一个老王模块,再定义一个小李模块,相互导入时,将报错

# laowang.py
import xiaoli
count =4
def main():
wilma.pr('Hello')
if __name__ == '__main__':
main() # xiaoli.py
import laowang
def pr(str):
print(str*fired.count)
if __name__== '__main__':
pr("Ok")

导入问题,如果在使用其他语言 比如 shell 脚本引用 python代码时,需要将python项目加入 linux环境变量。 <=python2.7

export PYTON_PATH=$PYTHON_PATH:/xxx/xxx/XXXProject

或者编辑 python虚拟环境,添加 setup.py, 然后执行 python install -e .

1.2 基础规则

该次执行不缓存sys.stdout,直接输出控制台

@参数 -u unbuffered

执行时带参数m,以Script方式执行py模块

@参数 -m 

跳过py模块第一行,允许使用非unix形式

@参数 -x

实体具体选项(set implementation-specific option)

@参数 -X

程序读取文件内容并执行

file 

程序从stdin 读取

@参数 -

python3 --help # 显示所有参数

dd

2, 内存管理

python 内存回收 基于 引用计数 和 分级回收。

2.1 小的整数 和短小字符,python将缓存以便重复使用

并且is关键字,用于判断两个引用所指对象是否相同

    >>> a = 'gd'
>>> b = 'gd'
>>> a is b
True

== 只判断值是否相同

    a2 = []
b2 = []
>>> a2 is b2
False
>>> b2 == a2
True

2.2 对象引用时python基本构成方式

赋值的本质 a=1,实际上时修改globals()字典的值,局部变量值的修改locals()的访问和修改

>>> a1
very good man
>>> globals()['a1'] = 'bad good mm'
>>> globals()

2.3 引用对象reference count

sys.getrefcount() 查看对象的引用计数,sys.getrefcount()在查看某个引用时将创建一个临时引用,所以引用计数将多1

    >>> c=[1,2,3]

getrefcount #这里c只有一次引用,但是计数时2,因为当前查询有一次临时引用

   2

引用计数的减少和增加

   >>> d=c

getrefcount # 增加引用d,计数3

     3

del d #删除引用d,c的引用计数又重新为2

2.4 垃圾回收机制 garbage collection

垃圾回收时py 独占进行的,大大降低py效率,特定条件下自动启动垃圾回收。

手工回收 gc.collect()

py 运行时分配对象obj allocation 和取消分配对象 deallocation次数被记录,高于垃圾回收阈值,启动垃圾回收

gc.get_threshold()查看该阈值,gc.set)threshold()重新设置该阈值

(700, 10, 10) 700表示启动垃圾回收阈值,10,10表示分别回收的阈值

2.4.1 垃圾回收分代策略 generation,基本假设如下

存活时间越久,越不可能在后面程序中变为垃圾。 这样所有对象分为0,1,2三代,所有新建对象都是0代。某一对象经历垃圾回收,仍然存活,那么它就被归入下一代对象。

垃圾回收时,一定扫描0代对象,如果0代经过一定次数垃圾回收,下一次对0代和1代扫描清理,

当1代也经历一次次数垃圾回收,这启动0,1,2所有对象的扫描

以上gc.get_threshold()返回(700,10,10)两个表示每10次0代垃圾回收,将配置1次1代垃圾回收,每10次1代垃圾回收,才有1次2代垃圾回收。

2.4.2 两个对象相互引用,

相互引用构成引用环 reference cycle,该引用环将给上一节2.4.1的垃圾回收带来困难,

引用环可能构成一些无法使用但引用计数不为0的对象 为了回收该引用环对象,

py复制了每个对象的引用计数为 gc_ref 遍历所有对象,将每个对象引用的对象相应的gc_ref减1,遍历结束后,

gc_ref不为0的对象和这些对象的引用对象,以及继续更新下游引用对象,被爆了,其他对象被回收。

参考 内存管理,函数默认参数,动态类型

2.4.3 迭代

可迭代对象 iter

迭代器 iter + next

生成器 特殊迭代器 yield

          def yd():
a = 100
yield a
yield a*8
yield 8000

2.4.4 抽象方法*(函数)

对象方法(self.对象方法),类方法(@classmethod),静态方法(@staticmethod)

抽象方法 需要子类实现的方法 用@abc.abstractmethod以及 metaclass = abc.ABCMeta
使得任何继承自父类的子类必须覆盖实现抽象方法,否则抛出异常

3,其他概念

闭包 closure

闭包指的是 难以读取其他函数内部遍历的函数

实现: 定义在函数内的内部函数可以读取外层函数变量,从而实现闭包

4,惯例

1,判定dict的key是否存在,使用key in dict而不用 has_key

2,not的位置,使用key not in dict 而不用 no key in dict

3, 使用 dict.get(key[,default])如果key存在,返回,否则返回default

4, 数组字典初始化

 dic = {}
for k,v in data:
group = dic.setdefault(key,[]) #如果存在,返回dic[key],不存在把dic[key]设为defalut并返回
group.append(v)
from collections import defaultdic
dic = defalutdic(list)
for (k,v) in data:
dic[key].append(v) #所有key都有一个默认值

迭代一个数组,使用for i,e in enumerate(array) 而不是 for i in range(len(array))

  enumerate 还有第二个参数

5,py3元组unpack

    first, second,*rest, last = range(10)
0 1 2~8 9

6, 函数参数传入

    def foo(x,y):
print(x,y)
adict = {'x':1, 'y':2}

foo(**adict) #字典key作为参数名传入参数值

  alist=[1,2]
foo(*alist)

7, 字符串连接

    name = "Wang" "Hone"  # WangHong

8, 解释器中的

上一次接收器的返回值

9,嵌套列表推导式

 [(i,j) for i in range(3) for j in range(i)]

10, print重定向

print >>open('a.txt', 'w+'), 'hello,world'

11,反射

#检查是否某个自定的类

        isinstance(obj, class)   

12,Picking是Python数据结构的序列化过程

存储一个对象,稍后再取出读取

如何pickle 已存在的对象类型到文件

    json = {'name':'jack', 'age':100}
json_file = open('json pkl', 'rb')
pickle.dump(json.json_file)
json_file.dump(json,json_file)
json_file.close()

取出

data=pickle.load(json_file)
print(data)
json_file.close()

pickler内建类型和外部方法

类自定义行为

    __getinitargs__(self)  #
__getnewargs__(self)

Slate 记住它曾经是什么,以及什么时候赋值给它 ?

 __slate__

为对象类 提供限制,只能赋予固定的属性名称

13,对象模型Python3和Python2.x之间的主要区别

Python3的string和unicode区别不复存在,因此__unicode__被取消 __bytes__加入进来(与

python2.7的__str__和__unicode__行为类似),用于心的创建字节数组的内建方法

py3默认除法变成了true除法,因此__div__取消

__coerce__被取消,因为与其他魔法方法有功能重复
cmp 取消,与其他魔法方法功能重复
__nonzero__被重命名为

bool

14,断点

6.1, 断点设置后,代码执行到该位置,程序挂起检查程序行为
6.2, 异常断点,到达断点后要执行的操作
6.3, 断点属性,达到断点时要执行的操作
挂起策略,用于定义在遇到断点时是否必须挂起应用程序
对其他断点的依赖,
何时必须击中断点
6.4 消息记录
断点命中消息,命中断点时,控制输出一条日志消息
堆栈跟踪 断点的堆栈跟踪将命中打印到控制台 6.5 断点工具
pdb 交互式代码调试,功能包括
设置断点,单步调试,进入函数调试,查看当前代码,查看栈片段,动态改变变量的值
进入pdb交互界面
命令
break 或b设置断点
continue 或c 继续执行
list或l 查看当前代码段
step或s 进入函数
return或r 执行代码直到当前函数返回
exit或q 中止并退出
next或n 执行下一行
pp 打印变量的值

15, 依赖问题

pycurl 需要contos 7安装python3-devel
具体过程pycurl-centos7

16, py编译 发布流程

1,编译生成pyc文件,建议增加-O优选项

python3 -O -m compileall -b .

2, 删除py文件

   find . -name "*.py"|xargs rm -rf

3, 删除__pycache__目录

   find . -name "__pycache__" |xargs rm -rf

4, 打包 tar包

    cd ..
tar -cjvf xxx.1.1.00.tar.bz2 xxx

5, 或git push到仓库

  git push origin master:master

16 常用内置 魔法函数

iter # 在类中实现,可以直接对类进行迭代 类似于如下形式

            obj.next 或  next(obj)

call # 在对象直接 进行调用

            obj()

、slate 为对象类 提供限制,只能赋予固定的属性名称

__qualname__  # 查看类和当前函数名
>>> D.f.__qualname__
>>> D.f#返回类和函数

通过类字典返回函数,不会 返回函数名

    >>> D.__dict__['f']
<function D.f at 0x000001F6C6224670

通过类实例的点运算 查看函数 将直接返回函数

>>> d = D()
>>> d.f
<bound method D.f of <__main__.D object at 0x000001F6C5F42070>>

查看实例的函数对象

>>> d.f.__func__
<function D.f at 0x000001F6C6224670>
>>> d.f.__self__
<__main__.D object at 0x000001F6C5F42070>

17 内置函数 二进制运算

chr
返回整数 i 的字符串格式,如 chr(97) 返回字符 'a' 是 ord的逆运算
chr('8364') (欧元符号)返回 €
ord
返回代表单个Unicode字符的 码点的整数,例如 ord('a')返回整数 97
ord('€') (欧元符号)返回 8364

点击关注,第一时间了解华为云新鲜技术~

这些常见的python编码习惯,你都会吗的更多相关文章

  1. 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  2. Python编码(encode)和解码(Decode)常见的两个错误

    项目地址:https://git.io/pytips 0x07 和 0x08 分别介绍了 Python 中的字符串类型(str)和字节类型(byte),以及 Python 编码中最常见也是最顽固的两个 ...

  3. Python编码——常见的编码设置

    1.查看自己电脑的python的编码设置 # -*- coding: utf8 -*- import sys, locale """ locale.getpreferre ...

  4. Python编码规范(养成好的编码习惯很重要)

    学习过程养成良好的编码习惯 1. 类名采用驼峰命名法,即类名的每个首字母都大写,如:class HelloWord,类名不使用下划线 2. 函数名只使用小写字母和下划线 3.定义类后面包含一个文档字符 ...

  5. 新手常见的python报错及解决方案

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们.后续会不断补充. 目录 1.NameErr ...

  6. python编码详解--转自(Alex的博客)

    原文地址:http://www.cnblogs.com/alex3714/articles/7550940.html 编码回顾 在备编码相关的课件时,在知乎上看到一段关于Python编码的回答 这哥们 ...

  7. 转--python 编码规范

    编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...

  8. 系统编码 python编码

    编码一直都是一个很让人头疼的问题,尤其是在python里面.花了几天时间,终于把这个问题给弄明白了. 一,什么是编码,编码过程是怎样的?常见的编码方式有哪些? 编码是从一个字符,比如'哈',到一段二进 ...

  9. Python编码---转自金角大王

    本节内容 编码回顾 编码转换 Python的bytes类型 编码回顾 在备编码相关的课件时,在知乎上看到一段关于Python编码的回答 这哥们的这段话说的太对了,搞Python不把编码彻底搞明白,总有 ...

  10. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

随机推荐

  1. VMware Work Station使用ubuntu20.04挂载共享文件夹写入文件时出现输入/输出错误

    原因是默认的max_write为0x00020000即128k,超过此大小会报错,另外big_writes,umask等选项也要加上, sudo /usr/bin/vmhgfs-fuse .host: ...

  2. Oracle:查询表的统计信息,手动收集统计信息

    在Oracle中,存在执行计划不准的情况,怀疑表的统计信息是否收集,需要以下操作:select table_name,num_rows,blocks,last_analyzed from user_t ...

  3. 14.1 Socket 套接字编程入门

    Winsock是Windows操作系统上的套接字API,用于在网络上进行数据通信.套接字通信是一种允许应用程序在计算机网络上进行实时数据交换的技术.通过使用Windows提供的API,应用程序可以创建 ...

  4. Java虚拟机(JVM):第三幕:自动内存管理 - 垃圾收集器与内存分配策略

    前言:Java与C++之间有一堵高墙,主要是有内存动态分配和垃圾收集技术组成的.墙外的人想要进来,墙内的人想要出去. 一.概述 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的.内存的分配和 ...

  5. java后端操作树结构

    一.树结构的三种组装方式(递归.双层for循环,map) (1)递归 普通递归方法 public Result getBmsMenuList(UserSessionVO userSessionInfo ...

  6. nginx学习(基本概念、配置和命令、反向代理、负载均衡、动静分离)

    之前都只会照着网上的nginx配置和代码什么的直接拿过来用,但是没系统学习过,所以来系统学习一下nginx内容. 建议服务器不要关闭防火墙,按需开启端口就好,然后云服务器也要设置SSH密钥,安全性高一 ...

  7. Stride游戏引擎试毒

    想找别的引擎用, 主要还是因为unity和国内盗版用户的互相伤害, 就算用免费的个人版也要不停的验证. stride引擎, 原名xenko, 再原名paradox... 一开始是日本厂商开发的引擎, ...

  8. LCT(link cut tree) 详细图解与应用

    樱雪喵用时 3days 做了 ybtoj 的 3 道例题,真是太有效率了!!1 写死自己系列. 为了避免自己没学明白就瞎写东西误人子弟,这篇 Blog 拖到了现在. 图片基本沿用 OIwiki,原文跳 ...

  9. [C++]P3379 LCA 最近公共祖先

    最近公共祖先 LCA 倍增写法 LCA的倍增主要由三个重要的过程组成 预处理lg数组 DFS求fa depth 倍增节点 观看以下内容前建议先把完整代码大致纵览一遍,有利于理解各个函数的意义 倍增思想 ...

  10. 题解 CF1292A

    题目大意: 给你 \(2\times n\) 的迷宫,初始时没有任何障碍,给定 \(q\) 次询问,每次询问给予坐标 \((x,y)\),问将坐标 \((x,y)\) 反转状态(即无障碍变有障碍,有障 ...