python自动化测试学习笔记-4内置函数,处理json

时间:2021-04-18 18:28:23

函数、全局变量

写代码时注意的几点事项:

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, False, True, False, True]
[False, True, False, True, False, True, False, True, False, True]
[True, False, True, False, True, False, True, False, True, False, True]

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

与map类似,只不过filter是用来过滤的。

def func(a):
if a%2==0:
return True
else:
return False
nums=[0,1,2,3,4,5,6,7,8,9,10]
res=filter(func,nums)#如果返回的是值0,0会当作False 过滤掉
print(list(res))

查看执行结果:

[0, 2, 4, 6, 8, 10]

json函数

使用json函数需要导入json模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。

json.dumps 用于将 Python 对象编码成 JSON 字符串。

例如,我们向文件中写入一个字典表时,写入的是一个字符串形式的,不方便查看,这时就可用用json进行格式转化。

import json
d={'吉普车':{
'color':'fffff',
'count':20,
'price':100000
},
'小轿车': {
'color': '00000',
'count': 50,
'price': 60000
}
}
f=open('aaa','a+',encoding='utf-8')
f.seek(0)
f.write(str(d))

执行上述代码,写入文件的是一个字符串。

import json
d={'吉普车':{
'color':'fffff',
'count':20,
'price':100000
},
'小轿车': {
'color': '00000',
'count': 50,
'price': 60000
}
}
f=open('aaa','a+',encoding='utf-8')
f.seek(0)
res=json.dumps(d,indent=4,ensure_ascii=False)#json 把字典转化为json,indent表示缩进,显示中文
f.write(res)

执行上述代码,查看文件:

{
"吉普车": {
"count": 20,
"color": "fffff",
"price": 100000
},
"小轿车": {
"count": 50,
"color": "00000",
"price": 60000
}
}

还有一个dump方法,与dumps的方法区别是:

#dump 操作的是文件 ,dumps操作的是字符串
#dump 第一个参数是字典数据,第二个参数是文件,自动写入文件

如上边的代码用dump改造一下:

import json
d={'吉普车':{
'color':'fffff',
'count':20,
'price':100000
},
'小轿车': {
'color': '00000',
'count': 50,
'price': 60000
}
}
f=open('aaa','a+',encoding='utf-8')
f.seek(0)
json.dump(d,f,ensure_ascii=False,indent=4)#d表示字典数据,f是文件
f.close()

查看执行结果,同样文件中写入了json串,省略了一步write操作。

json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。我们用上述写入文件的json进行试验:

import json
f=open('aaa','r',encoding='utf-8')
res=f.read()
dict_res=json.loads(res)#把json转化python的数据类型字典
print(dict_res)

执行查看结果:返回的是python的字典类型

{'吉普车': {'count': 20, 'color': 'fffff', 'price': 100000}, '小轿车': {'count': 50, 'color': '00000', 'price': 60000}}

同样的还有一个load方法,与dump方法一样,参数中传入文件,直接进行转换,省略了一步读的动作:

import json
f=open('aaa','r',encoding='utf-8')
print(json.load(f))

查看执行结果,返回了字典类型:

{'小轿车': {'count': 50, 'price': 60000, 'color': '00000'}, '吉普车': {'count': 20, 'price': 100000, 'color': 'fffff'}}