Python进阶学习和巩固
运算符和表达式
- 整除 //
- 乘方 **
- 按位与 &、按位或 |、按位取反 ~、按位异或 ^
- 布尔与 and、布尔或 or、布尔非not
控制流
- while语句可以配合一个else语句,如果while语句中有break语句,会跳出循环,不会执行else语句,例如:
while flag:
flag = False
else:
print "ok"
- for语句也可以配合else语句,python的for和c中的for有点区别,主要作用为从任意序列中遍历元素,如:
for i in range(1,5):
print(i)
else
print(i)
函数
- global语句用于声明变量为全局变量,如果在函数体内打算将一个全局变量改变,需要生命函数内变量为global,如:
x = 10
def setVar():
global x
x = 20
print(x)
- 默认参数的用法回顾:*para表示元组,**paras表示字典,例如:
def print_hi(x, y=10, *para, **paras):
print(x,y)
for par in para:
print(par)
for key,value in paras.items():
print(key,":",value)
- dir()函数可以返回对象的一些列标识符,如变量、函数等
- 程序包,装满模块的文件夹,第一目录下有一个__init__.py文件, 程序包内部又可以包含子程序包,当然其也包括__init__.py;
数据结构
- 常用数据结构有: list列表、tuple元组、dictionary字典、set集合
- 元组为(data),如果元组data只有一个元素,需要在第一个元素后添加,用以区分表达式;
- 字典使用键值对的方式存储数据,key需要使用不可变对象(如string),value没要求,其中key必须是唯一的,且字典内部不排序,例:dic = {“a”:1, “b”:2}
- 列表、元组、字典都是序列的一种,序列的切片操作可以在第三个参数指定步长,正常切片就是1,反向切片为-1,例如: lis[1:4:1]
- set集合是简单对象的无序集合,不在乎顺序,只在乎元素是否存在,如set = set(list),如果list中有重复的元素,set会只保留一个元素; 即元素具有互异性;
- 字符串也是一个对象,字符串是不能修改的,但是可以通过切片或者指向新的变量进行修改;
- format不仅可以用在字符串上,在其他情况下也可以使用,例如:str=“hello {0} {1}”.format(“hi”,“boby”)
面向对象
- 类的方法可以定义一个__init__函数,初始化对象时自动调用__init__函数,例如:
def Test:
def __init__(self, name):
self.name = name
def getName(self):
print(self.name)
Test('name').getName()
- 类中定义的成员变量(类变量),通过class名.变量或者self._class_.变量名来访问, 对象变量与类变量重名时,会将类变量屏蔽掉;
- 类中函数添加装饰器,@classmethod, 此函数只能访问类变量(cls.变量),无法通过self访问对象变量,并且这个函数在外部可以直接通过class.函数进行调用,不需要通过对象调用
- 类中的成员都是公开的,若要设置成私有变量,以_或者__开头定义变量;
- 继承,子类继承父类的函数和成员,如下例:
class Person:
def __init__(self, age, height):
self.age = age
self.height = height
def getdata(self):
print(self.age, self.height, end=' ')
class Student(Person):
def __init__(self, age, height, score):
Person.__init__(self, age, height)
self.score = score
def getdata(self):
Person.getdata(self)
print(self.height)
class Teacher(Person):
def __init__(self, age, height, salary):
Person.__init__(self, age, height)
self.salary = salary
def getdata(self):
Person.getdata(self)
print(self.salary)
stu = Student(18, 180, 100)
stu.getdata()
输入输出
- 输入通过input(…), 输出通过print()
- 文件读写操作,open打开文件并获取文件描述符f,write或writeline(s)写入, read或readline(s)(每次读取一行,当读到末尾时返回的数据长度为0)读取, 通过open时指定权限,包括r读取, w写入(清空文件再写入), a追加,t表示为文本文件,b表示为二进制文件,x也为写入(创建新文件,若文件已经存在写入会失败),操作完文件后需要close文件
- pickle为操作文件的模块,可以将任何简单的对象存储到文件中或取回,这个过程称为持久化存储对象,pickle操作文件的前提是以二进制形式打开文件,读文件为pick操作,写文件为dump操作
f = open('./data1', 'wb')
list1 = [1, 2, '3', 'hello']
pickle.dump(list1, f)
f.close()
f = open('./data1', 'rb')
list2 = pickle.load(f)
print(list2)
f.close()
- 异常处理, try…except…捕捉异常,except可以指定特殊的异常错误或者错误list,如果正常执行,会进入else语句
try:
input('input something')
except EOFError:
print('eof error')
except KeyboardInterrupt:
print('keyboard error')
else:
print("else")
- raise引发异常,raise抛出的异常应该是Exception类或其子类,在except中可以匹配抛出的异常并把异常的自定义数据打印出来,例如下面的代码,当输入字串长度小于3时会抛出异常并打印相关的信息:
class PersonException(Exception):
def __init__(self, length, standard):
self.length = length
self.standard = standard
try:
len = len(input('input something:'))
if len < 3:
raise PersonException(len, 3)
except EOFError:
print("EOFERROR")
except PersonException as ex:
print("ex.langth: {}, ex.stangard:{}".format(ex.length, ex.standard))
else:
print('ok')
- try…except…和finally配合使用时保证无论如何会执行finally的语句,例如在读写文件时可以在finally中确保文件被正确关闭, 与上一步中的else替换即可
- 频繁读写文件时,总是使用try…except…finally会使得代码比较冗余,可以使用with语句配合open函数,with语句会在代码块执行完后自动关闭文件,with在执行内部代码块前执行__enter__函数, 在执行完内部代码后,调用__exit__函数退出,例子如下:
with open('./number') as f:
for line in f:
print(line)
趣味知识点
- 传递元组,如a, b = func(), func函数return时返回元组即可,比如交换两个值: a, b = b, a
- 单语句块:语句块只有一句时,可以把两行放在一行
- 列表推导:从一个列表筛选出指定值的方式,原列表不变,例如:
list = [i*3 for i in range(10) if i%2==0]
- assert接一个语句表示假设语句为真,如果不为真会抛出Asserterror
标准库(updating)
- os.path.join(path1, path2,…), 连接文件路径,需要注意的是除了第一个参数外,后面的参数不能以反斜杠或者斜杠开头,否则得到的结果不符合预期
- logging模块处理调试信息
Numpy用法
ndarray
- 原理
ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。内存块以行顺序(C样式)或列顺序(FORTRAN或MatLab风格,即前述的F样式)来保存元素 - 创建和访问, 默认整形为int32, float为float64位,当初始化未指定dtype并且数据混杂时,默认dtype为float64
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
import numpy as np
a = np.array([1,2,3])
print (a)
- 常用属性
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列, ndarray.reshape更改数组的维度(reshape会返回非拷贝的副本数组,更改这个数组时,原数组的值也会改变,reshape和原数组用的是同一块内存)
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息 - nditer访问数组元素
#C按照行顺序,F按照列顺序
for x in np.nditer(a, order="C"):
print(x, end=" ,")
for x in np.nditer(a.T.copy(order="F")):
print(x, end=" ,")
nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 read-only 的模式。
for x in np.nditer(a, op_flags=["readwrite"]):
x *= 2
数组操作
- 展平 raval
- 翻转transpose或array.T
- numpy.squeeze 函数从给定数组的形状中删除一维的条目
python debug
- import pdb
- pdb.set_trace()会让程序停留在这一行
- 常用指令:c继续执行后面的代码; s跳到下一行,n也跳到下一行,但是s会跳到执行的函数内部, w显示上下文,a显示函数列表,直接输入变量名来打印变量,变量名=value打印一个新的值