博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第六(匿名函数、内置函数、正则等常用模块)
阅读量:6185 次
发布时间:2019-06-21

本文共 12673 字,大约阅读时间需要 42 分钟。

一、匿名函数

匿名函数定义:

1.没有定义名字.  2. 函数体自带return

f=lambda x,y,z=1:x+y+zprint(f(3,4,5))

匿名函数应用场景:应用于一次性的场景,临时使用

二、内置函数

zip应用场景,比较年龄最大的伙计,取出名字:

guys = {    'laomao':83,    'sunwen':60,    'shaoshuai':103,    'laojiang':75,    'laodeng':93}print(max(guys)) #比较的是key,所以显示sunwenprint(max(guys.values())) #比较的是value,所以显示的是103#希望比较value,显示key,希望如下实现:# x=(1,'a')# y=(5,'c')# print(x > y)#可以通过zip来实现# print(list(zip(guys.values(),guys.keys())))print(max(zip(guys.values(),guys.keys()))[1])

 以上如果使用lambda实现

def get_value(name):return guys[name] #这个一次性函数,可以使用lambda --> lambda name:guys[name]print(max(guys,key=lambda name:guys[name]))#key是max方法的比较对象,现在指定的比较对象为value,返回值依然不变,所以实现以上功能

 sorted如上用法

guys = {    'laomao':83,    'sunwen':60,    'shaoshuai':103,    'laojiang':75,    'laodeng':93}def get_value(name):    return guys[name]print(sorted(guys))  #默认从小到大比较排序,按照名字排序。print(sorted(guys,key=get_value)) #默认从小到大排序,比较值为vlaueprint(sorted(guys,key=get_value,reverse=True)) #默认从小到大,按value排序再反转

结果:

 map使用说明

  第一个传递函数,第二个传递参数

将所有名字添加上 _BOSS:

names = ['laomao','sunwen','shaoshuai','laojiang']print(map(lambda name:name + '_BOSS',names)) #得到一个迭代器print(list(map(lambda name:name + '_BOSS',names)))

结果:

 如上改变,如果列表里面有laodeng,则除了laodeng都加字符串

names = ['laomao','sunwen','shaoshuai','laojiang','laodeng']#lambda name:name if name == 'laodeng' else name + '_BOSS'  #lambda表达是返回函数体,所以此处返回是name,应该是 return name if name == 'laodeng' else name + '_BOSS'#return 可以省略print(list(map(lambda name:name if name == 'laodeng' else name + '_BOSS',names)))

结果:

reduce

计算从1加到100的值结果,示例如下:

from functools import reduceprint(reduce(lambda x,y:x+y,range(101)))print(reduce(lambda x,y:x+y,range(101),100)) #初始值为100

结果:

eval

eval可以指定名称空间

eval(cmd,{ 全局名称空间},{局部名称空间})

cmd='print(x)'x=8eval(cmd,{},{
'x':99})

结果:

cmd='print(x)'x=8eval(cmd,{
'x':66},{
'y':99})

 结果:

compile说明

s = 'for i in range(5):print(i)'code=compile(s,'','exec')exec(code)

 结果:

三、re模块

示例说明:

import reprint(re.findall('\w','hi the world & i am _893'))# ['h', 'i', 't', 'h', 'e', 'w', 'o', 'r', 'l', 'd', 'i', 'a', 'm', '_', '8', '9', '3']print(re.findall('\W','hi the world & i am _893'))# [' ', ' ', ' ', '&', ' ', ' ', ' ']print(re.findall('\s','hi the world & i am _893 \t \n'))# [' ', ' ', ' ', ' ', ' ', ' ', '\t', ' ', '\n']print(re.findall('\S','hi the world & i am _893 \t \n'))# ['h', 'i', 't', 'h', 'e', 'w', 'o', 'r', 'l', 'd', '&', 'i', 'a', 'm', '_', '8', '9', '3']print(re.findall('\d','hi the world & i am _893 \t \n'))# ['8', '9', '3']print(re.findall('\D','hi the world & i am _893 \t \n'))# ['h', 'i', ' ', 't', 'h', 'e', ' ', 'w', 'o', 'r', 'l', 'd', ' ', '&', ' ', 'i', ' ', 'a', 'm', ' ', '_', ' ', '\t', ' ', '\n']# print(re.findall('\Ahi','hi the world & hi wold i am _893 \t \n'))print(re.findall('^hi','hi the world & hi wold i am _893 \t \n'))# ['hi']print(re.findall('world','hi the world & hi wold i am _893 \t \n'))# ['world']

 关于“.”的说明

# . 匹配任意一个字符print(re.findall('a.c','a a2c a*c a3c abc a c aaaac aacc'))# ['a2c', 'a*c', 'a3c', 'abc', 'a c', 'aac', 'aac']# 但是无法匹配到换行符print(re.findall('a.c','a a2c a*c a3c abc a c aaaac aacc a\nc'))# ['a2c', 'a*c', 'a3c', 'abc', 'a c', 'aac', 'aac']#匹配换行符的操作print(re.findall('a.c','a a2c a*c a3c abc a c aaaac aacc a\nc',re.DOTALL))print(re.findall('a.c','a a2c a*c a3c abc a c aaaac aacc a\nc',re.S))# ['a2c', 'a*c', 'a3c', 'abc', 'a c', 'aac', 'aac', 'a\nc']

 关于[]的说明

#[]内部可以有多个字符,但值匹配一个print(re.findall('a[1 23]c','a a2c a*c a3c abc a c aaaac aacc a\nc')) #匹配a c,a1c,a2c,a3c这四种情况# ['a2c', 'a3c', 'a c']print(re.findall('a[a-z]c','a a2c a*c a3c abc a c aaaac aacc a\nc'))# ['abc', 'aac', 'aac']print(re.findall('a[A-Z]c','a a2c a*c aAc abc a c aaaac aacc a\nc'))# ['aAc']print(re.findall('a[a-zA-Z]c','a a2c a*c aAc abc a c aaaac aacc a\nc'))# ['aAc', 'abc', 'aac', 'aac']print(re.findall('a[0-9]c','a a2c a*c aAc abc a c aaaac aacc a\nc'))# ['a2c']print(re.findall('a[^a-zA-Z]c','a a2c a*c aAc abc a c aaaac aacc a\nc'))# ['a2c', 'a*c', 'a c', 'a\nc']#注意,匹配特殊符号最后转义,因为"-" 在中间有范围的歧义print(re.findall('a[\+\-\*\/]c','a a+c a-c a/c a2c a*c aAc abc a c aaaac aacc a\nc'))['a+c', 'a-c', 'a/c', 'a*c']

 转义注意:

#匹配a\c呢?# print(re.findall('a\\c','abc a\c a c aaaac')) #这样写会报错,因为第二个转义,第一个没有转义print(re.findall('a\\\\c','abc a\c a c aaaac')) #这样可以,但是太麻烦# ['a\\c']#python 的rawstringprint(re.findall(r'a\\c','abc a\c a c aaaac'))# ['a\\c']

 #? * +  说明

#? * + {}#?左边那一个字符有0个或1个print(re.findall('ab?','a ab abb aab bbbb'))# ['a', 'ab', 'ab', 'a', 'ab']#* 左边那一个字符有0个或无穷个print(re.findall('ab*','a ab abb abbb abbbbb bbbbb'))# print(re.findall('ab{0,}','a ab abb abbb abbbbb bbbbb'))# ['ab', 'abb', 'abbb', 'abbbbb']#+ 左边那一个字符有一个或无穷个print(re.findall('ab+','a ab abb abbbb bbbbbb'))# print(re.findall('ab{1,}','a ab abb abbbb bbbbbb'))# ['ab', 'abb', 'abbbb']#{n,m}匹配左边的那一个字符,n到m次print(re.findall('ab{3}','a ab abb abbbb bbbbbb'))# ['abbb']print(re.findall('ab{2,3}','a ab abb abbbb bbbbbb'))# ['abb', 'abbb']

 #.* .*?

#.*  贪婪匹配print(re.findall('a.*c','a123c456c'))# ['a123c456c']#.*? 非贪婪匹配print(re.findall('a.*?c','a123c456c'))# ['a123c']

#():分组

#():分组print(re.findall('ab','abababab123'))#['ab', 'ab', 'ab', 'ab'] #匹配到所有ab并显示print(re.findall('(ab)','abababab123'))# ['ab', 'ab', 'ab', 'ab']  #匹配到所有ab并返回括号内的内容,也就是返回所有abprint(re.findall('(a)b','abababab123'))# ['a', 'a', 'a', 'a']   #匹配到所有ab并返回括号内的内容,也就是返回所有aprint(re.findall('a(b)','abababab123'))# ['b', 'b', 'b', 'b']   #匹配到所有ab并返回括号内的内容,也就是返回所有bprint(re.findall('(ab)+','abababab123'))# ['ab']   #匹配到最长的那个,也就是abababab123,并返回括号内的内容,也就是返回abprint(re.findall('(ab)+123','abababab123'))# ['ab']   #匹配到最长的那个,也就是abababab123,并返回括号内的内容,也就是返回abprint(re.findall('(ab)+(123)','abababab123'))# [('ab', '123')]  #匹配到ab最长的且只返回括号的内容,并且跟上123

 返回所有内容:

print(re.findall('(?:ab)+123','abababab123'))#['abababab123']  #匹配到最长的那个,也就是abababab123,并返回所有的内容
print(re.findall('compan(y|ies)','company is not the point,companies also not'))# ['y', 'ies']print(re.findall('compan(?:y|ies)','company is not the point,companies also not'))# ['company', 'companies']

 re其它方法

search

#search 一直找,直到找到一次就返回print(re.search('ab','ababababa123'))# <_sre.SRE_Match object; span=(0, 2), match='ab'>print(re.search('ab','ababababa123').group())# abprint(re.search('ab','12mmmmnnnnnabsssssd').group())# ab

match

#match 从最开始找,找不到就返回Noneprint(re.search('ab','cthhkab883').group())# abprint(re.match('ab','cthhkab883'))# None

 split

print(re.split('b','abcde'))# ['a', 'cde']print(re.split('[ab]','abcde'))# ['', '', 'cde']

sub&subn

#匹配一次print(re.sub('laomao','boss','laomao manage a big troop laomao',1))# boss manage a big troop laomao#匹配两次print(re.sub('laomao','boss','laomao manage a big troop laomao',2))# boss manage a big troop laomao#匹配所有,并返回次数print(re.subn('laomao','boss','laomao manage a big troop laomao'))# ('boss manage a big troop boss', 2)
# 需求:'laomao is old' 替换laomao和old位置# 获取到单词及位置print(re.sub('(\w+)(\W+)(\w+)(\W+)(\w+)',r'\1\2\3\4\5','laomao is old'))# laomao is old#替换print(re.sub('(\w+)(\W+)(\w+)(\W+)(\w+)',r'\5\2\3\4\1','laomao is old'))# old is laomaoprint(re.sub('(\w+)( .* )(\w+)',r'\3\2\1','laomao is old'))# old is laomao

四、时间模块

import timeprint(time.time()) #当前时间戳,从1970年开始# 1543751613.326711print(time.strftime('%Y-%m-%d %X')) # 格式化时间字符串# 2018-12-02 19:53:33print(time.localtime()) #本地时区的struct_time# time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=19, tm_min=53, tm_sec=33, tm_wday=6, tm_yday=336, tm_isdst=0)print(time.gmtime()) #UTC时区的struct_time# time.struct_time(tm_year=2018, tm_mon=12, tm_mday=2, tm_hour=11, tm_min=53, tm_sec=33, tm_wday=6, tm_yday=336, tm_isdst=0)print(time.localtime().tm_mon) #获取本地时区的月# 12print(time.gmtime().tm_mday) #获取UTC时间的日# 2print(time.localtime(144567876)) #将一个时间戳转为当前时区的struct_time# time.struct_time(tm_year=1974, tm_mon=8, tm_mday=1, tm_hour=13, tm_min=44, tm_sec=36, tm_wday=3, tm_yday=213, tm_isdst=0)print(time.mktime(time.localtime())) #将struct_time转为时间戳# 1543751613.0print(time.strftime('%Y-%m-%d %X',time.localtime())) #将本地时区struct_time转为格式化时间# 2018-12-02 19:53:33print(time.strptime('2011-10-02 13:21:46','%Y-%m-%d %X')) #将格式化时间转为struct_time# time.struct_time(tm_year=2011, tm_mon=10, tm_mday=2, tm_hour=13, tm_min=21, tm_sec=46, tm_wday=6, tm_yday=275, tm_isdst=-1)
print(time.ctime())# Sun Dec  2 20:02:29 2018print(time.asctime())# Sun Dec  2 20:02:29 2018print(time.ctime(143958322))# Thu Jul 25 12:25:22 1974

 五、random模块

import randomprint(random.random()) #float类型结果,大于0,小于1之间# 0.008231991538039551print(random.randint(1,6)) #取出大于等于1小于等于6之间的整数# 3print(random.randrange(3,9)) #取出大于等于3,小于9之间的整数# 8print(random.choice(['ckl',3,[7,9],'kk'])) #取出列表中随机一个元素# kkprint(random.sample(['ckl',3,[7,9],'kk'],2)) #取出列表中随机两个元素的组合# ['ckl', 3]print(random.uniform(2,5)) #取出大于2小于5的小数# 2.0408054451427087x=[1,3,5,6,7,9] #随机洗牌random.shuffle(x)print(x)# [5, 1, 3, 7, 9, 6]

生成随机验证码,大写及数字组合

def create_code(n):    code=''    for i in range(n):        x=str(random.randint(0,9))        y=chr(random.randint(65,90))        code+=random.choice([x,y])    return codesc=create_code(6)print(sc)# TR7NL6

 六、os模块

import osos.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname")  #改变当前脚本工作目录;相当于shell下cdos.curdir  #返回当前目录: ('.')os.pardir  #获取当前目录的父目录字符串名:('..')os.makedirs('dirname1/dirname2')    #可生成多层递归目录os.removedirs('dirname1')    #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname')    #生成单级目录;相当于shell中mkdir dirnameos.rmdir('dirname')    #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirnameos.listdir('dirname')    #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印os.remove()  #删除一个文件os.rename("oldname","newname")  #重命名文件/目录os.stat('path/filename')  #获取文件/目录信息os.sep    #输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"os.linesep    #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"os.pathsep    #输出用于分割文件路径的字符串 win下为;,Linux下为:os.name    #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'os.system("bash command")  #运行shell命令,直接显示os.environ  #获取系统环境变量os.path.abspath(path)  #返回path规范化的绝对路径os.path.split(path)  #将path分割成目录和文件名二元组返回os.path.dirname(path)  #返回path的目录。其实就是os.path.split(path)的第一个元素os.path.basename(path)  #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素os.path.exists(path)  #如果path存在,返回True;如果path不存在,返回Falseos.path.isabs(path)  #如果path是绝对路径,返回Trueos.path.isfile(path)  #如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path)  #如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]])  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path)  #返回path所指向的文件或者目录的最后存取时间os.path.getmtime(path)  #返回path所指向的文件或者目录的最后修改时间os.path.getsize(path) #返回path的大小

 七、sys模块

sys.argv           #命令行参数List,第一个元素是程序本身路径sys.exit(n)        #退出程序,正常退出时exit(0)sys.version        #获取Python解释程序的版本信息sys.maxint         #最大的Int值sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值sys.platform       #返回操作系统平台名称

模拟滚动条:

import sysimport time#sys.stdout实现for i in range(20):    sys.stdout.write('\r[%-19s]' %('#'*i))    sys.stdout.flush()    time.sleep(0.3)#print实现for i in range(20):    print('\r[%-19s]' %('#'*i),file=sys.stdout,flush=True,end='')    time.sleep(0.2)

显示:

八、json&pickle

json与python对照表

1.1.将字典存入json

import jsondic = {
'name':'ckl','age':20}#将字典存成json格式with open('a.json','w') as f: f.write(json.dumps(dic))

显示:

{
"name": "ckl", "age": 20}

1.2.读取json内容

import jsonwith open('a.json','r') as f:    data=f.read()    dic=json.loads(data) #反序列化json文件    print(dic) #{'name': 'ckl', 'age': 20}    print(dic['age']) #20

1.3.更简单的写法存入json

import jsondic = {
'name':'ckl','age':20}json.dump(dic,open('b.json','w'))

显示:

{
"name": "ckl", "age": 20}

1.4.简单的打开json

import jsondic=json.load(open('b.json','r'))print(dic)  #{'name': 'ckl', 'age': 20}print(dic['name'])  #ckl

pickle

1.存入字典到pickle

import pickledic = {
'name':'ckl','age':20}# print(pickle.dumps(dic)) #文件为bytes类型with open('d.pkl','wb') as fb: fb.write(pickle.dumps(dic))

结果:

2.读取pickle内容

import picklewith open('d.pkl','rb') as fb: #打开文件以rb方式    dic=pickle.loads(fb.read())  #pickle加载内容    print(dic)

结果:

3.简单写法

3.1.pickle存取字典到文件

import pickledic = {
'name':'ckl','age':20}pickle.dump(dic,open('e.pkl','wb'))

结果:

3.2.读取pickle文件简单写法

import pickleprint(pickle.load(open('e.pkl','rb'))['name'])

结果:

思考:如果pickle存入一个函数呢?

import pickledef func():    print('what a good day!')pickle.dump(func,open('func.pkl','wb'))

文件保存成功:

打开pickle文件:

import picklepickle.load(open('func.pkl','rb'))

结果:

分析:函数是内存地址一段空间,加载完毕就消失了。所以第二次加载pickle文件,无法在内存空间找的func,所以无法加载pickle文件

可以加入一个同名函数?

import pickledef func():    print('useless man')f=pickle.load(open('func.pkl','rb'))print(f)f()

结果:

可以成功加载,结果却是新加的结果?好像没意义

九、shelve模块

shelve模块支持python所有类型,但不通用

存入文件:

import shelvef=shelve.open('info.shel')f['ckl'] = {
'age':22,'hoppy':'lang'}f['zld'] = {
'age':20,'hoppy':'eat'}f.close()

结果:

读取文件内容:

import shelvef=shelve.open('info.shel')print(f['ckl'])print(f['zld']['age'])

结果:

转载于:https://www.cnblogs.com/ckl893/p/6721908.html

你可能感兴趣的文章
XML 浏览器支持
查看>>
mui 上拉加载更多
查看>>
React-Native 之 GD (十五)搜索模块 及 设置模块
查看>>
动态切换采用 CSplitterWnd 静态划分的视图布局(MFC)
查看>>
状态机的设计实例
查看>>
翻译 TI SerialBLEbridge V 1.4.1
查看>>
ThinkPHP I方法
查看>>
CSS选择器的优先级
查看>>
JS中的作用域和作用域链
查看>>
JS实现全排列
查看>>
pycharm的小问题之光标
查看>>
单例模式 双重检查
查看>>
java 代理模式一: 静态代理
查看>>
python函数
查看>>
TCP三次握手
查看>>
动态分配内存
查看>>
在Linux上编译使用tcmalloc
查看>>
HD 1241 Oil Deposits 【深搜】
查看>>
WP8 调用特定API权限不足
查看>>
素数测试算法(基于Miller-Rabin的MC算法) // Fermat素数测试法
查看>>