《编写高质量代码 改善python程序的91个建议》第二章 基础语法 19-35

建议19:有节制使用from...import...

import    VS  from...import....

import  test                  ##  test 进入局部命令空间 + 进入系统模块字典中 sys.module[‘test‘];

from test  import  a      ##  a 进入局部命令空间  + test进入系统模块字典中(a 不在系统模块字典中);

## test_import.py
from a import add
from b import add

# 最后起作用的是最近一次导入的函数,即不同模块相同函数存在覆盖情况;

# 命令空间冲突

##----嵌套导入----from b import person # a.pyform a import info   # b.py

建议20:用absolute import 来导入模块 from app.sub1 import testmodule, 相对导入 import  .. import testmodule在python 3中被删除(容易造成混乱);

建议21:i +=1 不等于 ++i;    ++i 语法python 解析器当作 +(+1)来处理(永远等于+1,表示正数符号)并不是自增语法; --i: - (-1) 等于1 表示两个负号;

建议22:使用 with 关闭资源;

with open("path", "rw") as filehandle [, open("path_another", "r") as rhandle]    ## f.__enter__()  进入文件上下文,生成上下文管理器对象 = f    filehandle.read()    filehandle.write()    ...    ## f.__exit__()   离开上下文,上下文管理器对象做清理善后工作,比如关闭 handle;

## 另外,python 还提供了 contextlib 来专门管理上下文

建议23:使用 else 简化循环;

 for/while  expr1:
     do_sth()     break
 else:                ## expr1 为 False时,执行else; 当 break 时,expr1仍然为True,此时不执行else;
     do_else_sth()    ## 在遍历列表找值时,有用处;

建议24:异常处理基本原则

try:   statment          ##----不宜放入过多操作except <name1>:       ##--- 异常处理尽量精细, 子类异常先处理   statmentexcept <name2,name3>:  ## 异常提示要友好   statmentexcept:   statment    ## 其他异常统一处理, 各种可能性都有可能,此处异常说明要慎重 || 也可将异常 raise 抛给上层else:    statment    ## 没有异常finally:    statment    ## 不管是否有异常,依然会执行

建议25: 小心 finally 中的陷阱

情况1: 如果 异常没有被except处理,将会临时保存起来,执行finally后再抛出;但如果finally也抛异常或者有return 或 break时,临时异常会被丢弃或者覆盖;

# 情况2:try:
    if a <= 0:
        raise ValueError    else:        return a                 ## return a 之前先执行finally语句块,如果 finally 有return,那么该return a 失效    except ValueError:        print(a)    finally:        print("End")        reutrn -1;

建议26:深入理解 None, 正确判断对象为空

#### python 判断为空的情况汇总 ####

None     # 是一个常量,单例对象,类名 NoneType, 任何 None 都相等,固定id, id(None)False    # 常量0、0L、0.0 #等,任意0数值类型‘‘  ()  []  {} #空序列

即,空值有很多种,但 相互都不is相等(  [] is None  ==> False);

list1 = []
if list1:            ## 会调用 list1.__nonzero__方法来判断,返回 0/1 或者 True/False    print(list1)     ## 没有 __nonzero__ 方法,会调用 __len__ 方法 ,返回 0/1                     ## __nonzero__ 和 __len__ 都没有 ,返回 True

建议27:字符串连接优先考虑 join 而不是 +;

’‘.join(strlist)  (一次性加起来) 优优优于于于  result += strlist[i] (逐个加起来)

python 中的字符串是不可变对象; str1 + str2  每次都要申请一块新内存来存放结果;join 是一次性申请一块总大小地址,一次性存放;

建议28:格式化字符串优于使用format 而不是 %

##--------- % 格式化 -------------"%s" % "chaoren"  ## 单个参数直接格式化"%s %s %s" % ("Hello", "World", "chaoren")  ## 元组形式"%(key)s -- %(value)f" % dict1   ## 字典形式

##---------- format 格式化 -----------"xxx {0} xxx {2}, xxx {1}".format("hello", "world", "!!!")  ## 引用元组位置## 格式化规则百度

原文地址:https://www.cnblogs.com/alphabetax/p/11978598.html

时间: 2024-10-18 07:54:03

《编写高质量代码 改善python程序的91个建议》第二章 基础语法 19-35的相关文章

《编写高质量代码 改善python程序的91个建议》第二章 惯用法 8-18

建议8:调试语句assert expression, "sentence", python -O xx.py 可以禁用断言,建议少用断言: 建议9:数据交换不推荐使用中间值 语句执行时间: from timeit import Timer Timer('x,y = y,x').timeit() ## x,y = y,x 相当于元组(x,y)= (y,x) 涉及packing和unpacking def swap() x = 2 y = 3 x,y = y,x import disdis

编写高质量代码 改善Python程序的91个建议PDF版

链接:https://pan.baidu.com/s/1iGakOIFUaOW9q8ZI7_0QXw 原文地址:http://blog.51cto.com/13929572/2174547

编写高质量代码–改善python程序的建议(二)

原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现.其语法如下: assert expression1 ["," expression2] 其中expression1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression2是可选的,常用来传递具体的异常信息. 不

编写高质量代码改善python程序91个建议学习01

编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密 python定义 #python排序 def quicksort(arr): less=[];greater=[] if len(arr)<=1: return arr pivot=arr.pop() for x in arr: if x<=pivot: less

编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变

建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predicate<in T> 常用委托有: IComparer<in T> 下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { static void Main() { Programmer p = new Programmer { Name = "Mi

编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = from person in personList select new { PersonName = person.Name, CompanyName = person.CompanyID==0?"Micro":"Sun" }; foreach (var item in

编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果

建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型.匿名类型有var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 即支持简单类型也指出复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 匿名类型的属性是只读的,没有属性设置器,它一旦被初始化就不可更改. 如果两个匿名类型的属性值相同,那么就认为这两个匿名类型相等. 匿名类型可以再循环中用作初始化器. 匿名类型支持智能感知. 匿名

编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合

建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: ArrayList al=new ArrayList(); al.Add(0); al.Add(1); al.Add("mike"); foreach (var item in al) { Console.WriteLine(item); } 上面这段代码充分演

编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode

建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Person这个类型,编译器会提示这样一个信息: “重写 Object.Equals(object o)但不重写 Object.GetHashCode()” 如果重写Equals方法的时候不重写GetHashCode方法,在使用如FCL中的Dictionary类时,可能隐含一些潜在的Bug.还是针对上一