文档章节

编写高质量代码读书笔记-基础语法

低调惆怅
 低调惆怅
发布于 2016/10/12 14:39
字数 2675
阅读 31
收藏 0

 

1、有节制的使用from 。。。 import 。。。

 

    python使用3种方式来引入外部模块:import语句、from。。。import。。。、__import__函数

    其中较为常见的是前两种。而__import__函数与import类似,不同点在于前者显式的将模块名字作为和字符串传递并赋值给命名空间变量。

    在使用import时要和注意以下几点:

    1)、一般情况下尽量优先使用import module形式,需要访问其中变量时用module.variable

    2)、有节制的使用from module import variable

    3)、尽量避免使用from module import * 避免域名污染

 

    python在初始化内存运行环境的时候会预先加载一批内建模块到内存中,这些模块的信息被存放在sys.modules中。导入sys模块后,使用sys.modules.items()便可以显示这些预加载信息,当加载一个模块的时候,解释器实际上是要做一下操作:

    1)、在sys.modules中搜索查看是否已存在该模块,如果存在则将其导入到当前局部命名空间,加载结束

    2)、如果sys.modules中找不到对应的名称,则为需要导入的模块创建一个字典对象,并将该对象信息插入到sys.modules中

    3)、加载前确认是否需要对文件模块进行编译,如果需要则先进行编译

    4)、执行动态加载,在当前模块的命名空间中执行编译后的字节码,并将其中所有的对象放入模块对应的字典中

 

过多使用from module import会带来以下问题:

    1)、命名空间冲突

    2)、循环嵌套导入的问题 

 

2、优先使用absolute import来导入模块

    

3、i+=1不等以++i

    

    python会将++i解释为+(+i)里边的+表示正号

 

 

4、使用with自动关闭资源

    with可以再代码块执行完毕以后还原进入该代码块的现场。包含with语句的代码块执行过程如下:

    1)、计算表达式的值,返回一个上下文管理器对象

    2)、加载上下文管理器的__exit__()方法以备以后使用

    3)、调用上下文管理器的__enter__()方法

    4)、如果with语句设置了目标对象,则将__enter__()方法返回的值赋给目标对象

    5)、执行with中的代码块

    6)、如果步骤5代码正常结束,调用上下文管理器对象的__exit__()方法,其返回值直接忽略

    7)、如果步骤5发生异常,调用上下文管理器的__exit__()方法,并将异常类型、值及Traceback信息作为参数传递个__exit__()方法。如果__exit__()返回值为false。则异常会被重新抛出,如果返回为true则异常挂起,程序继续执行

 

 

with的好处是无论程序以何种方式跳出with模块,总能保证文件被正确关闭。

针对其他情景同样可以实现运行时环境的清理与还原,如多线程中的锁

 

with神奇的地方得益于上下文管理器,它用来创建一个运行时环境。

上下文管理器是这样一个对象:他定义程序运行时需要建立的上下文,处理程序的进入和退出。实现上下文管理协议即在对象中定义

__enter__()和__exit__()方法,其中:

__exter__():进入运行时的上下文,返回运行时上下文相关的对象。

__exit__():退出运行时的上下文,定义在块执行之后上下文管理器应该做什么。

 

任何实现了上下文管协议的对象都可以成为一个上下文管理器

 

为了更好的辅助上下文管理,python还提供了contextlib

 

 

5、使用else子句简化循环

 

    ??python 语法糖

 

6、遵循异常处理的几点基本原则

    

    1)、注意异常的粒度,不推荐在try中放入过多的代码

    2)、谨慎的使用单独的except语句处理所有的异常,最好能定位具体的异常(容易掩盖程序真正发生错误的原因)

    3)、注意异常捕获的顺序,在合适的层次处理异常。

    4)、使用该友好的异常输出信息

 

7、避免finally中可能发生的陷阱

 

   1)、 当try块中发生异常的时候,如果在异常中找不到对应的异常处理,异常会被临时保存起来,当finally执行完毕的时候,异常会被重新抛出,但是如果finally语句中产生了新的异常或者执行了return后者break语句,那么临时保存的异常信息会丢失,从而导致异常屏蔽

   2)、如果在try块中有return语句,并且有finally模块。在走到try块中return时,在return之前会先执行finally模块中的语句,如果finally中有return,这回执行finally中return,try块中return就不会执行,如果finally中没有,则在finally之后会接着执行try块中return

 

8、深入理解None,正确判断对象是否为空 

 

    python中一下数据会被当做空来进行处理:

    1)、常量None

    2)、常量False

    3)、任何形式的数值类型零如0,0L,0.0,0j

    4)、空的序列,如''、()、[]

    5)、空的字典

    6)、当用户定义的类中定义了nonzero()方法和len()方法、并且该方法返回整数0或者布尔False时

 

    其中常量None的特殊性体现在它既不是0、False,也不是空字符串,它就是一个空值对象。其数据类型为NoneType,遵循单例模式,是唯一的,因而不能创建None对象。所有赋值为None的变量相等,并且None与任何其他非None的对象比较结果都为False

 

    if list1:    -------------a

        Do Something

    else:

        Other thing

    

    a处执行的时候,会先调用内部的__nonzero__()来判断变量list1是否为空并返回其结果。

    __nonzero__(),该内部方法用于对自身对象机型空值检测,返回0/1,或者True/False。如果一个对象没有定义该方法,python将获取__len__()方法调用结果来进行判断。__len__()返回0则表示为空。如果一个类中既没有定义__len__()方法也没有定义__nonzero__()方法,该类实例用if判断结果都为true。

 

9、连接字符串应优先使用join而不是+

    

    python中的字符串与其他一些语言不同,为不可变对象,一旦创建不可改变。这个特性直接影响到了python字符串连接的效率。

 

    连接字符串的时候join()方法效率高于+操作符,特别是字符串规模较大的会后,join()优势跟家明显。

 

    由于字符串不可变的,使用+号的时候,重做往右,毎加一次,python都会在在内存中重新申请一块内存,然后将合并后的字符串放进去。

    而join()方法连接字符串时,会事先计算需要申请的总空间,然后一次性申请所需要的你存,并将字符序列中的每一个元素复制到内存中去。

    故而,join优于+

 

 

10、格式化字符串的时候尽量使用.format而不是%

 

    1、format更为灵活

    2、format可以更方便的作为参数传递

    3、python 3已经不建议使用%,之所以保留%是为了向后兼容,所以,format终将取代%

    4、%在某些特殊情况下使用时需要特别小心

 

11、区别对待可变对象和不可变对象

 

 

12、一致的容器初始化形式

    

    列表解析:

    [expr for iter_item in iterable if cond_expr],他迭代iterable中的每一个元素,当条件满足的时候根据表达式expr计算的内容生成一个元素放入新的列表中,以次类推,并追踪返回整个列表。其中条件表达式不是必要的,如果没有条件能表达式,直接将expr计算的元素加入List中。列表解析非常灵活:

    1)、支持多重嵌套。如如果要生成一个二维列表可以使用列表嵌套的方式

    2)、支持多重迭代。如[(a,b) for a in .. for b in .. if a != b]

    3)、列表解析语法中的表达式可以是简单表达式,也可以是复杂表达式,甚至是函数如:

            def f(v):

                pass

            [f(v) for v in .. if v > 0]

            [v*3 if v%3==0 else v+1 for v in .. if ..]

    4)、列表表达式中的iterable可以使任意的可迭代对象。

 

    为什么在生成列表的时候推荐使用列表解析?

    1)、使用列表结息更为直观清晰,代码各岗位简洁

    2)、列表解析效率更高

 

    除了列表对于元组字典集合也有类似的语法

 

13、记住函数传参既不是传值也不是传引用

    

        

    python函数传递既不是值传递也不是引用传递,是对象传递。对于可变类型的对象,在函数内部修改对外部可见,对于不可变对象在函数内部修改对外部不可见

 

14、警惕默认参数的潜在问题

    

    def appendtest(newitem, lista = []):

        lista.append(newitem)

        return lista

    连续两次调用appendtest(1),appendtest(2)第一次会返回[1],第二次会返回[1,2]。为什么?

    def在python中是一个可执行语句,当解释执行def的时候,默认参数也会被计算,并存在函数.func_defaults属性中。由于python函数参数传递的是对象,可变对象在调用者和被调用者之间给共享,因此当首次用appendtest(1)的时候[]变为[1],而在此调用时由于默认参数不会重新计算,在[1]的基础上变成了[1,2]

  

 

15、慎用变长参数

 

    python支持可变长度的参数列表,即*args,**kargs

    

    为什么不推荐使用?

    1、过于灵活

    2、如果一个函数参数过长,虽然还可以使用可变参数来简化函数的定义,但是过长的参数一般表明这个函数可以有更好的反思来实现

    3、可变参数在下列情况适合使用:

        (1)、为函数添加一个装饰器

        (2)、参数数目不确定

        (3)、实现函数多台或者继承的情况下子类需啊哟调用父类的某些方法的是时候

 

16、分清staticmethod和classmethod

    

    python中类方法和静态方法都依赖于装饰器来实现的。

© 著作权归作者所有

低调惆怅
粉丝 6
博文 5
码字总数 9697
作品 0
合肥
程序员
私信 提问
《你不知道的JavaScript》 读书笔记

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScript》 (上) 读书笔记 ...

大灰狼的小绵羊哥哥
03/25
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1992/article/ 书籍链接:http://prod...

wwlcsdn000
2017/12/26
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
【面试总结】记一次失败的 bilibili 面试总结(2)

上一篇文章能受到这样的关注度,感谢各位同学的点赞和评论,给了我很多动力继续去更新这个系列,也希望它们能够对大家有一定的帮助。蟹蟹大家。 传送门 面试总结(1):HTML布局、CSS选择器及J...

一颗赛艇🚤
03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里技术男的成长史:越想证明自己死得越快……

在上海工作8年后,身为部门经理的钱磊,管理着一家ERP公司的百十来号员工,“再往上爬就是老板和他儿子了……从这个领域的技术角度来讲算是做到了顶。”05年,钱磊就开始关注一家名字奇怪,做...

阿里云官方博客
15分钟前
2
0
jquery的选择器之-表单对象属性过滤选择器

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>表单对象属性过滤选择器</title><script type="text/javascript" src="jquery-1.7.2.js"></script><script......

architect刘源源
15分钟前
1
0
[报名中]云+开发者大会武汉站-漫谈数据平台与智能应用

| 导语 6月2日,武汉世茂希尔顿酒店,腾讯云邀您参加云+开发者大会(武汉站),与技术大咖们漫谈数据平台与智能应用,洞察数据,启迪智能。 大数据与人工智能时代,新的数据智能平台技术及其...

腾讯云开发者社区
19分钟前
3
0
Linux系统打开文件最大数量限制(进程打开的最大文件句柄数设置)

ulimit [-HSTabcdefilmnpqrstuvx [limit]] 利用ulimit命令可以对资源的可用性进行控制。 -H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。 硬限制(...

BryceLoski
20分钟前
1
0
C++写入utf-8带BOM文件

/** * 为了能让3ds max 的打包zip程序能够读取txt列表文件. * 必须要能写入utf-8带BOM的txt文件. * 关键代码是用wstring_convert把wstring转成string * 之前试过wfstream , 直接就没法写...

洛克人杰洛
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部