python基础:函数传参、全局变量、局部变量、内置函数、匿名函数、递归、os模块、time模块、解包

---恢复内容开始---

一、函数相关:

1.1位置参数:

ef hello(name,sex,county='china'):
    pass
#hello('hh','nv')   #位置参数、默认参数

1.2可变参数:也叫参数组,在参数名前加*,一般习惯命名为*args

*args 特性:

(1)不必传

(2)不限制参数个数,可传一个或多个

(3)传多个参数的时候,args把传的值放在一个元组中

def send_email(*args):
    print("发邮件")
    print(args)   #结果为一个元组

调用:
send_email('h')
send_email()
send_email('h','daibai','test')

1.3**kwargs:两个**,关键字参数:

(1).不限制参数个数,传多个参数时,把参数放在一个字典里

(2).传参必须使用关键字调用,key=value格式

(3).不是必传

def send_email(**kwargs):

  print(“发邮件”)

  print(kwargs)

send_email(name='xiaohei',age='17')

1.4 注意事项:

#参数调用例子及错误示范
def myfunc(name,addr,phone,qq):
    print(name,addr,phone,qq)
myfunc(phone=110,addr='bks',qq='9459666',name='hh')    #正确。关键字调用,可以不用按位置调用
myfunc('hh',phone=110,addr='bks',qq='9459666')    #正确。位置参数可以与关键字调用共同用,但注意使用方法
#myfunc('hh',phone=110,addr='bks','9459666')     #错误示范。关键字参数后边,不能再用位置参数,用了关键字传值后,后边的值都要用关键字参数
def myfunc1(name,addr='bks',*args):
    print(name,addr,args)
myfunc1('xiaohei')
myfunc1('xiaohei','xiaobai')         #按位置传,xiaobai传给addr
myfunc1('xiaohei','xiaobai','tiantongyuan','huilongguan')     #按位置传,xiaobai传给addr,xiaohei给name,其他值都传给args
#myfunc(name='xiaohei',addr='xiaobai','abc')       #报错:如果用前边用关键字传值,args在最后就无法传值了。
def myfunc2(name,addr='bks',**kwargs):
    print(name,addr,kwargs)
myfunc2(name='xiaohei',addr='xiaobai',kwargs='abc')    #前边传关键字,多元参数就用kwargs
def myfunc3(name,addr='bks',*args,**kwargs):
    print(name,addr,kwargs)
myfunc2(name='xiaohei',addr='xiaobai',age='18',sex='nv')    #调用的时候   age和sex都给了kwargs,因为args不能传关键字,且可以为空

 2、函数传参:

2.1 解包:

def connect(ip,port,username,password):
    print(ip)
    print(port)
    print(password)
    print(username)

info=('192.167.1.102','3306','name','123456')
list=['192.16.108.227','3306','hehe','123456']
se={1,2,3,4}             #可以解包,但是是无序的
s='1234'   
dic = {'ip':'127.0.0.1','port':3307,'username':'root','password':'1233'}
#以上几种,均可以解包
connect(*info)      #解包:把元组解成:'192.16.108.227','3306','hehe','123456'
connect(*list)          #解包:把list解成:'192.16.108.227','3306','hehe','123456'
connect(**dic)    #解包:'ip'='127.0.0.1','port'=3307,'username'='root','password'='1233',   字典解包 ,要用关键字传值,所以是两个**
#两**:关键字传值

3.递归:

#递归:函数自己调用自己
#递归最多递归999次,所以如果死循环,函数会报错
#用递归,一定要指定一个结束的条件,不能进入死循环

count=0
def hello():
    global count
    count+=1
    print('hello')
    print(count)
    hello()
hello()   #结果会报错,因为是个死循环
def test():
    num=input("输入一个数字")
    if num%2==0:#判断输入的数字是不是偶数
           return True#如果是偶数的话,程序就退出了,返回true
    print("不是偶数")  
    return test()#如果不是偶数的话继续调用自己,输入值
print(test1())#调用test

4.内置函数:

4.1 dir()#可以打印这个模块或变量下可以调用的方法

#coding=utf-8
#python3 默认字符集是utf-8

import random
#dir()#可以打印这个模块或变量下可以调用的方法
print(dir(random))  #可以打印这个模块或变量下可以调用的方法
print(dir(s))

4.2 排序:sorted():被排内容的必须是同一种数据类型

s=sorted(s)    #字符串排序后会成为list
se=sorted(se)   #排序,被排的必须是同一种数据类型
print(s)

4.3判断:

#all():判断,可判断迭代的对象里面的值是否都是真
#非零即真,非空即真
print(all([1,2,3,4,5,0])
#any():判断可迭代的对象里面的值是否有一个为真
print(any([1,2,3,4,5,0])) 
#bool('s')  #把一个对象转为布尔类型,可判断非空 非零情况
print(bool('s')) 
#十进制转二进制:
print(bin(10))   #10进制转2进制
#打印数字对应的ascii码
print(chr(32))  #打印数字对应的ascii

 5.执行python代码:exec()、eval()

s='print("hello,world")'
s2='print(dir(random)) '
s3='''
print("hello")
'''
exec(s)
exec(s2)       #执行python代码
exec(s3)
res=eval('1+1')    #只能执行简单的python代码
print(res)
res2=eval("{'1','2','3','4'}")
print(res2)

6.匿名函数:lambda  

import random,string,os
niming=lambda x:x+1  #冒号前是要传的参数,冒号后是返回值
#同下:
def niming2(x):
    return x+1
print(niming(1))
print(niming2(1))

7.循环调用函数:map()、filter() 

7.1  map():循环取值并调用

def choice(a):
    return(a+1)
#同上
result=list(map(choice,[1,2,3,4,5,6]))    #如果不转成list, map的结果是一个对象,必须转成list才能被执行
print(result)    
#函数名也是变量名,可以直接调用
stus=['han','xiaoming','caicai','xiaohei']
for stu in stus:
    os.mkdir(stu)
同上
result=list(map(os.mkdir,stus))       #迭代器:必须转成list才能被执行
print(result)                #mkdir函数没有返回值,所有返回的list 都是None
map():
1.map是循环调用函数的
2.map会把函数每次调用的返回值保存,最后返回。如果调用的函数没有返回值,就返回none
def add_prx(name):
return 'cnz_%s'%name
res=list(map(add_prx,stus))
print(res)

7.2 :filter:()  

#1.循环的调用函数
#2.帮你过滤传入的参数,函数的返回结果是True那就保存,返回false就不要了
stus=['1','2','3','']
def add_prx(name):
    return name
res=list(map(add_prx,stus))
print(res)   #结果:['1', '2', '3', ''],没有过滤空的
res2=list(filter(add_prx,stus))
print(res2)   #['1', '2', '3']  过滤了空的(False)
score=['50','90','80','20','90']
result=list(filter(lambda score:score>60,score))    #如果score<60,返回false,就不返回了)
print(result)
#代码同下:
score_list=[90,40,59,80,79]
def panduan(score):
    return score>60
result=list(filter(panduan,score_list))

二、全局变量、局部变量

全局变量:
大家都可以用的变量
全局变量定义在最上边

不可变的数据类型,如int,string,stuple,需要修改全局变量必须加global
可变的数据类型,如字典、list、set,不需要加global
局部变量
函数里面定义的都是局部变量
调用函数结束后,局部变量就释放了

language='python'  #全局:int、string、tuple这三种数据类型,如果要修改全局变量的话,需要用global
list=[1,2,3,4]     #list、dict、set这种可以修改的变量类型,不需要加gloable也可以修改全局变量

def hello():
    global language    #声明,更改全局变量,更改后全局变量改为本函数中定义的局部变量。
    language='java'
    list.append('hello')           #可以直接修改,不需要声明
    print('language')

def xiaobai():
    print(list)           #结果是list=[1,2,3,4,'hello']  
    print(language)   #结果是Java
hello()
xiaobai()

练习:

#练习1
money=500 def test(consume): return money-consume def test1(money): return test(money)+money money=test1(money) print(money) 运行结果是500
#练习2:
def test():
    global a
    a = 5
def test1():
    c = a + 5
    return c
res = test1()
print(res)
#运行结果会报错, 由于没有定义a,调用是也没有先调用test(),所以在执行test1()时,a是没有定义的

三、time模块

3.1取格式化好的时间

#表示时间:
#时间戳:从计算机诞生的时间到现在过了多少秒
#格式化好的时间:2019-6-16

#获取格式化好的时间:
print(time.strftime('%y-%m-%d %H:%M:%S'))   #获取当前时间,连接符自己定义
print(time.strftime('%Y.%m.%d %H:%M:%S'))
print(time.strftime('%H:%M:%S'))   #只获取时间,不获取日期

3.2、取时间戳:print(time.time())

转换为时间戳后,方便进行计算。

比如说,取三天后的时间: print(1560674721+60*60*24) 

3.3 、时间戳转化为格式化的时间:先把时间戳转化为时间元组,再把时间元组转化为格式化时间

time_tuple=time.gmtime(1560674916)      #通过时间戳获取标准时区的时间元组

time_tuple=time.localtime(1560674916)     #通过时间戳获取当地时区的时间元组

#时间元组转为格式化时间:time.strftime

print(time.strftime('%Y.%m.%d %H:%M:%S',time_tuple))

3.4、格式化时间转为时间戳:先转为时间元组,再转为时间戳

#转时间元组:time.strptime()

time_tuple=time.strptime('19-06-16 16:00:00','%y-%m-%d %H:%M:%S')#前后的格式必须对应
print(time_tuple)

#时间元组转时间戳:time.mktime(time_tuple)

3.5、格式化时间和时间戳互相转化的函数

def str_to_timestamp(str=None,format='%Y-%m-%d %H:%M:%S'):
    #格式化时间转时间戳,如果不传格式化好的时间,就返回当前的时间戳
    if str:
        time_tuple = time.strptime(str,format)
        return int(time.mktime(time_tuple))
    return time.time()
str_to_timestamp()
def timestamp_to_str(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
    '''这个是把时间戳转换成格式化好的时间,如果不传时间戳,那么就返回当前的时间'''
    if timestamp:
        time_tuple=time.localtime(timestamp)
        return time.strftime(format,time_tuple)
    return time.strftime(format)
timestamp_to_str()

四、OS模块   与操作系统相关的模块

print(os.listdir(r'E:cnz6_16'))#列出某个目录下边文件夹的文件
print(os.path.isfile(r'E:cnz6_16'))   #判断是不是文件
print(os.path.isdir(r'E:cnz6_16'    )) #判断是不是文件夹

os.mkdir('test')    #当前路径下创建文件夹,
os.makedir('test2')
#以上两种方式的区别
# os.mkdir(r'E:cnz6_17hanmin')  #父目录不存在创建会报错,
# os.makedirs(r'E:cnz6_18hanmin2')   #父目录不存在也可以创建,
os.rename(r'E:cnz6_16笔记','biji.txt')   #重命名文件
os.remove(r'E:cnz6_16笔记')  #删除文件,不能删除文件夹
os.rmdir(r'E:cnz6_16	est'   )#只能删除空文件夹
os.getcwd()  #获取当前工作路径
os.chdir( path )  #修改当前工作路径
os.system('ipconfig')   #执行操作系统命令
result=os.popen('ipconfig').read()   #获取命令执行结果
os.path.getsize('biji.txt')    #获取文件大小
os.walk('E:cnz6_16')#获取目录下的所有文件夹、文件

os.path.dirname(r''E:cnz6_16'') #获取目录的父目录
os.path.join(path,path,path,username)#连接几个路径,不需要管分隔符
os.path.abspath(__file__) #获取当前路径的绝对路径
 
for cur_dir,dirs,files in os.walk(r'E:cnz6_16'):#三个参数代表的含义是固定的,位置也是固定的,3个参数必传
    print(cur_dir)  #当前文件夹
    print(dirs)      #当前目录下的所有文件夹
    print(files)   #当前目录下的所有文件
    break

练习:查找指定目录下,有哪些文件:.mp4,.txt结尾的文件

#1.获取目录下有哪些文件  os.walk()
#2.判断文件名是否以.mp4,.txt结尾
def  find_files(path):
    for cur_dir,dirs,files in os.walk(path):
        print('当前查找路径',path)
        for file in files:
            if file.endswith('.mp4') or file.endswith('.txt'):
                print('该目录下有寻找文件',file)
                break
find_files(r'E:/')
os.path.dirname(r''E:cnz6_16'')  #获取目录的父目录
os.path.join(path,path,path,username)   #连接几个路径,不需要管分隔符
print(os.path.join('e:\','users','a.txt'))
 os.path.abspath()    #通过相对路径取绝对路径
print(os.path.abspath('../6_2'))       #两个点代表上级目录,一个点代表当前路径,带点的是相对路径。
os.path.exists() #判断文件是否存在
print(os.path.exists(r'E:cnz'))
 os.path.split()       #分割路径和文件名
print(os.path.split(r'E:cnz6_16iji.txt'))

os.path.gettime()#获取某个文件的修改时间,返回时间戳
os.path.getctime() #获取某个文件的创建时间,返回时间戳
os.path.getatime()#获取某个文件的最后访问的时间,返回时间戳
print(os.path.getctime(r'E:cnz6_16iji.txt'))
print(os.path.getmtime(r'E:cnz6_16iji.txt'))
print(os.path.getatime(r'E:cnz6_16iji.txt'))
 
原文地址:https://www.cnblogs.com/hancece/p/11050132.html