本次博客内容记录第五次自动化测试课程(2019.04.20)的主要知识点,主要包括python基础中的函数参数,变量,模块的使用
一.函数
1.函数参数
#1 必传参数(位置参数) # def say_hello(word): # print(word) #2 默认值参数 # def say_hello(word='hello'): # print(word) # say_hello() # say_hello('hi') # 利用参数,使用一个函数实现文件读写功能 # 另外,如果改成with open方式,会更加简洁(可省略close步骤) # def op_file(file,content = None): # import json # result = None # 如果不写此句,写文件后return result会提示result没有定义 # if content: # f = open(file,'w',encoding='utf-8') # #f.write(content) # json.dump(content,f) # else: # f = open(file,encoding='utf-8') # # res = f.read() # result = json.load(f) # f.close() # return result #3 参数组 # def send_mail(*names): # for name in names: # print('给%s发邮件'%name) #不传参数 # send_mail() #传1个 # send_mail('xiaohei') #传n个 # send_mail('xiaohei','xiaobai') #传过去的是一个什么东西:元组 # def szz(name,age,sex,addr,qq): # print(name,age,sex) # 位置参数与关键字参数 # 可以全部用位置参数,位置是一一对应的 # 也可以全部用关键字参数,指定关键字,不需要按照顺序传参 # 还可以混合用,但是要先写位置参数,再写关键字参数,关键字参数后面不能再出现位置参数 # # szz(addr='大连',qq=111,sex='female') #关键字参数,可以不按照参数顺序传值 # szz('xiaohei',18,addr='beijing',sex='男')# 位置参数+关键字参数 #4 关键字参数 # def xiaohei(**info): # print(info) # 参数是否必传:不必传 # xiaohei() # 位置参数传参是否可以:不可以 # xiaohei('aaa',28) # 关键字参数传参是否可以:可以 # xiaohei(name='lalala',age=18) # 是否限制参数的个数:不限制 # xiaohei(name='hahah') # 综合练习 def xiaobai(name,age=None,*args,**kwargs): print(name) print(age) print(args) print(kwargs) xiaobai('xiaobai',18,'beijing','shanghai',money=500,func='xiaobai')
2.函数参数解包
#解包 def op_mysql(host,port,user,passwd,db): print(host) print(port) print(user) print(passwd) print(db) # # db_info = ['127.0.0.1',3306,'root','123456','szz'] db_info2 = { 'host':'127.0.0.1', 'port':3306, 'user':'szz', 'passwd':'123456', 'db':'szz' } # op_mysql(*db_info) # 调用函数时,使用*这个格式,代表拆开列表分别传给函数对应参数 op_mysql(**db_info2) # 使用**格式,代表解包字典;字典的key必须与函数形参名称一致
3.函数返回值
# return结束函数作用:所以res结果为0 # def xiaobai(): # for i in range(100): # print(i) # return i # # res = xiaobai() # print(res) # 返回多个值时,以元组形式返回 # def get_file(age,name,addr): # # 当前目录有多少文件 # # 这些文件的文件名 # age += 5 # name = 'szz_'+name # addr = 'beijing_'+addr # return age, name, addr # # res = get_file(19,'小黑','天通苑') # print(res) # # # 可以再用三个元素接收 # age,name,addr = get_file(19,'小黑','天通苑') # print(age) # print(name) # print(addr) # 在参数名后面加":类型",表示指定参数类型,可以使用类型对应方法 # def add_user(username:str,password:list): # print('username',username) # print('password',password) # # 不按照指定类型传值时,也不会报错 # add_user([1,2],'12345') # 递归:函数自己调用自己,最深999次 # def say(): # print('say') # say() # # say() def say(): num = input('请输入一个数字:').strip() if int(num)%2!=0: print("请重新输入") say() return True say()
4.内置函数
# input() # print() # int # float # dict(a=1,b=2) # list('123') # set() # tuple() # bool # print(bool('')) # print(bool(None)) # print(bool([])) # print(bool({})) # print(bool(())) # print(bool(0)) # type # id # len # res = sum([1,2,3,5,6]) # print(res) # max() # min() # print(round(1.99199,2)) # print(divmod(10,3)) #取余数 # def abc(): # a = 1 # print(globals()) # print(locals()) # abc() # print(globals()) # 取当前python文件中的所有变量 # print(locals()) # 取函数里面的所有局部变量 # print(chr(65)) # ascii码对应的字符 # print(ord('A')) # 字符对应的ascii码 # 字符集编码,让计算机认识汉字,英文字母(计算机只认识0,1) # ascii gb2312 gbk Unicode(utf-8) # print(dir({})) # 查看有哪些方法 # enumerate # 枚举 # l = ['a','b','c','d','e','f'] # for id,i in enumerate(l,1): # print('%s=>%s'%(id,i)) # exec # 运行python代码 # code = ''' # for i in range(5): # print(5) # ''' # exec(code) # filter() # 下次课程 # map() # 下次课程 # eval() # 执行简单的python代码 # print(eval('[1,2,3,4]')) # zip() # 把n个list合并变成二维数组 # l1 = ['xiaoming','xiaobai','xiaohei'] # l2 = [111,222,333] # res = list(zip(l1,l2)) # print(dict(res))
二.全局变量与局部变量
# 全局变量和局部变量 # 局部变量:定义在函数里面,局部变量只能在函数里面使用,出了函数外面不能调用 # 尽量少用全局变量,因为会一直占用内存,且容易被修改 # name = 'abc' # # def func(): # name = 'abc2' # print('1',name) # func() # # print('2',name) # 函数里修改全局变量 # money = 0 # def husband(): # global money # money +=500 # # def wife(): # global money # money -= 200 # print('最开始的money:',money) # husband() # print('挣钱之后的money:',money) # wife() # print('花钱之后的money:',money) # 变量调用过程练习:输出值为500 # money = 500 # # def test(consume): # return money - consume # def test1(money): # return test(money) + money # # money = test1(money) # print(money) #函数调用练习2:因为test()未被调用,输出会报错 # def test(): # global a #定义a为全局变量 # a = 5 # def test1(): # c = a + 5 # return c # #增加调用test()之后,输出结果为10 # test() # res = test1() # print(res) # 列表,字典,集合不在函数中不需要声明global;(int,str,tuple需要global声明) #可变变量类型:字典,list,set #不可变变量类型:int,str,tuple stus = ['xiaojun','xiaohei','xiaobai'] stu_info = { 'name':'xiaohei', 'age':18 } stus2 = {'xiaohei','xiaobai'} def add_stu(): name = input('name:') stus.append(name) def select_stu(): name = input('name:') print('你的学号是%s'%stus.index(name))
三.随机数
import random random.randint(1,100) l = [1,2,3,4,5,6,7,8] # print(random.sample(['a','b','c'],2)) print(random.choice(l))# 随机取一个元素 print(random.uniform(1,19))# 取随机的小数 random.shuffle(l)# 洗牌 print(l)
四.深拷贝与浅拷贝
# 循环是按照下标循环的,删除元素后新的列表下标发生了变化,所以会漏掉原下标为1的元素 # 循环删除list时都会有这种问题,所以循环时不要删除元素,下标会错乱 # li = [1,1,2,3,4,5,6,7,8,9] # for i in li: # if i%2!=0: # li.remove(i) # print(li) # 解决方法,用两个相同list,循环list2删除list1 # li = [1,1,2,3,3,4,5,6,7,8,9] # l2 = [1,1,2,3,3,4,5,6,7,8,9] # l2 = li[:] # 这种可以 # l2 = li # 这种不可以 # print(id(li))# 查看li的内存地址 # # for i in l2: # if i%2!=0: # li.remove(i) # print(li) #深拷贝:不同的内存地址 # li = [1,1,2,3,3,4,5,6,7,8,9] # l3 = li[:] import copy d = {'name':'xiaobai','l':[4,5,6]} # d1 = copy.deepcopy(d) d1 = copy.copy(d) # 浅拷贝:虽然内存地址不一样,但是多层嵌套时,还是会改变值 d1['l'].append(8) d1['age'] = 18 print(id(d)) print(id(d1)) print(d) print(d1) #浅拷贝:指向同一内存地址 # li = [1,1,2,3,3,4,5,6,7,8,9] # l2 = li # d = {'name':'xiaobai'} # d1 = d # d1['age'] = 18 # print(d)
五.os模块
import os # os.rename('old','new') # os.remove('') print(os.listdir(r'.')) # 列出某个目录下的所有内容,前面加r print(os.getcwd()) # 获取当前目录 print(os.path.getsize('随机数.py')) # 获取某个文件的大小 # os.mkdir('abc') # 父目录不存在时,会报错 # os.makedirs('zzl/abc') # 父目录不存在会创建一个 os.path.exists() # 判断文件夹是否存在 os.path.isdir() # 判断是否是文件夹 os.path.isfile()# 判断是否是文件