levels of contents

Python自动化学习笔记(五)——函数(传参、参数类型)、全局变量、常用模块(json模块、os模块、time模块)

1.函数

1.1 return的作用

  • 把函数处理结果返回
  • 结束函数,函数里面遇到return立马结束

1.2 return包含多个值

返回多个值时,系统用一个元组来接收多个返回值,示例如下:

1 def get_user():
2     s='abc,123'
3     username,password=s.split(',')
4     return username,password
5 
6 a=get_user()
7 print(a)

输出结果为:('abc', '123'),a的类型为一个元组

1.3函数的参数类型详解

 

位置参数、默认参数、可变参数、关键字参数

  • 必填参数,位置参数,必传
  • 默认值参数,非必传,默认参数调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上
  • 可变参数,非必传,允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。形参使用*args形式
  • 关键字参数,非必传,允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。形参使用**args形式,传参的时候必须得用k=v这种形式来传

一个默认参数的函数例子

1 #一个读写文件的函数,传入content则写入,不传则读取文件
2 def op_file(filename,content=None):
3     with open(filename,'a+',encoding='utf-8') as fw:
4         fw.seek(0)      #移动文件指针
5         if content:
6             fw.write(content)       #指针移动到文件头部,还是会追加到文件末尾
7         else:
8             return fw.read()

一个可变参数的函数例子

 1 def mysql2(*info):
 2      print(info)
 3 mysql2() #转为一个空元组传入
 4 #mysql2(user='root')   #调用方法错误
 5 mysql2('root',123)  #输出('root', 123),转为元组传入函数
 6 info=[1,2]
 7 mysql2(*info)  #将list中的元素拆开传入函数,输出(1,2)
 8 
 9 def calc(a,b):  #只有位置参数的函数
10     print(a+b)
11     return a+b
12 l=[1,2]
13 calc(*l)  #也可以这样传参,将list中的元素拆开传入函数,输出3

一个关键字参数的函数例子

 1 def mysql(**mysql_info):
 2     print(mysql_info)
 3 
 4 mysql()  #传入一个空字典,输出为{}
 5 #mysql('ip','user')  #错误传入方式
 6 mysql(ip='ip',user='user') #关键字形式传入,输出{'ip': 'ip', 'user': 'user'}
 7 
 8 info={'ip':'ip1','user':'user1'}
 9 mysql(**info)  #字典拆开再传入,输出{'ip': 'ip1', 'user': 'user1'}
10 
11 def mysql1(ip,user):#只有位置参数的函数
12     print(ip,user)
13 mysql1(**info) #也可以这样传参,字典拆开再传入字典的value,输出ip1 user1

一个同时包含位置参数和关键字参数的例子

1 def request(url,method,**info): #位置参数和关键字参数都有的函数
2     print(url)
3     print(method)
4     print(info)
5     if info.get('data'):  #关键字参数中是否传入data这个参数
6         data=info.get('data')
7         print(data)
8 request('www.baidu.com','get',data='哈哈哈',file='aaa.txt')

输出结果:

2.全局变量

 应该尽量避免使用全局变量。不同的模块都可以自由的访问全局变量,容易出错。全局变量降低了代码的可读性,并且一直占用内存

代码示例:

 1 name='小明'   #字符串类型的全局变量
 2 stus=[] #全局变量是list、字典、集合时,修改时不需要声明global
 3 def a():
 4     name='哈哈哈'
 5     print(name)  #局部变量,不影响全局name的值,调用函数输出‘哈哈哈’
 6 
 7 def c():
 8     global name    #声明name是全局的
 9     stus.append('abc')  #全局变量是list,没有声明global也可以修改,在函数外部打印stus会输出['abc']
10     name='哈哈哈'   #声明后修改全局变量的值
11     print(name)  #调用函数输出‘哈哈哈’

3.常用内置模块

3.1 json模块

 四个常用方法:

  • dic=json.loads(json_str) #把字符串(json串)转成字典,传入一个json格式的字符串,返回一个字典
  • str=json.dumps(dic,ensure_ascii=False) #把字典转成json串(字符串),传入一个字典,返回一个json格式的字符串;ensure_ascii=False意思是不进行ascii编码,如果省略此参数,字符串中的中文将是ASCII编码后的
  • dic=json.load(f)      #直接从文件里读出来json再转成字典返回,传入f为文件句柄,返回一个字典
  • json.dump(dic,f,ensure_ascii=False,indent=4)  #直接将字典按json格式写入文件,不需要先转成json,返回None,传入一个字典dic和文件句柄f,并按照缩进四格来格式化

loads方法示例代码

1 import json
2 json_str='''
3 {"name":"xiaohei","age":18,"sex":"男","age":18}
4 '''
5 res=json.loads(json_str)    #把字符串(json串)转成字典
6 print(res)

输出:

dumps方法示例代码

1 import json
2 dic={"name":"xiaohei","age":18,"sex":"","age":18}
3 #把字典转成json串(字符串)
4 res=json.dumps(dic,ensure_ascii=False,indent=4)       #把字典转成json串(字符串)
5 print(res)

输出:

load&dump方法示例代码

 1 import json
 2 dic = {
 3     "xiaohei":{
 4         "age":18,
 5         "password":12345,
 6         "sex":"",
 7         "addr":"北京"
 8     },
 9     "xiaoming":{
10         "age":18,
11         "password":12345,
12         "sex":"",
13         "addr":"北京"
14     },
15     "xiaodong":{
16         "age":18,
17         "password":12345,
18         "sex":"",
19         "addr":"北京"
20     }
21 }
22 #直接从文件里读出来json再转成字典返回
23 with open('user_new.json',encoding='utf-8') as f:
24     res=json.load(f)
25     print(res)
26 
27 #直接将字典按json格式写入文件,不需要先转成json
28 with open('user_new.json','w',encoding='utf-8') as fw:
29     res=json.dump(dic,fw,ensure_ascii=False,indent=4)
load&dump

3.2 os模块

 常用方法:

  • os.listdir('e:/') #列出目录下的所有文件和文件夹
  • os.remove() #删除文件
  • os.rename()#重命名文件
  • os.mkdir(r'testday5') #创建文件夹 r代表原字符串
  • os.makedirs(r'test\testday5') #递归创建,父目录不存在时一起创建
  • res=os.path.exists(r'test\testday5') #文件或文件夹是否存在
  • res=os.path.isfile(r'test\testday5') #判断是否为文件
  • res=os.path.isdir(r'test\testday5') #判断是否为文件夹
  • res=os.path.split(r'test\testday5\aa') #将路径和文件名区分开,返回一个包含两个元素的元组
  • res=os.path.dirname(r'test\testday5') #获取父目录
  • res=os.getcwd() #获取当前目录
  • os.chdir('../day5') #切换目录
  • print(os.environ) #获取计算机的环境变量
  • res=os.path.join('test','abc','a.txt') #拼接路径,不需要指定分隔符
  • res=os.path.abspath('..') #根据相对路径获取绝对路径
  • res=os.system('ipconfig') #执行操作系统命令,无法获取结果,#命令执行成功返回0,失败返回1
  • res=os.popen('ipconfig').read() #执行操作系统命令,并获取结果

 

 

3.3 time模块

#格式化好的时间 20181202
#时间戳 计算机诞生的时间到现在过了多少秒
#时间元组 格式化好的时间和时间戳相互转换的媒介

常用方法:

  • time.time()  #获取当前时间戳
  • time.strftime('%Y-%m-%d %H:%M:%S')) #按指定格式获取格式化好的当前时间
  • time.gmtime(234466755) #指定时间戳转换为时间元组
  • time.gmtime(int(time.time())) #将标准时区的当前时间戳转换为时间元组
  • time.localtime(int(time.time())) #将当前时区的当前时间戳转换为时间元组
  • time.strftime('%Y-%m-%d %H:%M:%S',time1) #时间元组time1转成格式化时间,不传时间元组,则转换当前时间
  • time.strptime('20181023153856','%Y%m%d%H%M%S') #格式化时间先转成时间元组
  • time.mktime(timep) #时间元组转为时间戳
  • time.sleep(seconds)  #程序休眠几秒

代码示例,时间戳和格式化时间相互转换的两个函数:

 1 import os
 2 #时间戳转格式化时间
 3 def timestampToStr(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
 4     if timestamp:           #传入timestamp,则转换指定的时间戳
 5         time1=time.gmtime(timestamp)  #时间戳转换为时间元组,
 6         res = time.strftime(format, time1)  # 时间元组转成格式化时间
 7 
 8     else:                   #没有传入timestamp,默认返回格式化好的当前时间
 9         res = time.strftime(format)  # 获取当前格式化的时间   
10     return res
11 
12 #格式化时间转时间戳
13 def strTotimestamp(str=None,format='%Y-%m-%d %H:%M:%'):
14     if str:                 #传入时间,则转换指定的时间
15         timep = time.strptime(str, format)  # 格式化时间先转成时间元组
16         res = time.mktime(timep)
17     else:                   #没有传入时间,默认返回当前的时间戳
18         res=time.time()     #获取当前时间戳
19     return int(res)
时间戳和格式化时间相互转换

4.列表生成式,浅拷贝,深拷贝,了解一下

4.1列表生成式

1 s=[1,2,3,4,5]
2 for i in s:
3     print(i+1)
4 
5 res=[i+1 for i in s]
6 print(res)  #等同于上面2.3行的循环,[[i+1 for i in s]]被称为列表生成式,可以使代码更简洁

 4.2浅拷贝&深拷贝

#浅拷贝:两个变量指向同一块内存地址:

list1=[1,2]
list2=list1 #两个变量的内存地址一致,修改list2时,list1的值也会修改,本质上其实是一个变量

#深拷贝:开辟一块新的内存地址

list1=[1,2]
list2=list[:]

posted @ 2018-12-05 15:34  非文艺女青年  阅读(639)  评论(0编辑  收藏  举报
levels of contents