Python查缺补漏

 Python
 

python语法非常灵活,其宗旨在与指导程序员快速开发,所以,只有想不到,没有它做不到的。最近偶然看见博客园一位大神Vamei的博客,当时就感觉相见他的博客恨晚,因为他的文字幽默,流畅,有深度,从设计的角度剖析技术,把死板板的技术写得非常有文艺范。做一个科技的文艺范是我读大学以来明确自己的一个终极目标,看到Vamei的博文,我瞬间感觉到这就是我想要的状态,一个科技的文艺范。Vamei是一个非常努力的人,兴趣跟我惊人的相似,他是大神,读书无数,而我现在屌丝,所以,必须向他看齐,并超越。他写了诸多教程,精辟流畅,比太多所谓的教程个人感觉要好几十倍。以前就学过python,但都是浅于表面,没有深度。现在看过Vamei写的教程,觉得有些知识点自己还是很模糊。所以,决心还是把那些知识点记录下来,免得以后又要重新回过头再查阅,浪费时间。站在巨人的肩膀上学习,不过我会从自己的角度剖析这些知识点,加深印象。

1、print 很灵活,打印多个对象没问题

>>> a = 1.4
>>> print a, type(a)
1.4 <type 'float'>

2、序列分为两种:tuple和list

它们所存的对象灵活,如:

s1 = (1, 2.3, 'love', true)  
s2 = [false, 3.4, 'you']

tuple所存的各个对象可变,而list不可变。 字符串是一种tuple。
对象的引用方式非常灵活,记住这一种方式——切片:
基本样式:[下限:上限:步长]

3、运算符

数学:+ - * \
判断:== < > <= >= != in(表某个对象在某个序列中)
逻辑:and or not

4、字典:由键和值组成

键和值可以是任意对象,且一一对应。词典中的对象没有顺序,所以不能通过下标来引用词典中的对象。与可变对象列表不同,词典中的对象无重复。

>>> c = {'h':1, 'y':2, 'ki':4.5}
>>> c['h'] = 1
>>> c 
{'y': 2, 'h': 1, 'ki': 4.5}  

5、文件对象

创建文件对象:f = open(文件名,模式(常用 ‘w’、’r’))
文件对象的方法:

flist = f.read(N) #读取N bytes的数据
flist = f.readline() #读取一行  
flist = f.readlines() #读取所有行

6、模块的导入

python之所以被称为胶水语言,就是因为模块化的设计机制,可以导入用其他语言写的模块到python运行环境中,当然这种情况使用的比较少,大多是一些大型的应用程序才会应用到。关于模块,更多的是python自身的模块导入。

import a as b             # 引入模块a,并将模块a重命名为b

from a import function1   # 从模块a中引入function1对象。调用a中对象时,我们不用再说明模块,即直接使用function1,而不是a.function1。

from a import *           # 从模块a中引入所有对象。调用a中对象时,我们不用再说明模块,即直接使用对象,而不是a.对象。

7、参数传递

在python中,除了和其他语言共有的几种参数传递(如关键字参数、默认参数等)之外,还多了一种新的方式,这种方式来源于python中视一切皆为对象的特性。有时我们想要传递多个对象,为了减少代码的重复率,增强灵活性,就需要将多个对象合并成一个对象,比如,可以是序列,可以是字典等结构。这个合并参数的过程,换个说法就是对参数打包,即包裹参数传递。 这里要注意,规定如果传递的是元组,则函数的参数需要加*,如果传递的是字典,则加**。和包裹对应的解包裹,并不是包裹的反义,而是两个相互独立的过程,包裹对应定义参数时,而解包裹对应调用函数时。如下:

# -*-coding:utf-8 -*-

#包裹传递
def func(*args):  # 对象是元组
    print type(args)
    print args
func(1,2,3)
b = (1,2,3)
func(b)

def func1(**args):  # 对象是字典
    print type(args)
    print args
func1(d=1, e=2)

#解包裹
def func2(a,b,c):
    print a, b, c
args = (1,2,3)
func2(*args)
dic = {'a':1, 'b':2, 'c':3}
func2(**dic)

8、实用的循环设计

range(): for i in range(n)
enumerate(): for (index, value) in enumerate(n) 得到(下标,值)的元组
zip():对于多个等长的序列,如果在每次循环时都要取每个序列中的一个,则用zip快速方便。

ta = [1,2,3]
tb = [9,8,7]
tc = ['a','b','c']
for (a,b,c) in zip(ta,tb,tc):
    print(a,b,c)  

9、函数对象

python中一切皆可以看成是对象,函数有时候也看成是对象进行相应的操作,比如将函数作为参数传递给另一个函数。其中,有三个函数被定义成全局函数来使用,map()、filter()、reduce()。map、reduce功能有些类似大数据计算中用的map_reduce。这三个函数就接受一个函数对象作为参数。我们为了方便,常常用lambda函数来生成函数对象。lambda函数是一个匿名函数,如果有时候纠结与不知道为函数取什么名字,同时函数需要实现的功能又比较简单时,用lambda函数是最合适的。下面的例子举一反三。

filter(lambda x: x % 2 == 0, [1,2,3,4,5]) #过滤列表中\2不为0的数  
map(lambda x: x + 2, [1,2,3,4,5]) #列表中每一项分别加2  
reduce(lambda x, y: x + y, [1,2,3,4,5]) #列表中两项相加和再和第三项相加,依次下去。  

10、python中不支持的类型

char和byte,可以用长度为1的字符串来表示
指针:python中有个类似指针的东西,就是对象的身份标识id(),其实在python中一切皆为指针。
int short 和long,python中有标准整形Integer,当需要长整型时,python会自动返回长整型,非常灵活。
float和double,python中float实际上就是双精度浮点型,没有单精度浮点型。当需要更高的精度时,可以使用python中的十进制浮点型类型Decimal,这是一个外部模块,拥有任意的精度,足够用户任意精度的要求使用了。