1.变量、数据类型与基本语法
变量命名:可以是数字字母下划线,但不可以以数字开头。 数字类型:int,bool,float,complex。 除法:/表示除数,//表示除数向下取整。 海象运算符:’:=‘,运用在()内可防止赋值表达式调用多次。 身份运算符:is:判断两个标识符是不是引用自一个对象;is not:判断两个标识符是不是引自不同对象。 成员运算符:in:判断是否在指定序列;not in:判断是否不在制定序列。 逻辑运算符:and,or,not。 字符串: 1. 双引号或者单引号括起来的。 2. 方法:.title()—首字母大写;.upper()—全大写;.lower()—全小写;.rstrip()—返回后面没有空格的字符串;.lstrip()—返回前面没有空格的字符串;.strip()—返回前后没有空格的字符串;.split()—以空格为分隔符将字符串拆分成多个部分,并返回该列表。 3. 合并:+。 4. 重复:*。 5. 转换形式:str()。 6. 转义符:\,当字符串前用r表示反斜杠不发生转义。 7. 字符串不可以发生改变。 8. 字符串截取:变量[头下标:尾下标:步长]。 注释:#。 乘方运算:**。 求模运算:%,两数相除返回余数。 文档字符串:’’‘文档字符串’’’,也就是多行注释。 函数可以返回:None。 重构:将代码划分为一系列完成具体工作的函数。 行与缩减:不需要大括号,缩进表示代码块。 多行语句:语句很长可以使用反斜杠\实现多行语句,在()[]{}中的多行语句不需要反斜杠。 可以在同一行中使用多条语句,用;分割。 允许多个变量赋值。 标准数据类型: 1. 不可变数据:Number,String,Tuple(与列表类似,但是元素不可更改)。 2. 可变数据:List,Dictionary,Set。 3. 类型转换:
2.列表
存放一系列特定顺序的元素,用[]表示,每个元素用’,'分隔,知道顺序后就可以访问对应访问对应位置的元素(正向从0开始;反向第一个是-1,注意当列表为空时访问-1出错)。 方法:.append()—在末尾添加元素;.insert(a,’’)—在a处插入元素;.pop(b)—删除b元素,默认删除最后的元素;.remove()—按值删除第一个该值元素;.sort()—永久按字母顺序排列,当传递参数reverse=True时按与字母顺序相反的顺序排列列表元素;.sorted()—不影响原始排列顺序,返回特定排序(也可以传参);.reverse()—永久反转元素排列顺序。 语句:del a[b]—删除a列表的第b个元素。 函数: 1. len()—快速获取列表长度; 2. min()—数字列表找出最小值; 3. max()—数字列表找出最大值; 4. sum()—数字列表求和; 5. range(a,b,c)—生成一系列数字,a到b-1且步长为c,没有c时默认为1,当for循环中的A为range(a,b)时产生a~b-1的数字,当作为list()参数时,产生对应的列表。 列表解析:A=[a*2 for a in range(1,10)]—产生一个2,4,8…20的名为A的数字列表。 列表切片:A[a:b]—从a到b-1切片,可以为负从后开始数,没有时a默认0,b默认最后;遍历过程中也可以使用切片,仅访问切片内元素。 复制列表:可以创建一个没有a、b的切片(即包含全部的列表元素),赋值给新列表;直接赋值是两个变量指向同一个列表。 元组:不可变的列表称为元组。 1. 使用圆括号标识A()。 2. 可以用索引或者循环访问。 3. 不能向元组的元素赋值。 4. 可以向存储元组的变量赋值。
3.操作
遍历: 1. for循环: ‘for a in A:’ ,此后的循环体统一缩进即可。 2. while循环:‘while C:’ ,此后的循环体统一缩进即可。 3. break与continue与C语言里一样。 4. 一般在for循环中访问而不修改,而移动、删除、填充等操作在while循环中进行。 判断: 1. 条件测试: 1. 检查相等时区分大小写(可以转换为小写后比较)。 2. 与—and;或—or;包含—in;不包含—not in。 3. 检查列表是否为空,直接用列表变量即可。 4. 格式:两边加一个空格。 2. if语句:if A : 3. if-else语句: if A : else: 4. if-elif-else语句:if A : elif B: else:
4.字典
用放在{}中的一系列键-值对表示,每一个键都与一个值相关联,每个字典里可以包含任意数量的键-值对,键-值对间用’:’,每个键-值对间用’,'分隔。 获取与键相关联的值,可以A[b],其中A为字典名,b为键(eg:b=‘point’)。 添加键-值对:A[‘C’]=K即可,字典不关心存储顺序但是关心键-值对间的关联关系。 创建空字典:A={}。 修改字典中的值:A[‘b’]=new。 删除键-值对:del A[‘b’],将删除键和与之相关联的值。 遍历字典: 1. 遍历字典的所有键-值对:方法:.items()—返回一个键-值对列表(可能与存储顺序不同)。 格式:for a,b in A.items(): 。 2. 遍历字典的键:1.方法:.keys()—返回所有键的列表。 2.格式:for a in A.keys() 或者for a in A: ,因为默认遍历所有的键。 3.按顺序遍历字典中的所有键:使用函数sorted()来获得按特定顺序排列的键列表的副本。 格式:for a in sorted(A.keys()): 3. 遍历字典的值:方法:.values()—返回字典中的全部值的列表,因为是列表所以可以重复,可以采用函数:set()—集合,类似于列表,但是每个元素都是独一无二的。 格式:for a in A.values(): 或者for a in set(A.values()): 。 嵌套:可以将字典嵌套在列表中,也可以字典嵌套在字典中,也可以将列表嵌套在字典中(此时字典中一个键可以关联到多个值)。 eg:A={‘c’:‘k’,‘b’:[‘d’,‘e’,‘f’]}。
5.用户输入
函数input(a)—程序的等待用户输入,可以接受一个参数a作为给用户的输入提示,也可以没有参数,返回一个字符串。 函数int(a)—将数字的字符串表示转换为数值表示。 注意在python2.7中用raw_input(),input()将用户输入解读为python代码并尝试运行。
6.函数
函数的定义:def f(): 函数体 函数调用:指定函数名及括号括起的必要信息。 传递实参: 1. 位置实参:基于实参的顺序。 2. 关键字实参:传递给函数名称-值对,将值与名称关联起来,向函数传递实参时不会混淆。 3. 列表:在传递列表后,函数可以对它进行修改,在函数中对这个列表所做的任何修改都是永久性的;反之为避免修改可以向函数传递列表的切片,利用切片表示法创建列表的副本。 4. 字典:使用任意数量的关键字实参,将函数编写成可以接受任意数量的键-值对,即传入字典格式:def f(a,b,**c):,其中c就是字典 5. 默认值:编写函数时可以给每个形参指定默认值,但在形参列表中必须先列出没有默认值的形参,在列出有默认值的实参;当默认值是类似空字符串时,相当于实参变为可选的;一般来说指定默认值时等号两边不应该有空格。 6. 传递任意数量的实参:会创建一个新元组,将收到的所有值封装到元组中。格式:def f(*tap): ,调用格式:f(a,c,b)/f(a);在函数中可以通过for循环进行遍历。将定义接纳任意数量实参的形参放在最后。 返回值:在函数中,可以用return语句将值返回到调用函数的代码行。 1. 返回简单值。 2. 返回字典。 可以将函数存储在模块中;在需要的程序中进行导入,并且import语句应该放在开头: 1. 导入整个模块:格式:import 模块名称 。调用格式:模块名称.函数名称()。 2. 导入模块中的特定函数:格式:from 模块名称 import 函数名称 。调用格式:函数名称()。 3. 使用as给函数指定别名:太长或者为了避免冲突时。格式:form 模块名称 import 函数名称 as 别称。调用格式:别称()。 4. 使用as给模块指定别名:格式:import 模块名称 as 别称。 5. 导入模块中的所有函数:不建议,因为可能名称相同,会覆盖函数。格式:form 模块名称 import * 。
7.类
类几乎可以模拟任何东西,一般类首字母大写,类中的函数称为方法,self为前缀的、可以通过实例访问的变量称为属性。 创建类:
class A():
def '下划线'init'下划线'(self,a):
self.a=a
def b():
函数体
init方法在创建类的实例时自动运行,并未显示地包含return语句但是会返回一个实例,其中的实参self会自动传入,并将self实参传递给每个方法,以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例访问这些变量,因此创建实例时无需传入self。特别的可以在init内为属性指定默认值。 属性还可以是另一个类的实例,该实例和其他实例相同,除了在访问其时前面需要指明包含其的类的实例和’.’。 创建实例:自动调用init函数,需提供需要的参数。格式:a=A(aa) 。 1. 创建实例后可以访问属性:a.a。 2. 调用方法:a.b()。 修改属性值: 1. 直接修改实例的属性。 2. 编写方法进行修改。 3. 通过方法进行递增。 继承:一个类继承另一个类时,自动获得另一个类的所有属性和方法,子类还可以添加自己的新属性和方法。
class Aa(A):
def '下划线'init'下划线'(self,a,b,c):
super.'下划线'init'下划线'(a,b,c)
父类必须在子类前出现,子类的方法在init中要先给父类的属性赋值,super()是一个特殊的函数,将子类与父类关联起来。 重写:对父类方法,子类方法可以通过定义重名方法对父类方法进行重写。 类似的,类可以放入模块由import语句进行导入,可导入多个模块,可以在模块中选定某一个具体的类进行选择导入,当然也可以导入整个模块,但是在创建实例时需要模块名.类名()进行访问。格式:form c import C,A 类名应该采用驼峰命名法。
8.文件
读取文件:
with open('A.txt') as file_object:
contents-file_object.read()
open()—接受要打开文件的名称,返回一个表示文件的对象;with在不在访问文件后将其关闭;read()—读取文件内容,并将其作为一个长长的字符串返回,特别的该函数会在到达文件末尾时返回一个空字符串,输出的话显示为一个空行。 向open()函数传递的可能是同文件目录中的文件名;相对路径;绝对路径。 按行读取文件:有时每行的末尾会有一个看不见的换行符,输出会多一个空行。
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
with语句外文件被关闭,想要使用可以先进行保存,方法.readlines()从文件中读取每一行,并存储在一个列表中。 读取文本时将所有文本解读为字符串,可以使用函数int()、float()进行转换。 文件写入:
with open(filename,'w') as file_object:
file_object.write("hello world!")
可以向函数open()提供两个实参:一个是文件名称;另一个是打开文件的模式:读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)、读取和写入文件的模式(‘r+’)。
with open('A.txt','w') as file_object:
contents-file_object.read()
当’w’打开时,如果文件存在会先删除,在返回一个空的该文件,写入时不会自动在文本末尾添加换行符,但是只能写入字符串,可以使用函数str()进行转换。 当’a’打开时,像文件添加内容而非覆盖原有内容,如果文件不存在则会新建一个空文件。 json存储数据:
#存储函数json.dump()
number = [2,3,4]
filename = 'number.json'
#文件存储格式为JSON格式
with open(filename,'w') as f_obj:
json.dump(number,f_obj)
#加载信息
with open(filename) as f_obj:
number_plus = json.load(f_obj)
9.异常
python使用异常这一特殊对象来管理程序执行期间发生的错误。 异常是使用try-except代码块处理的:
try:
answer=5/0
except ZeroDivisionError:
#除数为零异常
printf("除数为零")
else:
print(answer)
如果try代码块中的代码运行起来没有问题,except代码块将被跳过;如果try代码块中的代码导致了错误,python将查找这样的代码块,并运行其中的代码。依赖于try代码块成功执行的代码都放在else代码块中,如果之后有其他的代码块将继续执行。 其他常见异常:FileNotFoundError—找不到文件异常(该错误由open()引起,因此整个with语句应该放在try中),一般不用执行其他操作,可以在代码块中使用pass语句,表示什么也不做,当然也可以充当占位符,格式:pass 。
10.测试代码
python提供了一种自动测试函数输出的高效方式,其中unittest提供了代码测试工具。 单元测试:核实函数某个方面是否有问题。 测试用例:一组单元测试,一起核实该函数在各种情况下的行为都符合要求。
import unittest
from A import a
#从A模块中引入函数a(),该函数接受两个输入c,d,得到一个输出e
class TestCase(unittest.TestCase):
def test_a(self):
#名称应尽可能详细,因为不用用户主动调用
result = a(c,d)
self.assertEqual(result,e)
#用断言来核实
unittest.main()
在运行上例文件时,所有以test_打头的方法将自动运行,代码行unittest.main()使得运行这个文件中的测试。 上例中还用到了一个断言方法,assertEqual()—用于核实得到结果是否与期望结果一致。 断言:断言方法用于检查你认为应该满足的条件是否确实满足,只能在继承unittest.TestCase的类中使用这些方法。 测试类:与测试方法类似,因为测试类主要测试类中的方法,而要测试类的行为,要先创建其实例。 unittest.TestCase类包含方法setUp(),使我们可以只创建这些对象一次,并在每个测试方法中使用它们,python也会先运行setUp()方法,再运行各个以test_打头的方法。setUp()方法:一是创建一个调查对象,二是创建一个答案列表,二者均存储在self属性中,因此可以再任何地方使用。 运行测试用例时,每完成一个单元测试,python均打印一个字符:测试通过打印’.’,测试引发错误打印’E’,测试导致断言失败打印’F’。
11.迭代器与生成器
迭代器:访问集合元素(字符串,列表,元组)的一种方式,只能前进不能后退。 创建语句:iter()。访问下一个语句:next(),也可以直接使用for语句进行遍历。 类使用迭代器要实现两种方法:下划线iter下划线(),下划线next下划线()。其中next中可以使用StopIteration异常防止无限循环。 生成器:使用了yield的函数被称为生成器,生成器是一个返回迭代器的函数,只能用于迭代操作,在调用生成器运行的过程中,每次遇到yield时函数就会暂停并保存当前所有运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续执行。