变量和简单数据
1.输出方式
Python 2 和 Python 3 的输出方式不一样
2.变量的输出方式
print('''line1
. . . line2
. . . line3''')
print(r"stringline")
3.变量的命名和使用
4.字符串
5.数字:
6.注释 :在文字前面加#
7.布尔值:可以用 and 、or 和 not运算
8.空值(None):None ≠ 0
列表和元组
1.list
2.tuple:tuple的元素不可变
3.dict:键-值(key-value)排序是不确定的
4.set:不存储value,且key不能重复
5.条件判断
if . . . elif . . . else . . .
其中一个条件为真时,不会继续往下进行判断
6.循环:(注意不必要的缩进)
7.切片:
8.生成器:g = (x*x for x in range(10))
一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator,每次在调用next()的时候执行,遇到yield语句返回,在执行时从上次返回的yield语句处继续执行。
9.迭代器:
函数
1.定义函数:
>>> def my_abs(x):
... if x >= 0:
... return x
... else:
... return -x
...
>>> my_abs(-9)
9
>>> _
2.函数返回值:位置对应
3.传递参数:
4.递归函数:(注意跳出条件,防止无休止递归,逻辑清晰,但过深的调用会导致栈溢出)
5.高阶函数
6.返回函数:函数作为返回值
7.匿名函数:关键字lamba 例:list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))
8.装饰器: 在代码运行期间动态增加功能的方式
def log(func):
def wrapper(*args,**kw):
print('call %s():'%func.__name__)
return func(*args,**kw)
return wrapper
@ log
def now():
print('hello')
传递参数:
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():
print('hello')
9.偏函数:通过设定参数的默认值,降低函数调用的难度 例:int2 = functools.partial(int,base = 2) 要导入functools
类
1.创建类:所有类最终都会继承object类
class People(object):
def __init__(self,name,score):
self.name = name
self.score = score
有了__init__方法,在创建实例的时候,就不能传入空的参数
2.访问限制:通过方法来修改属性的值,同时可把变量名改为__xxx (private)来限制通过外部访问,不同的解释器通过外部访问私有变量时,会变成不一样的名称
3.继承和多态:静态语言 vs 动态语言
4.获取对象信息:
>>> import types
>>> def fn():
. . . pass
. . .
>>> type(fn) == types.FunctionType
5.面向对象高级编程
使用__slots__:
class Student(object):
__slots__ = ('name' , 'age') # 用tuple定义允许绑定的属性名称
则 Student 只有属性 name , age
使用@property:负责把一个方法变成属性调用
class Student(object):
@property
def score(self):
return self.__socre
@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.__socre = value
6.枚举类:
from enum import Enum
Month = Enum('Month' , ('Jan' ,'Feb' , 'Mar' , 'Apr' , ...))
调用:
for name , member in Month.__members__.items():
pass
更精确地控制枚举类型:
unique
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0
Mon = 1
...
7.元类:metaclass 控制类的创建行为
通常,metaclass的类名总是以Metaclass结尾
# metaclass是类的模板,所以必须从`type`类型派生
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
有了ListMetaclass ,我们在定义类的时候还有指示使用ListMetaclass来定制类,传入关机中产生metaclass
class MyList(list, metaclass=ListMetaclass):
pass
那么MyList 的对象就有 add 方法,而普通的list没有add 方法
8.导入类
文件和异常
1.文件读写
读文件
route= ‘/file/test.txt’
f = open(route,'r') #用读的方式打开文件
f.read()
...
f.close()
with open(route,'r') as f:
f.read() #一次性读取所有内容
with open(route,'r') as f:
for line in f:
print(line)
lines = f.readlines()
for line in lines:
print(line)
f = open(route,'rb')
f = open(route,'r',encoding = 'gbk')
写文件
with open(route,'w') as f:
f.write('hello')
with open(route,'w') as f:
f.write('hello')
f.write(' world')
with open(route,'a') as f:
f.write('hello)
3.异常处理
try . . . except . . .
ZeroDivisionError:文件内容为空
FileNotFoundError:未找到文件
4.StringIO 和 BytesIO
StringIO :在内存中读写str
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
... s = f.readline()
... if s == '':
... break
... print(s.strip())
...
Hello!
Hi!
Goodbye!
BytesIO :实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
4.操作文件和目录
import os
os.name #操作系统类型
os.environ #环境变量
os.path.abspath('.') #查看当前目录的绝对路径
os.path.join('/Users','test') #在某个目录下创建一个新目录,先把新目录的完整路径表示出来 (把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()
函数,这样可以正确处理不同操作系统的路径分隔符)
os.mkdir('/User/test') #然后创建一个目录
os.rmdir('/User/test') #删掉一个目录
os.path.split() #拆分路径 (同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()
函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名)
os.rename('test.txt','test.py') #重命名
os.remove('test.py') #删除文件
5.序列化:从内存中编程可存储或传输的过程称之为序列化
pickle.dump(value,filename)
pickle.load(pickle_str)
json.dumps(value,filename)
json.loads(json_str)
对类进行序列化,会抛异常,因为类对应的对象不是一个可序列化的JSON对象,只需为类专门写一个转换函数,在把函数传进去即可。
def function_name(std):
return {
'attr1': std.attr1
'attr2':std.attr2
. . .
}
json.dumps(class_object, default = function_name)
测试
1.单元测试
(1)import unittest
(2)类继承自unittest.TestCase,以test开头为测试方法
(3)通过断言进行判断
(4)通过 unittest.main() 运行单元测试
SetUp 与 tearDown
两个方法分别在每调用一个测试方法的前后分别被执行,setup()方法中连接数据库,在teardown()方法中关闭数据库
2.文档测试
在注释中严格按照Python交互命令行的输入和输出来编写注释,doctest进行判断测试结果是否正确,异常时可以用...表示中间一大段烦人的输出。导入doctest模块,并调用doctest.testmod()运行测试