0%

Python编程从入门到实践项目

Alien Invasion(外星人入侵项目)

  • 在for循环中,不应该从列表或编组中删除条目,因此最好是遍历副本的方式.如果直接对列表做删除条目,那么代码如下所示,

    1
    2
    3
    4
    5
    6
    numbers = [1, 2, 2, 3]
    for n in numbers:
    if n == 2:
    numbers.remove(n)
    print(numbers)
    # 结果为[1,2,3]
阅读全文 »

Modules and Packages

Modules

模块化和包机制是Python管理复杂性的核心手段,也是代码复用的基础.每个源文件都是一个模块,import用于加载并执行一个模块.我们在到如模块的同时也到入了其定义的命名空间.

1
2
3
4
import foo
foo.grok()
# 相当于如下的调用方式
foo.__dict__['grok']()
阅读全文 »

Iterators,Generators and Coroutines

Iterator

迭代定义经常发生在循环遍历项的时候发生调用,代码如下所示,

1
2
3
a=[2,4,10,37,62]
for x in a:
print(x)

这是一个十分常见的代码编程模式,常见于循环,列表推导式等.他的迭代语法原型为

1
2
for x in obj:
# statements
阅读全文 »

MetaProgramming

Decorators

在编写程序中存在大量代码重复的问题,其在编写过程会十分枯燥无聊,并且后续难以维护.元编程涉及编写操作其他代码的代码问题.其相应的应用示例为宏(Marco),包装器(wrapper),切面(aspect).因此其本质上是对代码进行操作.元编程的核心动力是DRY原则(Don't Repeat Yourself). 当发现存在大量代码结构类似的情况,则可以用元编程.与C/C++的宏在编译前处理文本,Python的元编程是在运行的时候操作对象(func,class).其会更加的灵活,更加的动态.装饰器是一个创建另一个函数包装器的函数.包装器则是一个全新的函数,但是他的工作原理和原有函数是完全相同的,接受相同的函数参数可以返回相同的返回值,但是可以增加一些额外的操作.装饰器本质上是接受函数作为参数并返回新函数的高阶函数.理想的装饰器应该是对被装饰器的调用者是透明的,也就是即使换成被装饰了的函数,其调用和返回也不应该导致代码出错.而额外的输出则是由包装器函数实现,但仍然依靠原始函数获得结果

阅读全文 »

Working with Code

Variable Arguments

函数参数表示函数可以操作传入的参数,其中的基本传入方式有如下两种:

1
2
func(1,2,3) # 位置参数
func(x=1,y=2,z=3) # 关键字参数

我们可以混合使用这两种参数传入风格,但是位置参数必须始终在关键字参数前面传入,而且需要遵守每个参数都必须有且仅有一个值,如

1
2
3
def fun(x,*args):
pass
func(1,x=1) # 这会报错

混合使用参数风格增加了调用的灵活性,尤其是当函数参数比较多的时候,关键字参数能够提高代码的可读性.

阅读全文 »

Functions

Function Arguments

函数是程序的基本构建单元,如模块的顶层函数,类的方法.程序的几乎所有代码应该封装在函数中.Python函数的设计原则,我们希望函数是自包含的(self-contained),仅操作输入的参数.

阅读全文 »

Inside Python Objects

Underlying dictionary

字典是命名化值的集合,用户自定义的对象的底层使用字典,如实例数据和类成员.换言之,整个对象系统的底层是基于字典.实例的__dict__字典属性会用于存储实例数据,在创建实例属性并赋值的时候,实际上就是对__dict__字典的元素填充.并且不同实例的__dict__字典属性是私用的,并不会互通共享.换言之,其实就是如果程序中创建了100个实例,那么也会有100个不同的实例字典.与实例的__dict__字典不同的是,类也是存在__dict__字典属性的,其是用于存储类成员.类和对象在逻辑上是具有很强的联系的,也就是实例是类的可操作对象,类提供了实例的数据属性和操作行为.实例的__class__属性返回的是其实例化的类,因此可以从实例反连接到类.

阅读全文 »

Classes and Objects

Objects

面向对象编程其实就像是基于行为的自下而上的建模.一个对象则会包含一些内部状态和一些对内部状态的操作.因此,对于一个对象而言,其中包含的数据和行为是密不可分的,数据是对象的属性,而行为则是体现了对象的特性.

阅读全文 »

Python Review

在之前Practical Python系列笔记中,我们只是简要介绍了一下数值型变量的运算符,在此我们介绍一下数值型变量的常用方法:

  1. 浮点数的分数表示:as_integer_ratio

    1
    2
    3
    x.as_integer_ratio()
    a, b = x.as_integer_ratio()
    print(a / b) # 可还原为原始浮点数

    其返回一个二元组(p,q),表示该浮点数的精确有理数表示x=p/q.

    阅读全文 »

本笔记完全基于David Beazley的Python教程-Practical Python.

Packages

任意一个python文件就是一个模块,这里的模块解决的是代码复用与命名空间隔离.

1
2
3
4
5
6
7
8
# foo.py
def grok(x):
pass
def spam(x):
pass
# main.py
import foo
foo.grok(2)

但是在大型程序中,具有大量的模块文件,如果仍然通过模块管理代码,会使得主程序被大量的模块文件隐藏,因此对于大量代码组织架构的程序中,包代替模块成为管理代码的好方式.

阅读全文 »