学习记录004-函数/time and os模块
【参数类型】
1 位置参数:
# 1 位置参数 # def hello(name): #里面有必填参数 # if name == "郭等等": # print("hello") # else: # print("你输入错误") # hello("郭等等")
2 默认值参数:如果形参里面的参数给定值,后期实参里面如果没有值就使用默认值
# 2 默认值参数:如果在形参里面给定参数的默认值,后期实参没有给定值的时候就使用默认参数 # def hello(name="郭等等"): #里面有必填参数 # if name == "郭等等": # print("hello") # else: # print("你输入错误") # hello()
3 可变参数/参数组:*args
# *args---args这个名字是一个变量名,自己命名即可 # 001 不是必填参数 # 002 不限制参数的个数 # 003 传入多个参数的时候把参数放入一个元组里面 # 004 *args可以当作可容纳多个变量组成的元组 def send_report(*args): print("发邮件") print(args) send_report() send_report("guo") send_report(3,4)
4 可变参数/参数组:*kwargsargs
# 001 不是必填参数 # 002 不限制参数的个数 # 003 传入多个参数的时候会把参数放到一个字典里面 输出即字典 # 004 放入参数的时候需要以key,value的格式进行传入 # 005 kwargsargs是自己命名的名称 def send_report(**kwargsargs): print("发邮件") print(kwargsargs) send_report(name = "guo") send_report(name = "han") send_report( 1 ) #这个是错误的,因为不是以key value的格式进行传入的 send_report(nuo = 1)
5 关键字参数:关键字参数后面不可以使用位置参数!!!!
# 001 关键字参数后面不能用位置参数,不然会报错 # 002 位置参数后面可以加关键字参数,但需要注意对应关系 def send_report(name,qq): print(name,qq) send_report(qq="123",name="guo") send_report(name="guo",123) #这是错误的:位置参数后面加了关键字参数
【关于解包】
需要注意:
1 最后传入参数的地方的*是在调用的时候使用的
2 传入的实参的数量要与定义的参数数量一致
def connect(ip,port,username,passwd): print(ip) print(port) print(username) print(passwd) info = ("192.168.11.110",3318,"guo","123") #这是一个元组 connect(*info) li = ['abc','bcd','123',456] #这是一个列表 connect(*li) se = {1,2,3,4} #这是一个集合 connect(*se) s = '1234' #这是一个字符串 connect(*s) dic = {'port':3307,'ip':'127.0.0.1','username':'root','passwd':'1233'} #这是一个字典,输出为字典的key connect(*dic) #输出为字典的key connect(**dic) #输出为字典的value,
【关于全局变量和局部变量】
一 局部变量
1 函数里面定义的变量为局部变量
二 全局变量
1 大家都可以使用的就是全局变量
2 全局变量一般定义在最上方
3 建议全局变量少用:局部变量在使用的时候占用内存,一旦不使用就释放,但是全局变量只要当前python文件打开状态就一直占用内存,而且不安全
# 全局变量:尽量少用 # 一般定义在上方 # 都可以使用的就是全局变量 language = "python" def hello(): print("我正在学习的语言是:"+language) hello() # 局部变量:在自己的函数里面进行了变量的定值,即使已经有了全局变量,那么会优先选择自己函数里面的变量 language = "python" #这是全局变量 def hello(): language = "java" #这是局部变量 print("我正在学习的语言是:"+language) hello() # 对应场景:此时有一个全局变量,函数A进行了局部变量,那么函数A调用的时候采用的是局部变量的值;但是函数B一旦使用变量的话, # 那还是全局变量的值,这样的情况怎么办呢? # 那么函数A可以在自己的函数里面进行声明,变量为全局变量而不是自己的局部变量,这样函数B使用的时候调用的值即和A一致 # 也就是说一开始声明的全局变量失效,此刻需要使用global,如下: language = "java" def hanshuA(): global language language = "python" print("我已经声明了变量就是python,我喜欢的语言是:"+ language) def hanshuB(): print("我是函数B,我喜欢的语言也是:" + language) hanshuA() hanshuB() print(language)
4 global与可变类型与不可变类型==理解这一点真的考验我语言理解能力
针对可变的数据类型:list dic字典 集合 =======》如果想要当前函数被调用使用函数内的变量值,不必在函数内global;
针对不可变的数据类型:int 元组 str =========》必须在函数里面里面进行global;
# #定义可变类型的全局变量 g_num = [1,2,3] print("函数外", g_num) #输出列表内容 def modify(): # global g_num #针对可变数据类型,此处的global加不加均可 g_num.append(4) print("函数内", g_num) #输出声明的列表内容 modify() #针对可变数据类型,验证在上面函数未加global此时输出的结果: print("函数外", g_num)# 输出为函数里面的列表内容,即使没有加gloal,因为列表为可变数据类型 # #定义不可变类型的全局变量 g_num = (1,2,3) #定义一个元组,元组是不可变数据类型 print("一开始的全局变量是:", g_num) #10 def modify(): global g_num #在函数里面进行声明,这样出了函数进行输出依然为此刻函数里面的数据;如果此刻不加blobal,声明只在函数里面生效 g_num = (100,100,100) print("函数内加global的函数:", g_num) modify() #此时修改后,函数外面的输出结果验证: print("后面的调用结果:",g_num) #输出为函数里面声明的:100,100,100
【内置函数】
# 输出模块可调用的方法 import random print(dir(random)) # 输出变量可以调用的方法 s = "abc" print(dir(s)) # 进行排序,输出的是一个list,输出格式固定 s = "abc123456" s = sorted(s) print(s) dic = {1,2,3,6,8,4} print(sorted(dic)) # 反转排序,返回的是一个list,只能转list才能看到结果,否则就是一个对象 print(list(reversed(s))) # 判断可迭代的对象(list)里面是否都为真:非空即真,非零即真 # print(all([1,2,3,4,])) # 判断可迭代的对象(list)里面是否有一个为真:非空即真,非零即真 # print(any([1,2,3,4,])) # 把判断的对象转化成布尔类型,判断是否为空,返回false或者true # print(bool([])) # 打印数字对应的ascii码,和ascii列表一致 # print(chr(65)) #在ascii表里面这个输出对应的是:A # 执行python代码:s里面是一个字符串,字符串里面有python的代码,使用该方法就可以进行变量里面python代码的运行 # s = 'print("hello world")' # print(exec(s)) # s = "print('helloworld')" # exec (s) # # 执行python代码:但是使用eval方法适用的是针对运行简单的代码 s = eval("1+1") b = eval("{1,2,3,4,5}") print(s) print(b)
【递归】
1 递归就是函数自己调用自己
2 最多循环999次
3 用递归的时候一定要定义一个结束的条件
def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') return test1()#如果不是偶数的话继续调用自己,输入值 print(test1())#调用test
【匿名函数lambda】
hanmm = lambda X:X+1 #冒号前面是入参,后面是返回参 # 上面的代码等同下面的两行,变量等同函数,入参为冒号前面的,return为冒号后面的 # def hanmm(X): # return (X+1) s = hanmm(3) print(s)
【关于 Map】
1 作用是循环调用函数的
2 map会把函数里面的每一次调用的返回值保存,最后返回
3 根据条件循环列表,输出结果
def add_prx(name): return "qianzhui---%s"%name stus = ["guoyanan","jiajinju","hujiangchuan"] result = list(map(add_prx,stus)) print(result)
【关于filter】
1 也是循环调用函数使用的
2 过滤传入的参数,函数结果返回的是Ture就保存,如果是False就不要了
3 根据条件循环列表,输出结果为列表里面的内容,如果符合就保留(返回),如果不符合去除不保留
# def add_prx(name): # return "qianzhui---%s"%name # stus = ["guoyanan","jiajinju","hujiangchuan"] # result = list(filter(add_prx,stus)) # print(result) # stu_score = [60,30,50,70,99,100,67] # def panda(score): # return score >= 60 # # result = list(filter(panda,stu_score)) # print(result) # =========上面和下面是相同的,两种写法 stu_score = [60,30,50,70,99,100,67] result = list(filter(lambda score:score>=60,stu_score)) print(result)
【os模块】========》important
# os模块 import os #列出某个目录下面的文件和文件夹,路径前面加"R"是为了防止转编译 # print(os.listdir(r"/Users/gdd/PycharmProjects/BestTest/BestTest004")) # 返回的是true或者false,判断路径下的东西是不是文件或者文件夹 # print(os.path.isfile("/Users/gdd/PycharmProjects/BestTest/BestTest004/os常用模块.py")) #判断是不是文件 # print(os.path.isdir("/Users/gdd/PycharmProjects/BestTest/BestTest004/os常用模块.py")) #判断是不是文件夹 # 利用os下面的两个方法可以进行文件的创建 # os.makedirs("gyn.text") # os.mkdir("abc.text") # os.makedirs("guo/yanna") #父目录如果不存在的话就会帮你创建,所以建议使用这个方法进行文件的创建 # os.makedir("han/ya") #由于未有名字为han的父目录,所以创建文件ya失败 # 进行文件的重新命名,第一个输入原来的文件名称,后面输入想要修改的文件名称 # os.rename("ceshi.py","自己练习") # 获取当前目录 # print(os.getcwd()) # 进入某个目录下: # os.chdir(r"/Users/gdd/PycharmProjects/BestTest/BestTest003") #进入某个目录下 # os.makedirs("测试") # 获取电脑的CPU个数 # print(os.cpu_count()) # 执行操作系统命令的,只能查看结果,但是拿不到 # print(os.system("ifconfig")) # 命令结果可以拿到的: # result = os.popen("ifconfig").read() # print("这是拿到的返回的结果====",result) # 删除文件夹: # os.rmdir("guo") 只能删除空的文件夹,如果文件夹下有内容删除不了 # 获取文件大小,输出为文件的字节大小 # a = os.path.getsize("/Users/gdd/PycharmProjects/BestTest/BestTest004") # print(a) # 很厉害的Walk模块:指定文件夹,会输出文件夹下所有的文件夹和文件 # 注意:1 三个值可以随意命名;2 三个值的名字必须都得写 # for a,b,c in os.walk(r"/Users/gdd/PycharmProjects/BestTest/BestTest004"): # print("当前文件夹目录:",a) # print("当前目录下的文件夹:",b) # print("当前目录下文件夹里面的文件:",c) # break # 告诉你一个指定目录,找到目录下有哪些文件 # 1 获取目录下有哪些文件 # 2 判断文件名是否以.mp4结尾 ''' def find_movie(path): for cur_dir,dirs,files in os.walk(path): for file in files: if file.endswith(".mp4"): # if files in "字符串": #验证如果一个文件包含某些字符 print("在这个目录下发现了以.mp4格式结尾的文件:%s" % cur_dir) break find_movie("/") #在/目录下即查找所有的路径 ''' # 获取上一级目录的名字 # print(os.path.dirname(r"/Users/gdd/PycharmProjects/BestTest/BestTest004/os常用模块.py")) # 该模块根据当前系统自动确定路径分割符,进行连接生成路径 # print(os.path.join("user","wenjian.text")) #输出:user/wenjian.text # 判断文件是否存在,返回True 或者 False # 可以传绝对路径 or 相对路径 # print(os.path.exists("os常用模块.py")) # 分割文件的路径和文件名 # 如果文件为空,返回为空 # print(os.path.split("/Users/gdd/PycharmProjects/BestTest/BestTest004/os常用模块.py")) # print(os.path.split("/Users/gdd/PycharmProjects/BestTest/BestTest004/")) # 输出文件的绝对路径 # print(os.path.abspath("函数.py")) # print(os.path.abspath("../BestTest003/abc.text")) # print(os.path.abspath("../函数.py")) print(os.path.getmtime("/Users/gdd/PycharmProjects/BestTest/BestTest003/collection.py")) #获取文件的修改时间 print(os.path.getctime("/Users/gdd/PycharmProjects/BestTest/BestTest003/collection.py")) #获取文件的创建时间 print(os.path.getatime("/Users/gdd/PycharmProjects/BestTest/BestTest003/collection.py")) #获取文件最近被访问的时间
【time常用模块】
# 表达时间的方式 # 1 时间戳:从计算机诞生的那一天到现在过了多少秒 # 2 格式化好的时间 import time # 输出当前格式化好的时间 # s = time.strftime("%Y-%m-%d %H:%M:%S") # print(s) # 获取当前时间的时间戳 # s = time.time() # print(s) # time.gmtime(1560675002) #取标准时区的时间 # time.sleep(10) #睡眠10秒钟再运行 # 时间戳和时间格式化互相转换 # 时间元组:时间戳和格式化时间互相转换的话需要中间先转化成时间元组、 # 001==》操作时间戳转化成格式化时间 # time_stuple = time.localtime(1560675002) #先把时间戳转成时间元组: # print(time.strftime("%Y-%m-%d %H:%M:%S",time_stuple)) #再把时间元组的结果按照自己想要的结果转成格式化时间 # 002==》操作格式化的时间转成时间戳时间a # time_stuple = time.strptime("2019-6-20 18:20:35","%Y-%m-%d %H:%M:%S")#格式化好的时间转成时间元组 # print(time_stuple) # print(time.mktime(time_stuple)) #时间元组转化成时间戳