python学习一

python学习告一段落了,廖雪峰教程介绍的还是挺直白的,当然,小白如我,python代码还是不忍直视。而且代码这种东西,一段时间不用,就会生手,好记性不如烂笔头,所以总结下python的基础知识,日后也好拿出来看看,以免忘记,需要重新翻。

python基础

python数据类型: 整数、浮点数、字符串 布尔值、空值(None)、变量、常量

python3中字符串是以unicode编码的,即python支持多语言。可以用encode()为str指定bytes,将bytes转为str通过decode()方法。 计算字符数通过len()函数

list数组可变,aa[]。tuple元组,不可变,a()。但是你可以组合,元组元素中是数组,然后改变数组,这样就可变了。

判断语句if else,if elif else

input()读取用户输入

循环,for i in n:

dict字典,就是键值对,可以参考json,set是key集合,不能重复且有顺序。

python 函数

常用函数:

abs()//绝对值
pop()//尾部添加
max()//返回最大值
int()//轻质将数据类型为int类型
lower()//转成小写

自定义函数:

def myabs(x):
    if x>0:
       return x
    else:
       return -x

可以本文件内调用,也可以在其他py文件被引用import后调用。

高级特性

切片:L[0:3],截取第0到3个的数字组成数组

迭代:迭代dict,for ik,v in d.items():

生成器:要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:»> L = [x * x for x in range(10)]

L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] g = (x * x for x in range(10)) g

<generator object at 0x1022ef630>

可以用next()函数获得generator的下一个返回值

迭代器:直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable 可以使用isinstance()判断一个对象是否是Iterable对象

函数式编程

map():map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
reduce():把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
filter():过滤序列,把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
sorted():对list进行排序

返回函数:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。联想js里面的闭包

匿名函数:lambda x:x*x
关键字lambda表示匿名函数,冒号前面的x表示函数参数。 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果

装饰器:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
@log
def now():
    print('2015-3-25')   
    
>>> now()
call now():
2015-3-25    
    

偏函数:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

面向对象编程

类和实例:这个java里面也了解过,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板。 数据封装

访问限制:在属性的名称前加上两个下划线__,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。如果要获取的话,可以给类增加get_name和get_score方法,如果是需要容许外部代码修改的话,可以增加set_score方法

继承和多态:定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)

class Animal(object):
    def run(self):
        print('Animal is running...')
当我们需要编写Dog和Cat类时,就可以直接从Animal类继承:

class Dog(Animal):
    pass

class Cat(Animal):
    pass

任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态

Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象

type()获取对象类型 dir()函数获取对象属性和方法

使用__slots__:限制实例的属性

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

@property装饰器:负责把一个方法变成属性调用

class Student(object):
    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

多重继承:MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系:Python自带了TCPServer和UDPServer这两类网络服务,而要同时服务多个用户就必须使用多进程或多线程模型,这两种模型由ForkingMixIn和ThreadingMixIn提供。通过组合,我们就可以创造出合适的服务来。只允许单一继承的语言(如Java)不能使用MixIn的设计。

定制类:Python的class中还有许多这样有特殊用途的函数可以帮助我们定制类:str(),iter(),getitem(),getattr(),call()

@unique装饰器可以帮助我们检查保证没有重复值

枚举类:enum.

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
可以直接使用Month.Jan来引用一个常量,或者枚举它的所有成员
for name, member in Month.__members__.items():
    print(name, '=>', member, ',', member.value)
    value属性则是自动赋给成员的int常量,默认从1开始计数

元类:要创建一个class对象,type()函数依次传入3个参数:

class的名称; 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法; class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。 要控制类的创建行为,还可以使用metaclass

错误处理和调试:try except finally

断言:凡是用print()来辅助查看的地方,都可以用断言(assert)来替代。也可以把print()替换为logging,和assert比,logging不会抛出错误,而且可以输出到文件

也可以启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态

单元测试:编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行

if __name__ == '__main__':
    unittest.main()

文档测试:

def abs(n):
    '''
    Function to get absolute value of number.

    Example:

    >>> abs(1)
    1
    >>> abs(-1)
    1
    >>> abs(0)
    0
    '''
    return n if n >= 0 else (-n)

IO编程

文件读写:

f = open('/Users/michael/test.txt', 'r')//打开文件,读取二进制文件,比如图片、视频等等,用'rb'模式
f.read()//读文件内容
f.close()//关闭文件,一定要有,节省系统资源

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore)
>>> f.read()
'测试'

写文件:传入标识符’w’或者’wb’表示写文本文件或写二进制文件

>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
如果希望之前的内容不被覆盖,可以传入'a'以追加append模式写入