python3(与python2语法不一样)
计算机常识
软件:是一系列计算机指令,可以按照设计的逻辑完成某些业务。
软件三要数:程序、数据、文档
软件开发:就是显示按照功能逻辑实现代码的过程,需求分析、概要设计、详细设计、单元测试
常见的开发模型:瀑布模型、螺旋模型、敏捷模型
常见测试模型:v、w、h
常用dos指令
切换目录指令:
切换不同盘符:E;
同一盘符切换不同目录:cd e:\data
创建文件夹目录:
md:md aaa-在当前路径下创建一个aaa文件夹
mkdir: mkdir bbb
同时创建级联目录:md aaa\bbb or mkdir aaa\bbb
查看当前目录下所有文件: dir
删除文件夹目录:rd:rd aaa(rd只能删除空目录)
rd /s aaa (/s表级联删除)
rd /s /q aaa(/q不询问方式删除)
rmdir:rmdir aaa(不能删除非空目录)
rmdir /s /q
del: del aaa
创建文件:
重定向:echo aaaaaaaaaa>aaa.txt
删除文件:
del:del aaa.txt
清屏:cls
退出命令行:exit
python
是一个高层次的结合了解性、编译性、互动性和面向对象的脚本语言。
集成开发环境(IDE):vscode、PyCharm
一、标识符命名规则:
- 见名知意,很重要,通过标识符可知道该变量指的是什么。
- 必须是字母、数字or下划线组成。
- 数字不能开头。
- 标识符对大小写是敏感的。
- 有保留字。
- 注释、行与缩进、多行语句:
注释:
单行注释:#
多行注释:’’’xxx’’’ or “””xxx”””
(不能嵌套)
文档注释(文档字符串):类名._doc_
行与缩进:
python是用缩进代表代码块。
多行语句:python通常是一行写完一条语句,但是如果语句很长,可以用反斜杠(\)来实现多行语句。
total = item_one+\
item_two
如果语句中包含{}、[]or()就不需要多行连接符。
三、数据类型
数据类型:(定义变量不需要指定数据类型,直接写标识符的名字就可以了)
基础数据类型:(python中一切都是类)
1.数字类型:整型,浮点型,复数类型,布尔。
整型数字:是精确的,不存在误差,内存长度无限。(python3中不区分long类型)
浮点型数字: 默认只有17有效数字,之后的数据都不精确。如果需要提升精度,需要特殊处理。
提升精度的方法:导包form decimal import*,方法getcontext().prec =30 精度限制到30。
复数:主要用在人工智能,大数据处理等进行数据建模。 aa = 1 + 2j;
布尔:True、False。
- 字符串
可以用单引号、双引号,效果一样,但是不能嵌套使用(就近配对原则)
四、转义字符、自然字符串和输出格式
1.转义字符
\,通过特定元字符加上\之后就不是那个字符了,又特定含义。\n--回车换行,\t--一个tab,\\--将后面的转义字符转成普通字符
2.自然字符串
不包括带转义功能的元字符()
用R 或者r表示
r”saddd\nsadfa”输出saddd\nsadfa
空行:用来分割不同的代码段
控制台键盘输入:input()【输入的数据默认字符串】
3.输出常用格式
age = input(“请输入你的年龄:”)
print(“我的年龄是:%s”%age)
强制类型转换:age = int(age)【一定要数字类型才能转换】
%s:表示可以接收字符串类型的值
%d: 表示可以接收数字类型的值
%r:表示可以是数字也可以是字符串的值
五、导入模块
import 与from...import
包:文件__init_.py
将整个模块导入:import somemodule
从某个模块中导入某个函数:form somemodule import somefunction
从某个模块中导入多个函数:form somemodule import firstfunc,,,
将某个模块中的全部函数导入:from somemodule import*
可以对导入的模块or函数进行重命名:import somemodule as abc
六、常用设置
#!:叫“shebang”or“sha-bang”
通常再Unix系统脚本中第一行开头写道
windows可以不指定,但需要配置python的环境变量
help()函数
调用这个函数可以打印输出一个函数的文档字符串
help(max),可以查看max内置函数的参数列表和规范的文档
Quit:退出帮助
#coding=utf-8 或者 #coding:utf8 (不能有空格)
用以指定说明文本格式是utf-8
建议写上
七、标准数据类型
python3中的数据类型,共六种标准数据类型
- Number类型
整型,浮点型,复数,布尔。
- String类型(序列)
‘’ “”引起来的,不可以嵌套。(不可变、有序、可索引和切片)
find():查找某个元素的索引。
- List类型(序列)
元素列表[]在之间,用逗号分隔开。数据类型可以不同!(可变、有序、可索引和切片)
- list.index(val):找到列表中某个值在列表中的位置。
- list.remove(x):删除列表中第一个x。
- del list[N]:删除列表第N个元素。
- list.pop[list.index(val)]:删除列表中指定位置的数据返回该数据的值。
- list[2:4]=[]:删除列表中第2-4的元素。
- list.append(x):把x加入到序列的尾部。
- list.insert(list.index,val):在列表指定位置添加数据。
- list.extend(list1):把list1的每个元素依次加入到list尾部。
- list.count(value):统计某个元素在列表中出现的次数。
- list.reverse():列表逆序
- list.sort():列表排序
- Tuple(元组)类型(序列)
(与列表类似,元素不可以修改、不可变、有序、可索引和切片)【可以把字符串看成特殊的元组】
定义:()定义,用逗号分隔,其中至少有一个逗号 例如:t = (12,)
虽然元组的元素不可变,但是可以包含可变对象!可以改变里面的数据
set集合类型(无序、不重复)
定义:{} 例如:set = {}(直接定义{}其实是字典类型)
可以用工厂类方法set()创建空的set集合
可以对set集合类型进行集合运算
- +:set1 + set2 取并集
- -:set1 - set2 取差集
- &:set1 & set2 取交集
- ^:set1 ^ set2 两个集合中不同时存在的元素
- dict字典类型
(类似java中的map,通过键值对的方式存储,无序,是一种映射类型)
定义:{} dict={key:value,key1:value1}
键不能重复,不能为集合类型
- keys()
- values()
- items():获取所有键值对
- fromkeys(可迭代值):把其他可迭代的类型创建成为dict,键是数字,从1开始。
- get():通过键获取值
- zip(x,y):把x作为键,y为值创建字典
- setdefault(key,value):和get类似,但是如果没有这个键,则会创建,默认值为设置的value
- 序列
序列中的数据(元素)是有序排列的,并且可以通过下标访问到1个or多个序列的数据。下标从0开始访问,类似java中数组。
特点:通过下标(索引)获取元素,多个元素可以通过切片获取(切片是python的特殊用法)
序列通用操作符:
- in: x in s 如果x是序列s的元素,返回Ture,否则Flase
- not in : x not in s 如果x是序列s的元素,返回Flase,否则Ture
- +: s+t 连接两个序列s和t
- s*n or n*s:将序列s复制n次
- s[i]:索引,返回s中第i个元素
- s[i:j] or s[i:j:k]:切片返回序列s中第i到j以k为步长的元素子集。
序列通用方法:
1.len(s):返回序列s的长度
2.min(s):返回序列s的最小元素,s中元素需要可比较
3.max(x):返回序列s的最大元素,s中元素需要可比较
4.s.index(x) or s.index(x,i,j):返回序列s从i开始到j位置中第一次出现元素x的索引号
5.s.count(x):返回序列s中出现x的总次数
6.s.replace(old,new):替换值
7.s.supper():把字母换成大写
8.s.split():字符分割,指定一个特殊的值为分隔符,就可以依据分隔符分成多个元素
八、python运算符
- 算术运算符:+、-、*、/、%、**(幂函数,a**b,a的b次方)、//(取整除-返回商的整数部分,例如9//2=4)
- 比较(关系)运算符:==、!=、>、<、>=、<=
- 赋值运算符:=、+=、-=、*=、/=、%=、**=、//= (例如:a+=b-> a = a+b)
- 位运算符:
60:00111100
13:00001101
&:按位与运算符:参与运算的两个值,两个相应位都为1,则该位的结果为1,否则为0。
0001100 = 12
|:按位或运算符:只要对应的两个二进位有一个为1,则结果位为1。
00111101= 61
^:按位异或运算符:当两个对应的二进位相异时,结果为1。
00110001 = 49
~:按位取反运算符:对数据的每个二进制位取反。
~60 = 11000011=195
60: 原码:00111100
反码:11000011
补码:反码+1 11000100
负数原码->反码:符号位不变,其他数据取反
负数反码->补码:符号位不变,其他数据取反
<<:左移动运算符:运算数的各二进位全部左移若干位,高位丢弃,低位补0。
>>:右移动运算符:运算数的各二进位全部右移若干位,高位丢弃,低位补0。
- 逻辑运算符
x:Flase y:True
and: x and y:布尔“与”,全部为Ture返回Ture,否则返回Flase。
or : x or y :布尔“或”,一个为Ture就返回Ture,全部为Flase才返回Flase
not: not x :布尔“非”,取反。
- 成员运算符
in:如果在指定的序列中找到值返回Ture,否则返回Flase。
not in:如果在指定的序列中没有找到值返回Ture,否则返回Flase。
- 身份运算符
is:判断两个标识符是不是引用自同一个对象。
is not:判断两个标识符是不是引用自不同对象。
- 运算符优先级
- **
- ~
- *、/、%、//
- +、-
- >>、<<
- &
- ^、|
- <=、<、>=、>
- <、>、==、!=
- =、%=、/=、//、-=、+=、*=、**=
- is 、is not
- in 、not in
- not、or、and
九、控制语句
1.顺序语句:直接从上到下,依次运行
2.条件语句:if
格式1: if 条件语句:
代码块
语句1
语句2
格式2: if 条件语句:
代码块1
else:
代码块2
格式3: if 条件语句1:
代码块1
else if 条件语句2:
代码块2
else if 条件语句3:
代码块3
....
continue
3.循环语句:
支持的数据类型:字符串、列表、元组、字典、文件、Range()
1.for循环
格式:
for i(条件) in 迭代类型:
代码块
定义一个变量i,通过循环从迭代数据类型num顺序地取出一个值给i,循环次数看num的长度
for i in num:
代码块
跟java代码一样就用(for i in range(10) == for(int i =0;i<10;i++))
2.while循环
格式:
While 条件语句:
代码块
有一个变化的量来改变条件表达
else:
代码块
break:跳出循环体
continue:跳过当前循环块的语句,然后进行下一轮循环
range():生成数列,用于遍历数字序列
格式:range(start,end,[step])
返回的是range类型,不是列表,是一种迭代类型。
十、函数
将特定功能的一些代码,整合在一个单元中,这个单元就叫方法或函数
函数代码块以def关键词开头,后接函数标识符名称和圆括号。
仍和传入参数和自变量必须放在()内,()中可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串--用于存放函数说明。
函数内容以冒号起始,并且缩进。
return[表达式]结束函数,选择性地返回一个值给调用方,不带表达式的return相当于返回None。不写也返回None。
例如: del sum(a,b):
return a+b
调用:
sum(2,3)
1.可变对象和不可变对象
在Python中,类型属于对象,变量是没有类型的,所以严格意义上不能说值传递还是引用传递,应该说传不可变对象和传可变对象。
可更改(mutable)和不可更改(immutable)对象
不可更改对象:string,tuple和number
可更改对象:list,dict
不可变类型:变量赋值a=5后再赋值a=10,这里实际上是新生成了一个int
值对象10,再让a指向它,而5被丢弃,相当于新生成了a。
可变类型:变量赋值l = [1,2,3,4]后再赋值l[2]=5则是将list l的第三个元素值
更改,本身l没有动,只是其内在部分被修改了。
2.参数传递-类型:
位置参数:
1.传入的参数个数必须与声明一致,否则Python解释器会报错。
2.传入参数的顺序必须与声明一致。
3.传入参数的类型如果不一致,解释器无法帮我们检查,需要在代码中添加判断语句(错了,但是显示的None)。
关键字参数:
1.关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
2.使用关键字参数允许函数调用时参数的顺序与声明不一致。
默认参数:
- 调用函数时,如果没有传递参数,则会使用默认参数。
- 声明函数时要指定默认值。
- 使用默认值可以起到避免漏掉参数导致的错误。
定义: def ab(name,age,sex=’男’),sex=’男’是默认值
不定长参数:
- 需要一个函数能处理比当初声明时更多的参数,这些参数叫不定长参数,声明时不会命名。
- 加了*号的变量名会存放所有未命名的变量参数。如果确定了指定参数,会放在一个元组。
- 在自动化测试里,需要记录脚本运行情况,不同的脚本或者用例,他们输出的日志内容可能不一样,这时候就需要将日志方法的参数定义为不定长的,用的时候传递什么,就在日志文件中写入什么。
return:用于结束函数,选择性的调用返回一个表达式,不带参数的return返回None,可以返回多个值,保存在一个元组里。
4.lambda方法:
匿名方法,没有名字,只用到一次。(主体是一个表达式,而不是一个代码块)
语法:methodName = lambda[arg1[,arg2,....argn]]:expression
例如:sum = lambda a,b:a+b
十一、类
类的定义:
class 类名():
。。。
对象的创建: 对象名 = 类名()
self-->指的是对象本身,例如 self.name -->指的是对象的名字。(相当于java的this)
- 构造方法
类有一个名为_init_()的特殊方法(构造方法),该方法在类实例化时会自动调用。不写默认为空。
格式一:def _init_(self): (无参构造)
格式二:例如:def _init_(self,name,age,leg): (有参构造)
与java不同,只能定义一个。
例如: def __init__(self,name,age,leg):
self.name = name
self.age = age
...
2.私有变量和私有方法
私有变量:__变量名
私有方法: def __方法名:
随机数字:random, 使用要导包random
rand = random.randint(0,100):生成一个0-100的整形数据
3.继承
calss DerivedClassName(BaseClassName1):
<statement-1>
...
<statement-N>
重写就直接重新在子类写一遍方法即可。
子类想添加新的属性进入构造方法里,可以 父类名.__init__(self,xx,xx)
4.python模块(Module)
是一个python文件,以.py结尾,包含了python对象定义和方法
作用:它是为了实现某一类需求的功能的方法集合;
- 模块让你能够有逻辑地组织你的python代码段。
- 把相关的代码分配到一个模块里能让你的代码更好用和更易懂。
- 模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块的使用:
1.import math -> 把math中定义的所有类和方法的副本导入到本文件中
2.form xxx import yyy ->导入想用模块中的某一部分(可以是变量、方法、类),使用时直接用变量名、方法名和类名就可以了,起别名as
标准库:python的安装目录/Lib下
sys :sys.path-》使用import时,默认从这个列表路径去找
os :
第三方库:python的安装目录/Lib/site-packages
selenium:web端自动化测试所需要的包(文件夹(要有一个__init__.py),其中包括很多模块)
appium:app自动化测试所需要的包
BeatifulReporter:把脚步运行结果以比较漂亮的格式输出(HTML格式)
pymysql:帮我们链接数据库,并且可以进行crud的包
想到导入其他位置的包:
path = sys.path
path.append=”追加的路径(相对路径)’
imprint
十二、相对路径
第一种相对路径的用法
只在vscode编写或者执行的时候可以用
#vscode的工程目录:通过file - 打开文件夹(打开的文件夹就是工程目录:python目录)
工程目录:./
第二种相对路径的用法
最保险,获取当前编辑文件的所在目录
dirn = os.path.dirname(__file__) 获取当前文件的路径
path.append(dirn)
十二、测试常用代码
if __name__==”__main__”:
测试代码(本模块内执行)
else:
其他模块调用语句
(为True可以执行本模块,Flase则是其他模块调用)
十三、异常
异常格式
try/except
try:
代码
except exception as e:
异常处理
finally:
必须执行代码
通过raise触发异常:
raise[Exception[,args,[,traceback]]]
自定义异常处理类,并调用该类型进行异常处理,异常类应直接或间接继承自exception类
例:
class myException(Exception):
def__init__(self,error,msg)
self.error = error
self.msg = msg
try:
raise myException(1,’my exception’)
except Exception as e:
print str(e)
异常原则
内置异常:
- 找到并合理使用python的内置异常(Built-in Exception)
- 理解python的内置异常分别对应什么情况
- 阅读你的代码,找到你的代码里可能会抛出内置异常的地方,仅队这几行代码做异常处理
慎用异常:
- 使用异常应该再不得不用的情况下,捕获正确的异常,不要直接try except,不能将逻辑错误隐藏起来
- 异常的处理,要合理,要有日志。
十四、IO文件读写
打开文件:open
语法:
file_obj = open(filename,mode)【打开文件的时候需要指定字符集encoding=”utf-8”】
例:open=(r”文件地址”,”w”,encoding=”utf-8”)
filename:
原字符串:r‘c:\\temp\\text.txt’
转移字符串‘c:\\temp\\text.txt’
mode:
r 只读方式(默认)
w 打开文件只写入,覆盖写入
a 打开一个文件用于追加
+ r+,w+都是以读写模式,区别在于r+必须是已存在的文件,而w+可以创建文件
b 二进制
读方式:
read(size):从文件读取指定的字节数,如果未给定或未负责读取所有
readline(size):用于从文件读取整行,包括“\n”字符,指定非负整数,则返回相应的字节数
readlines(size):读取所有行并返回列表,如size大于0,则一次性返回相应的字节数(减少压力)
写方式:
write(str):将字符串写入文件,返回的是写入的字符长度
writelines():向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符
关闭文件:close
file_obj.close()
注意事项
1.读取文件的时候,如果其中包括中文字符,要保证字符集的一致性,python默认中文字符集是gbk,而若文件是utf-8格式,在读取文件的时候,采用encoding=”utf-8”
2.对文件读写的时候会抛IO异常,要进行异常处理
3.with语句使用(后面读写文件就是这个格式,自动close文件,并且无需抛异常)
with open(“地址”,”读写方式”,encoding=”字符集”) as f:
print(f.readline())
用open打开一个文件,此时调用的是w写入模式,下面使用read是没有权限的,你得使用w+读写模式
csv文件读操作
测试用例的参数,需要从外部文件读入数据csv、excel文件
数据库导出数据格式csv
- 创建csv文件
创建一个excel文件,输入数据,另存为带逗号分隔符的utf-8格式的csv文件
再使用软件打开csv文件,使用编码--》转为utf-8格式,保存退出
- 在脚本中导入csv模块
- 使用with语句打开文件
- 使用csv的方法读取数据(csv.reader(file.open()))