【Python编码规范】基础语法

本系列为《编写高质量代码-改善Python程序的91个建议》的读书笔记。

温馨提醒:在阅读本书之前,强烈建议先仔细阅读:PEP规范,增强代码的可阅读性,配合优雅的pycharm编辑器(开启pep8检查)写出规范代码,是Python入门的第一步。

Python 基础语法,即Python程序的基本要素,分为:

  • 基本数据类型:数字、字符串、列表、字典、集合、元组等;
  • 常见的语法:条件、循环、函数、列表解析等。

建议19:有节制地使用from…import语句

Python提供了3种方式引入外部模块:import语句,from...import...__import__函数。

__import__函数可以显式地将模块名称作为字符串传递并赋值给命名空间的变量。

  • 在使用import时需要注意以下事项:

1)一般尽量优先使用import a形式,如果访问B时需要使用a.B的形式;
2)有节制地使用from a import B形式,可以直接访问B
3)尽量避免使用from a import *,减少污染命名空间。

Pythonimport机制:Python在初始化运行环境的时候会预先加载一批内建模块到内存中,其相关信息被存放在sys.modules中。

  • from a import ...无节制的使用产生的问题:

1)命名空间的冲突;

文件a.py

def add():
	print "add in module A."

文件b.py

def add():
	print "add in module B."

测试文件importtest.py

from a import add
from b import add


if __name__ == '__main__':
	add()

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

  • 可以考虑from...import的情况:

1)当只需要导入部分属性或方法时;
2)模块中的这些属性和方法访问频率较高导致使用“模块名.名称”的形式进行访问过于烦琐时;
3)模块的文档明确说明需要使用from...import形式,导入的是一个包下面的子模块,且使用from...import形式能够更为简单和便捷时。

建议20:优先使用absolute import来导入模块

Python2.4以前默认为隐式的relative import,局部范围的模块将覆盖同名的全局范围的模块。Python2.5后虽然默认的仍是relative import,但它为absolute import提供了一种新的机制,在模块中使用from __future__ import absolute_import语句进行说明后再进行导入。同时还通过点号**.**提供了一种显式进行relative import的方法。

相比于absolute importrelative import在实际应用中反馈的问题较多(Python3中已移除),absolute import的可读性和出现问题后的可跟踪性更好,因此,推荐优先使用absolute import

建议21:i+=1不等于++i

Python解释器会将++i操作解释为+(+i),其中+表示正数符号。对于--i也是类似。

  • 实例一
>>> i=1
>>> ++i
1
  • 实例二:无限循环
i = 0
ls = [1, 2, 3, 4, 5, 6]
while i < len(ls):
	print ls[0]
	++i

建议22:使用with自动关闭资源

  • with 语句的语法:
with 表达式 [as 目标]:
	代码块
  • 包含with语句的代码块执行过程如下:

1)计算表达式的值,返回一个上下文管理器对象;
2)加载上下文管理器对象的__exit__()方法以备后用;
3)调用上下文管理器对象的__enter__()方法;
4)若with语句中设置了目标对象,则将__enter__()方法的返回值赋值给目标对象;
5)执行with中的代码块;
6)若步骤5)中的代码正常结束,调用上下文管理器对象的__exit__()方法,其返回值直接忽略;
7)若步骤5)中的代码执行过程中发生异常,调用上下文管理器对象的__exit__()方法,并将异常类型,值及traceback信息作为参数传递给__exit__()方法。若__exit__()的返回值为false,则异常会被重新抛出;若__exit__()的返回值为true,则异常会被挂起,程序继续执行。

建议23:使用else子句简化循环(异常处理)

def is_prime(number):
    """
​
    :param number:
    :return:
    """for i in xrange(2, number):
        for j in xrange(2, i):
            if i % j == 0:
                break
        else:
            print '{0} is a prime number.'.format(i)

当循环“自然”终结(循环条件为假)时else从句会被执行一次;当循环是由break语句得到中断时,else子句就不被执行。

建议24:遵循异常处理的几点原则

Python中常用的异常处理语法是:tryexceptelsefinally,可以有多种组合。

  • 异常处理流程图如下:

异常处理流程图

  • 异常处理遵循的基本原则:

1)注意异常的粒度,不推荐在try中放入过多的代码;
2)谨慎使用单独的except语句处理所有异常,最好能定位具体的异常;
3)注意异常捕捉的顺序,在合适的层次处理异常;向上层传递的时候需要警惕异常被丢失的情况,可以使用不带参数的raise来传递;
4)使用更为友好的异常信息,遵循异常参数的规范。

建议25:避免finally中可能发生的陷阱

无论try语句中是否有异常抛出,finally语句总会被执行。

# -*-coding:UTF-8 -*-def test(a):
    try:
        if a <= 0:
            raise ValueError("data can not be negative.")
        else:
            return a
    except ValueError as ex:
        print ex
    finally:
        print "The end!"
        return -1print test(0)
print test(2)

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

Python中以下数据会被当作空处理:

  • 常量None
  • 常量False
  • 任何形式的数值类型零,如00L0.00j
  • 空的序列,如‘’()[]
  • 空字典,如{}
  • 当用户定义的类中定义了nonzero()方法和len()方法,并且该方法返回整数0或者布尔值False

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

>>> id(None)
140735411631784
>>> None == 0
False
>>> None == ""
False
>>> a = None
>>> id(a)
140735411631784
>>> b = None
>>> a == b   # 所有赋值为`None`的变量都相等
True
  • 实例:列表判空
ls = []
if ls is not None:
	print "ls is: ", ls
esle:
	print "ls is None"
  • 以上程序运行输出为:ls is: [],显然不是我们的预期结果。应修正为:
ls = []
if ls:
	print "ls is: ", ls
esle:
	print "ls is None"

建议27:连接字符串优先使用join而不是+

1)使用操作符+连接字符串的方法

>>> str1, str2, str3 = "testing ", "string ", "concatenation "
>>> str1 + str2 + str3
'testing string concatenation '

2)使用join方法连接字符串的方法

>>> ''.join([str1, str2, str3])
'testing string concatenation '
  • 性能测试函数
# -*-coding:UTF-8 -*-import timeit
​
str_list = ["It is a long value string will not keep in memory "
            for n in xrange(10000)]
​
​
def join_test():
    return ''.join(str_list)
​
​
def plus_test():
    res = ''
    for i, v in enumerate(str_list):
        res += v
​
    return res
​
​
if __name__ == '__main__':
​
    join_timer = timeit.Timer("join_test()", "from __main__ import join_test")
    print join_timer.timeit(number=10)    # 0.00255298614502    
    print join_timer.timeit(number=100000)    # 13.4903669357

    
    plus_timer = timeit.Timer("plus_test()", "from __main__ import plus_test")
    pr
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python基础100练习题是入门Python编程语言的一种有效方法。这些练习题包括各种不同方面的试题,包括数据类型、控制流、函数、循环结构、列表和字符串等。这些练习题适合初学者和有经验的程序员,可帮助提高你的Python编程技能。 在练习这些试题时,可以通过遵循一些基本规则来帮助你进步。首先,应建立良好的编码习惯,例如遵守PEP 8规范Python编码规范)。其次,应该尝试编写清晰、易于理解的代码,这能提高计算机程序可读性和维护性。第三,应该关注代码的整洁度,尽可能避免不必要的重复或冗余。 对于初学者来说,Python基础100练习题还是非常有用的,因为这样可以帮助他们掌握在Python编程过程中最常见的任务和问题,使他们更加熟练掌握编程的基本技能。对于有经验的程序员来说,这些练习题还可以帮助他们深入了解一些高级技术和异常处理方法等。练习这些试题也是一种很好的建立自己的代码库的方法,它可以让你随时拿出你先前编写过了的代码,并继续优化和改进它。 总之,Python基础100练习题可以帮助初学者或有经验的程序员提高Python编程技能和实践。这些试题是Python编程任务的好例子,能够帮助你更好地理解Python编程语言,并提升你的编程技巧。 ### 回答2: Python基础100练习题包括了Python语法的一些基础知识,例如变量、数据类型、条件语句、循环语句、函数等。它们是初学者学习Python编程的入门知识。 这些练习题涉及的内容非常广泛,对于初学者来说非常有趣且有挑战性。通过练习这些题目,可以加深对Python语法的理解,熟悉Python编程环境 和常用的编程工具,如代码编辑器、交互式解释器、调试工具等。 在Python基础100练习题中,有很多实用的练习题,例如带参数的函数、列表和字典的操作、字符串的处理、文件的读写等。这些练习题的目的是为了让初学者掌握最重要的Python编程技能,从而能够开始编写一些实用的脚本和程序。 当你完成这些练习题时,你也会学习到一些Python编程的最佳实践,例如如何编写可维护的软件、如何处理异常、如何进行单元测试等。这些都是在Python编程中非常重要的技能。 总之,Python基础100练习题非常有价值,可以帮助初学者掌握Python编程的基础知识和技能。如果你想成为一名Python开发人员,那么这些练习题就是一个重要的开始。 ### 回答3: Python基础100练习题包括了许多涵盖Python基础知识的练习题,对于初学者来说是一个很好的入门练习。在这些练习题中,我们需要了解Python的基本语法,例如变量、条件语句、循环语句、函数、列表等。 在解决Python基础100练习题时,我们需要仔细阅读题目描述,理解题目的要求。有些问题需要我们使用简单的数学计算,有些问题需要我们使用条件语句来实现,有些问题需要我们使用循环语句来完成。在解决问题时,我们可以利用Python自带的函数及库,例如random、math等。 总之,在练习中,我们需要不断提高自己的思考能力和编程技巧,通过解决问题来提高自己的编程水平,掌握基础的编程知识,让我们的程序写的更加优雅、高效。同时,我们也能够在这个过程中感受到编程的乐趣,为我们日后的学习和工作打下良好的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值