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
可以用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模式写入