这些常见的python编码习惯,你都会吗

这篇具有很好参考价值的文章主要介绍了这些常见的python编码习惯,你都会吗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《不得不知的十个常见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 

 文章来源地址https://www.toymoban.com/news/detail-777071.html

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

 

到了这里,关于这些常见的python编码习惯,你都会吗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium执行js代码的两个方法你都会用吗?

    在使用selenium做web自动化的时候,很多小伙伴反馈有些页面上动作我们无法通过selenium封装的方法直接去做,比如说修改元素的属性,影子节点的操作等等。需要使用原生的js代码去实现,而selenium也给我提供了两个执行js代码的方法,一个是execute_script,另一个是execute_async_s

    2024年04月28日
    浏览(38)
  • 【C++】面试官:你小子,继承与多态的题你都会

    文章目录 前言 一、 理论知识类 二、 编程题选择类 上一篇文章我们详细了介绍了多态,用汇编一步一步的查看了多态的实现原理,讲解了这么多理论知识该做一些面试题了,这些面试题都是历年来大厂所出的笔试题,希望大家可以把我今天所讲的全部学懂~ 1. 下面哪种面向

    2023年04月25日
    浏览(39)
  • zookeeper入门,这些知识点你会吗

    8.Zookeeper集群管理 所谓集群管理无在乎两点:是否有机器退出和加入、选举master。 对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,

    2024年04月12日
    浏览(67)
  • 用上这个8个AI写作神器,立马告别写作烦恼困扰,你都会了吗? #AI写作#学习

    我们做自媒体运营,想要快速的创作内容,提供文章的创作速度是我们的目标,我们别的大佬可以很快地就创作出一篇内容,而自己墨迹半天确出不了一个字呢?其实这关乎到创作技巧,下面小编就跟大家分享如何利用自媒体工具辅助自己创作的技巧。 1.七燕写作 这是一个微

    2024年04月16日
    浏览(50)
  • 这些ChatGPT旗下的AI工具你都认识吗?

    说起ChatGPT这个AI工具大家肯定都不陌生,但它的所属公司OpenAI 旗下的其他AI工具也是非常强大!今天就给大家介绍这些AI工具,快来看看有没有你了解的吧。  1、ChatGPT 相信不用过多介绍,大家都认识!ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自

    2024年02月05日
    浏览(45)
  • CEO、CFO、CMO...这些职位你都知道吗?

    CXO是现代公司制度下的产物,是所有权与经营权相分离的一种制度表现形式。下面介绍下科技公司中常见的高管头衔。 CAO(Chief Administrative Officer)- 首席行政官 CFO(Chief financial officer)- 首席财务官 COO(Chief Operation Officer)- 首席运营官 CTO(Chief technology officer)- 首席技术官

    2024年02月15日
    浏览(35)
  • Kafka 万字精讲|工作五年这些你都知道吗?

    本文以 Kafka 官方文档 的内容为基石,结合参考文献处文章和笔者自身实践凝练而成,涵盖内容全面,详略得当。 这也是《一文搞懂》系列的第一篇技术长文,期待您的关注。 一个十分钟的视频带你了解 Kafka Apache Kafka 是一个开源的分布式事件流平台,被数千家公司用于高性

    2024年02月02日
    浏览(38)
  • 教你从零开始准备美赛!这些问题你都清楚了吗?

    写在前面 离2024年的数学建模美赛越来越近啦,大家都准备的怎么样呢?对于备赛还没有头绪的同学,今天,岛主就为大家介绍一下 如何从零开始准备美赛! 本期推文包括 数学建模的组队篇、练习篇和竞赛篇 ,是不可多得的数学建模保姆级教程,手把手教你怎么从零开始准

    2024年02月01日
    浏览(51)
  • 学习Boost二:从附录3来看编码习惯

    附录C 浅谈 在C++11标准中(C++11.2.12)总共定义了73个(keyword)、2个“准”(identifiers with special meaning)和11个操作符替代字(alternative representation)[1]。 虽然 C++标准中的很多,但并不都是有用的,有些已经被废弃,有些因使用不当则会导致“代码坏

    2024年02月14日
    浏览(39)
  • 这些软件测试面试题如果都会,月薪最少20k+【内附面试宝典】

    导读 刚好最近休息了一下,顺便整理了一些软件测试岗面试题,现在就把整理的面试题分享给大家,希望可以帮助到各位,废话就不多说了直接上干货。 Tip:我整理的面试题都按照这个目录,点击标题阅读即可, 此文章长期有效,找测试相关工作的朋友一定要好好收藏。

    2023年04月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包