python自动化测试学习笔记-4内置函数,处理json
函数、全局变量
写代码时注意的几点事项:
1、一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改,其次全局变量会一直占用系统内容。
2、函数里如果有多个return值,会把几个return值放到一个元组里
def hello(a,b,c,d): return a,b,c,d res=hello('1111','2222','3333','4444') print(res)
3、一个函数尽量只写一个功能
4、用简练的代码写高级的程序
例如:循环一个list的每一个值,通常可以用for循环
num = [1,2,3,4,5,6,7,8,9] newnum=[] for i in num: newnum.append(i) print(newnum)
python提供一种更简洁的方式来实现,列表推导式:
num = [1, 2, 3, 4, 5, 6, 7, 8, 9] newnum=[str(x) for x in num ] print(newnum)
又例如,交换A,B的值,通常做法是添加第三方变量:
a=1 b=2 #a=2,b=1 c=0 c=a a=b b=c print(a,b)
python提供了一种更简便的方法,直接交换A,B的值
#python中可以直接交换 a=1 b=2 a,b=b,a print(a,b)
5、函数即变量
函数名也是一个变量,不加(),只是函数名。
def say(name): print(name) na=say na('sss')
上述代码看到,我们把na=say ,因为say是一个函数,所以传给na后,na也变为一个函数,直接用na调用,也执行了定义的函数。再如:
def add(): print('tianjia') def view(): print('chakan') def delete(): print('shanchu') menu={ '1':add, '2':view, '3':delete } case=input('请输入选择:1、2、3').strip() if case in menu: menu[case]() else: print('输入错误')
上述代码我们定义了三个函数,分别代表添加,查看,删除操作,同时定义一个字典来存放不同选择代表的调用不同函数;
当执行input时,判断输入的key是不是存在于字典中,menu[case](),如果存在,menu[case]的value值对应的函数名,加上()则表示执行函数;
当然这种函数即变量调用的时候适用于传参为空或者传参相同的场合。
内置函数
之前已经用到了一些python的内置函数,今天来学习一些常用的内置函数。
len() 方法返回对象(字符、列表、元组等)长度或项目个数。
len(s) --s对象
str='123456789' list=['1adssss',2,'3','4'] print(len(str))#长度; print(len(list))
执行结果:9、4
input()
python3 里 input() 默认接收到的是 str 类型。
st=input('shuru:')#输入 print(type(st))
执行结果:输入4,查看到input的类型是<class 'str'>
如果想要int类型,可以进行强制转化int():
st=int(input('shuru:'))#输入 print(type(st))
查看执行结果:
shuru:3
<class 'int'>
print() 方法用于打印输出,最常见的一个函数。
print('打印')#输出
执行结果:打印
type()查看对象类型
list=['1adssss',2,'3','4'] print(type('sss'))#查看类型 print(type(2)) print(type(list))
查看执行结果:
<class 'str'>
<class 'int'>
<class 'list'>
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否不为 0、''、False 或者 iterable 为空,如果是返回 True,否则返回 False。简单的说就是判断参数是否都为真;
any() 函数用于判断给定的可迭代参数 iterable 是否全部为空对象,如果都为空、0、false,则返回 False,如果不都为空、0、false,则返回 True。简单说就是参数有任意一个为真,则返回真。如下:
print(all([0,1,2,3,4,5]))#判断其中的值都为真,则返回真 print(any([0,1,2,3,4,5]))#判断其中有一个值为真,则返回值真
查看执行结果:False、True
bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
bin(10)#十进制转2进制 ejz=bin(100) print(ejz) print(ejz.replace('0b',''))
查看执行结果:0b1100100、1100100
代码中,如果直接执行bin(),会有0b开头代表二进制数,想要得到一个整数类型,我们把0b替换掉;
chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
chr(i) -- 可以是10进制也可以是16进制的形式的数字。
print(chr(88))#打印数字对应的ascii print(chr(0x61))
执行查看结果:
X
a
ord() 函数是查询一个长度为1的字符串对应的ASCII值
print(ord('#'))#打印字符串的对一个的ASCII print(ord('e'))#打印字符串的对一个的ASCII
查看执行结果:35、101
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
a='aaa' b={} c=[] d=set() print(dir(a))#查看字符串的方法 print(dir(b))#查看字典的方法 print(dir(c))#查看list的方法 print(dir(d))#查看元组的方法 print(dir())#查看当前模块的属性列表
查看执行结果:可以看到打印出了对应对象类型的方法,如果有写对象不清楚其方法,可以用此方法查看
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b', 'c', 'd']
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
print(eval('[]'))#执行简单的python代码 a=3 b=a print(eval('b')) print(eval('1+2'))
查看执行结果:[]、3、3
excel()函数可以执行一个稍微复杂的python或执行一个python文件
code='''def a(): print('aaaa')''' print(exec(code)) a()#调用
上述代码中exec执行了code,解析出其中的代码段定义了一个函数a(),所以在后面的调用a()的时候没有报错;直接打印了aaaa
又如,我们有一个python文件,可以用读的形式执行代码:
with open('clean_log.py','r',encoding='utf-8') as f: exec(f.read())
上述代码的意思就是执行了clean_log.py文件中的代码。
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
比如我们同时循环两个列表的元素,可以用zip
ids=[1,2,3,4,5,6,7,-1,-2] names=['aaa','bbb','ccc','ddd','eee','fff'] for id,name in zip(ids,names): print(id,name)
查看执行结果:
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
在比如我们直接打包两个列表:
ids=[1,2,3,4,5,6,7,-1,-2] names=['aaa','bbb','ccc','ddd','eee','fff'] print(list(zip(ids,names)))
查看执行结果:
[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (4, 'ddd'), (5, 'eee'), (6, 'fff')]
sorted() 函数对所有可迭代的对象进行排序操作。 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
ids=[1,2,3,4,5,6,7,-1,-2] print(sorted(ids,reverse=True))#默认是升序排列,可以用reverse进行降序
查看执行结果:
[7, 6, 5, 4, 3, 2, 1, -1, -2]
对一个字符串进行排序:
print(sorted('2125343230')) print(sorted('asdgowequwxasd'))
查看执行结果:返回的是两个默认升序的列表
['0', '1', '2', '2', '2', '3', '3', '3', '4', '5']
['a', 'a', 'd', 'd', 'e', 'g', 'o', 'q', 's', 's', 'u', 'w', 'w', 'x']
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
def func(a): if a%2==0: return True else: return False num2=[1,2,3,4,5,6,7,8,9,10] nums=[x for x in range(11)] res=map(func,nums) res1=map(func,num2) print(list(res)) print(list(res1))#map 的结果是一串字符串,需要强制类型转换成list查看
实际就是用list中的每一个值调用func函数,返回的是一个字符串,需要强制转化一下成list,在这里map等同于下面的代码:
all=[] for num in nums: res=func(num) all.append(res) print(all)
执行代码可以看到,返回值是一样的:
[True, False, True, False, True, False, True,