1、函数传参
# 位置参数传参方式 def userinfo(name,age,sex): print('name:%s,age:%s,sex:%s' %(name,age,sex)) userinfo('wangxiaoyu',18,'nv')#1.位置参数,传参的时候需要一一对应 测试结果: name:wangxiaoyu,age:18,sex:nv
# 关键字传参方式 或 关键字和位置传参方式混合
def userinfo2(name=None,age=None,sex='nan'):#默认值参数 print('name:%s,age:%s,sex:%s' % (name,age,sex)) userinfo2(sex='nv',name='wangxiaoyu',age=10)#2.用关键字参数方式传参,参数位置可以随意打乱 userinfo2('wangxiaoyu',sex='nv',age=18)#3.位置参数和关键字参数混合使用的话,位置参数必须一一对应,位置参数后的关键字参数可以打乱 userinfo2(name='wangxiaoyu',age=18,'nv')#4.错误写法,使用关键字参数后就不能再使用位置参数方式 测试结果: name:wangxiaoyu,age:10,sex:nv name:wangxiaoyu,age:18,sex:nv
SyntaxError: invalid character in identifier
# 可变参数、参数组,*args # 1、不是必填参数 # 2、不限制参数的个数 # 3、传入多个参数的时候他把参数放到一个元组里面 def userinfo3(*args): print(args) userinfo3() userinfo3('wangxiaoyu') userinfo3('wangxiaoyu',18,'nv') 测试结果: () ('wangxiaoyu',) ('wangxiaoyu', 18, 'nv')
# 关键字参数:**kwargs # 1、不是必填参数 # 2、不限制参数的个数 # 3、传入多个参数的时候他把参数放到一个字典里面 # 4、必须的使用关键字调用,k=v,k1=v1 def userinfo4(**kwargs): print(kwargs) userinfo4()#不传参 userinfo4(name = 'wangxiaoyu')#关键字传参 str = {'name':'wangxiaoyu','age':18,'sex':'nv'} userinfo4(**str)#传字典 测试结果: () ('wangxiaoyu',) ('wangxiaoyu', 18, 'nv')
# 位置参数和关键字参数混合使用 def myfunc2(name,addr='beijing',*args,**kwargs): print('name',name) print('addr',addr) print('addr',args) print('args',kwargs) myfunc2('wangxiaoyu','bejing','heihei','haha') 测试结果: name wangxiaoyu addr bejing addr ('heihei', 'haha') args {} myfunc2('wangxiaoyu','bejing','heihei','haha',say1='xixi',say2='i love you !') 测试结果: name wangxiaoyu addr bejing addr ('heihei', 'haha') args {'say1': 'xixi', 'say2': 'i love you !'} myfunc2('wangxiaoyu','heihei','haha')#划重点:这里使用位置参数传参方式,那么就会遵守位置参数的一一对应原则 测试结果: name wangxiaoyu addr heihei addr ('haha',) args {} myfunc2('wangxiaoyu',say1='jiu bu gao su ni !') 测试结果: name wangxiaoyu addr beijing addr () args {'say1': 'jiu bu gao su ni !'}
myfunc2(name='wangxiaoyu','lll','lslsls')#错误写法:关键字参数后面不能用位置参数了,传参的时候就会报错
测试结果:
SyntaxError: positional argument follows keyword argument
# 通过* **两种解包方式传参 * 解包后是位置参数传参方式,字符串与参数一一对应, **解包后,是关键字参数传参方式 def connect(ip,port,username,password): print(ip) print(port) print(username) print(password) # 集合 str = {'192.169.6.66','36000','root','123456'} connect(*str)#解包 '192.169.6.66','36000','root','123456' #列表 list = ['192.169.6.66','36000','root','123456'] connect(*list)#解包 '192.169.6.66','36000','root','123456' #元组 t = ('192.169.6.66','36000','root','123456') connect(*t)#解包 '192.169.6.66','36000','root','123456' # 字符串 s1 = '192.169.6.66' s2 = '36000' s3 = 'root' s4 = '123456' connect(s1,s2,s3,s4)#只能一个参数一个参数的传,直接定义str='192.169.6.66','36000','root','123456'后传入的方式会报错 #字典 d = {'ip':'192.168.6.66','port':'36000','username':'root','password':'123456'} connect(**d)#解包 'ip'='192.168.6.66','port'='36000','username'='root','password'='123456' 以上调用测试结果: 192.168.6.66 36000 root 123456
2、匿名函数
# 匿名函数 sum = lambda x:x+1 print(sum(2)) 测试结果: 3 p = lambda :print('I Love You !') p() 测试结果: I Love You !
3、全局变量和局部变量
全局变量:
大家都可以用的变量就是全局变量。
不可变的数据类型是全局变量的话,必须得加global:
int str 元组
可变的数据类型是全局变量的话,不需要加global:
字典 list 集合
局部变量:
函数里面定义的变量都是局部变量。
# 可变数据类型作为全局变量不需要加global dict = {'wangxiaoyu':18} def printDict(): dict.setdefault('lixiaokai',19) print('函数中的dict:',dict) print('调用函数前全局变量中的dict:',dict) printDict() print('调用函数后全局变量中的dict:',dict) 测试结果: 调用函数前全局变量中的dict: {'wangxiaoyu': 18} 函数中的dict: {'wangxiaoyu': 18, 'lixiaokai': 19} 调用函数后全局变量中的dict: {'wangxiaoyu': 18, 'lixiaokai': 19}
#不可变数据类型 filename = 'product.json' def showFileName(): filename = 'product.json2'#局部变量 print('filename:',filename) showFileName() print('全局变量filename:',filename) 测试结果: 函数中filename: product.json2 全局变量filename: product.json
filename = 'product.json' def showFileName2(): global filename#加上global后修改的就是全局变量中的值 filename = 'product.json3' print('函数中filename:', filename) showFileName2() print('全局变量filename:',filename) 测试结果: 函数中filename: product.json3 全局变量filename: product.json3
#全局变量在函数中定义时,只有当函数执行后才会被定义,才能被使用 def showUserName(): global username username = 'wangxiaoyu' print('函数中的username:',username) def showUserName2(): print('函数中的username:', username) showUserName2()#直接调用会报错,因为showUserName这个函数没有执行,所以username也不会成为全局变量,因此直接调用showUserName2的时候会报错 测试结果: NameError: name 'username' is not defined showUserName() showUserName2() 测试结果: 函数中的username: wangxiaoyu 函数中的username: wangxiaoyu
4.map和filter
#1、map是循环帮你调用函数的 #2、map会把函数每一次调用的返回值保存,最后返回 #filter #1、循环帮你调用函数 #2、帮你过滤你传入的参数,函数的结果返回是true那就保存,返回false就不要了 l = ['wangxiaoyu','lixiaokia','lijunhao','lixinran'] def showUserInfo(username): print('你好,%s' % username) list(map(showUserInfo,l)) 测试结果: 你好,wangxiaoyu 你好,lixiaokia 你好,lijunhao 你好,lixinran list(filter(showUserInfo,l)) 测试结果: 你好,wangxiaoyu 你好,lixiaokia 你好,lijunhao 你好,lixinran
l2 = [0,30,60,66,79,80,85,90,98] def showScore(score): return score > 69 #大于69返回True,小于69返回False # 过滤l2中大于69的数 print(list(filter(showScore,l2))) 测试结果: [79, 80, 85, 90, 98] print(list(map(showScore,l2))) 测试结果: [False, False, False, False, True, True, True, True, True]
5、递归(函数自己调用自己)
#递归最多循环999次 #用递归的时候一定要指定一个结束的条件,如果不制定那么做多循环999次。 count= 0 def hello(): global count count += 1 print('count %s'%count) hello() hello() 测试结果: count 1 count 2 count 3 …… …… count 992 count 993 count 994 count 995 count 996
def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') return test1()#如果不是偶数的话继续调用自己,输入值 print(test1())#调用test 测试结果: please enter a number:1 不是偶数请重新输入! please enter a number:3 不是偶数请重新输入! please enter a number:6 True
6、内置函数
常见的内置函数有len type int str dict list set tuple等等
import os print(dir(os.path)) #查看当前命令下有哪些方法 如果点不出来提示的话可以用这个方法查看 测试结果: ['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_sep', '_joinrealpath', '_varprog', '_varprogb', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'stat', 'supports_unicode_filenames', 'sys']
l = [1,2,3,7,9,6,5] print(sorted(l)) #按升序排序 测试结果: [1, 2, 3, 5, 6, 7, 9]
l = [1,2,3,7,9,6,5] print(list(reversed(l))) #元素反转,需要转换成list后才能查看 测试结果: [5, 6, 9, 7, 3, 2, 1]
print(all([1,2,3,4,5,6]))#判断可迭代的对象里面的值是否都为真 print(all([1,2,3,4,5,False]))#判断可迭代的对象里面的值是否都为真 测试结果: True False
print(any([0,None,'',False,8]))#判断可迭代的对象里面是否至少有一个为真的元素 print(any([0,None,'',False]))#判断可迭代的对象里面是否至少有一个为真的元素 测试结果: True False
print(bin(16))#十进制转换成二进制 测试结果: 0b10000
print(bool(None))#把对象换行成布尔类型 print(bool('asdf')) 测试结果: False True
print(chr(60))#打印数字对应的ASCII码 测试结果: <
print(ord('<'))#打印字符串对应的ASCII码 测试结果: 60
print(eval('["a","b","c"]'))#执行python代码,只能执行简单的,定义数据类型和运算 测试结果: ['a', 'b', 'c']
print(eval('1+2')) 测试结果: 3
s = "print('你是我心中最美的花朵!')" eval(s) 测试结果: 你是我心中最美的花朵! exec(s) 测试结果: 你是我心中最美的花朵!
ss = "def sum():\n\tprint('正在执行3+6计算')\n\treturn 3 + 6" exec(ss)#执行后相当于定义了sum函数,否则直接调用的话会报错 print(sum()) 测试结果: 正在执行3+6计算 9
with open(r'内置函数.txt',encoding='utf-8') as fr: f = fr.read()#从文件中读出来的是字符串 exec(f) 测试结果: 我的名字叫:wangxiaoyu
showName = """ score = 100 print('我的名字叫:%s,我今年%s岁啦,我的英语考了%s分' % (username,age,score)) """ def showUserInfo(): exec(showName,{'username':'lixiaokai','age':19})#正常传参 exec(showName,{'username':'wangxiaoyu','age':19},{'username':'wxy','age':18})#重复传参的话,每个变量的值以最后一传的值为准 exec(showName,{'username':'wangxiaoyu','age':18,'score':121})#score在字符串内定义的,所以即使传参当代码运行到score时,值又被设置成了100 showUserInfo() 测试结果: 我的名字叫:lixiaokai,我今年19岁啦,我的英语考了100分 我的名字叫:wxy,我今年18岁啦,我的英语考了100分 我的名字叫:wangxiaoyu,我今年18岁啦,我的英语考了100分
7、os模块
# 查看文件路径 print(os.path.dirname('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day5/操作数据库.py' )) 测试结果: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day5
import os # 获取当前目录下的所有文件夹及文件 print(os.listdir(r'/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4')) 测试结果: ['内置函数.py', 'map和filter.py', 'os模块.py', 'wang', '内置函数.txt', '函数.py', '时间戳.py']
print(os.path.isfile(r'map和filter.py'))#判断是否为文件,是返回True,否则返回False 测试结果: True
print(os.path.isdir('wang'))#判断是否为文件夹 测试结果: True
print(os.path.exists('wang'))#判断文件是否存在 测试结果: True
os.mkdir('test')#在当前目录下创建一个文件夹 os.makedirs('li/test1')#在当前目录下创建如下li/test1,如果上级目录不存在则创建 os.rename('li/test1','li/test')#重命名
print(os.getcwd())#获取当前目录 测试结果: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4
# 获取父目录 print(os.path.dirname('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4')) 测试结果: /Users/wangxiaoyu/PycharmProjects/python_automated_development
print('改变目录前,目录为:',os.getcwd()) os.chdir(r'/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/xiao')#改变到哪个目录下 print('改变目录后,目录为:',os.getcwd()) 测试结果: 改变目录前,目录为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4 改变目录后,目录为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/xiao
# 分割文件路径和文件名,最后一个默认为文件名 print(os.path.split('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/123.py')) 测试结果: ('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4', '123.py')
#取绝对路径 print(os.path.abspath('bbb.py')) 测试结果: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/bbb.py
print(os.path.getmtime('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/bbb.py'))#获取文件修改时间 print(os.path.getctime('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/bbb.py'))#获取文件创建时间 print(os.path.getatime('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/bbb.py'))#获取文件最近一次访问时间 测试结果: 1561024408.4518201 1561024408.4527607 1561024410.699889
print(os.cpu_count())#获取当前服务器cpu核数 测试结果: 4
print(os.system(os.getcwd()))#执行系统命令 测试结果: sh: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4: is a directory 32256
print(os.popen('ifconfig').read())#执行命令并读取执行结果 测试结果: lo0: flags=8049mtu 16384 options=1203 inet 127.0.0.1 netmask 0xff000000 ……
os.open('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/123.py', os.O_CREAT)#os.O_CREAT创建并打开一个新文
os.remove('内置函数.txt')#删除文件 os.rmdir(r'wang/xiao')#删除文件空文件夹(非空删除时报错)
print(os.path.getsize('map和filter.py'))#获取文件大小 测试结果: 697
#获取指定目录下的所有文件及文件夹 for a,b,c in os.walk('/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4'): print('当前文件夹为:',a) print('当前文件夹下的目录为:',b) print('当前文件夹下的文件为:',c) 测试结果: 当前文件夹为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4 当前文件夹下的目录为: ['test', 'wang'] 当前文件夹下的文件为: ['内置函数.py', 'map和filter.py', 'os模块.py', '函数.py', '时间戳.py'] 当前文件夹为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/test 当前文件夹下的目录为: [] 当前文件夹下的文件为: [] 当前文件夹为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang 当前文件夹下的目录为: ['test1'] 当前文件夹下的文件为: [] 当前文件夹为: /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/test1 当前文件夹下的目录为: [] 当前文件夹下的文件为: []
#指定一个目录,然后找到这个目录下有哪些文件, .mp4 .avi #1、获取这个目录下有哪些文件 os.walk() #2、判断文件名是否以.mp4/.avi结尾 import os def showFile(path,str): for a,b,c in os.walk(path): for f in c: if '.' + f.split('.')[-1] in list(str.split(',')): print(f) path = input('请输入你要查找的目录:') str = input('请输入您要查找的文件后缀,不同后缀用逗号隔开(如:.mp4,.vep):') showFile(path,str) 测试结果: 请输入你要查找的目录:/Users/wangxiaoyu/ 请输入您要查找的文件后缀,不同后缀用逗号隔开(如:.mp4,.vep):.mp4,.vep cnz-内置函数.vep cnz-os模块.vep cnz-递归.vep
# 拼接路径 print(os.path.join('/users','wangxiaoyu','PycharmProjects','python_automated_development','day4','wang','666.py')) 测试结果: /users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/666.py
# 案例 #/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang def register(): path = '/Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang' username = input('username:') abs_path = os.path.join(path,username)#join拼接 print('拼接后abs_path的路径为:',abs_path) with open(abs_path, 'w') as f: f.write('666') register() 测试结果: username:bbb.py /Users/wangxiaoyu/PycharmProjects/python_automated_development/day4/wang/bbb.py
8、time模块
#时间戳 从计算机诞生的那一天到现在过了多少秒 #格式化好的时间 import time print(time.strftime('%Y-%m-%d %H:%M:%S'))#获取当前时间并以指定格式展现 测试结果: 2019-06-21 10:29:53
print(time.time())#获取当前时间戳,单位是秒 测试结果: 1561084244.9605918
# 通过时间戳获取时间元组,标准时间区的时间和本地时间区的时间,两者差了8小时 print(time.gmtime(1561084244))#取标准时间区的时间元组 print(time.localtime(1561084244))#取本地时间区的时间元组 测试结果: time.struct_time(tm_year=2019, tm_mon=6, tm_mday=21, tm_hour=2, tm_min=30, tm_sec=44, tm_wday=4, tm_yday=172, tm_isdst=0) time.struct_time(tm_year=2019, tm_mon=6, tm_mday=21, tm_hour=10, tm_min=30, tm_sec=44, tm_wday=4, tm_yday=172, tm_isdst=0)
# 时间戳和格式化时间互相转换 t = time.localtime(1561084244)#先获取本地时间元组 r = time.strftime('%Y-%m-%d %H:%M:%S',t)#把时间元祖转换成格式化好的时间 print(r) 测试结果: 2019-06-21 10:30:44
# 格式化好的时间转换成时间戳 t = time.strptime('2019-06-21 10:30:44','%Y-%m-%d %H:%M:%S')#把格式好的时间转换成时间元组 r = time.mktime(t)#把时间元组转换成时间戳 print(r) 测试结果: 1561084244.0
#把格式化时间转换成时间戳,不传格式化时间则返回当前本地时间时间戳 str='2019-06-21 10:30:44' def str_to_timestamp(str=None,format='%Y-%m-%d %H:%M:%S'): if str: t = time.strptime(str,format) return time.mktime(t) return int(time.time()) print('当前本地时间转换成时间戳后:',str_to_timestamp()) print('2019-06-21 11:16:56转换成时间戳后:',str_to_timestamp('2019-06-21 11:16:56')) 测试结果:当前本地时间转换成时间戳后: 1561087191 2019-06-21 11:16:56转换成时间戳后: 1561087016.0
# 把时间戳转换成格式化时间,不传则返回当前本地时间的格式化时间 timestamp=1561084244 def timestamp_to_str(timestamp=None,format='%Y-%m-%d %H:%M:%S'): if timestamp: t = time.localtime(timestamp) return time.strftime(format,t) return time.strftime(format) print('当前本地时间时间时间戳转换成格式化后的时间:',timestamp_to_str()) print('1561084244转换成格式化后的时间:',timestamp_to_str(1561084244)) 测试结果: 当前本地时间时间时间戳转换成格式化后的时间: 2019-06-21 11:19:51 1561084244转换成格式化后的时间: 2019-06-21 10:30:44
9、模块安装相关知识
模块相关的知识 #1、报错pip命令没有的 #1、where pip,如果找不到,去找python的安装目录 #2、然后把python的安装目录和安装目录下的scripts目录加入到环境变量里面 #2、Unknown or unsupported command 'install' 1、先执行 where pip 2、然后把不是python安装目录下的pip改名,改成其他的就ok了。
#pip install xlrd
#pip install xlwt
#pip install xlutils
#pip install pymysql
#pip install redis
#pip install nnlog
python3的或用pip3
#pip3 install xlrd
#pip3 install xlwt
#pip3 install xlutils
#pip3 install pymysql
#pip3 install redis
#pip3 install nnlog