python高阶函数、匿名函数和模块
主要内容:
一、python高阶函数
1. map()函数
- 接收2个参数:函数(有名或匿名函数)、Iterable(可迭代对象)。
- 作用:将传入的函数依次作用到序列的每一个元素上,并把结果作为新Iterator(迭代器)返回。
1.1 函数与变量
data = abs #把函数赋给变量
data(-20)
1.2 map()函数举例:
def fun1(x):
return x*x
list(map(fun1,range(1,10)))
names = ['LIly','rOSe','sunFLOWer','daISy','MORe']
def chTitle(s):
#return s.title()
return s[0].upper() +s[1:].lower()
list(map(chTitle,names))
list(map(str.title,names))
datas = list(range(1,7))
list(map(str,datas))
2. reduce()函数
- 作用:把结果继续和序列的下一个元素做累积计算
- 要求:需要引用 functools模块
- 求和可以用python内建函数sum()
reduce()函数举例:将[2,0,4,8] 转换成 2048
from functools import reduce
datasource = [2,0,4,8]
def powers(x,y):
return x*10+y
reduce(powers,datasource)
链式写法
list(map(fun1,datasource))
reduce(powers,map(fun1,datasource))
3. filter()函数
- 作用:过滤序列
- 接收2个参数:函数、序列
- 把传入的函数依次作用于每个元素,根据返回值的真假决定是否保留该元素
def not_empty(s):
return s and s.strip()
list(filter(not_empty,'Mona lisa'))
**输出:
['M', 'o', 'n', 'a', 'l', 'i', 's', 'a']
datas = [12,0.3,None,False,'','126',33,-45,7.2]
def numData(s):
#return isinstance(s,(int,float))
return isinstance(s,(int,float)) and s!=False
list(filter(numData,datas))
4. sorted()函数
- 作用:对列表、元组进行排序
- 可以接收一个key函数实现自定义排序
- 第三个参数:reverse = True, 可以反向排序
numDatas = [30,-50,-18,9,17,-22]
sorted(numDatas) #默认升序
sorted(numDatas,key=abs) #按绝对值排序
sorted(numDatas,key=abs,reverse=True) #绝对值降序
字符串排序:
strData = ['username','Monalisa','carch']
sorted(strData)
sorted(strData,key=str.upper)
二、匿名函数
- 关键字:lambda
- 要求:只能有一个表达式,不用写return,返回值就是表达式结果。
举例:[2,0,4,8] ==> 2048:
reduce(lambda x,y:x*10+y,datasource)
求字符串中每个单词的长度:
list(map(lambda s:len(s),strData))
三、模块
1.模块简介
- 作用:能有逻辑地组织自己的python代码段,把相关大妈分配到一个模块中,能更好用好懂。
- 可以定义函数、类、变量
2.创建模块
#模块的文档注释
'a test module'
#__author__ 变量记录作者
__author__ = 'Monalisa'
#模块中的函数
def test():
print('hello my tiny world!')
3. import 语句
- 引用python模块
4. from…import 语句
- 从模块中导入一个指定的部分到当前命名空间中
5. 常用内建模块
- datatime 处理时间/日期标准库
- collections 集合模块
- base64 用64个字符表示任意二进制数据
- struct 解决bytes与其他二进制数据类型转换
- hashlib 常见摘要算法
- itertools 用于操作迭代对象
- XML 解析DOM和SAX
- HTMLParser 解析HTML模块
四、正则表达式
1. 操作符号
- . 任意一个字符
- /d 匹配0-9
- /s 匹配字符
- ^ 匹配字符串开头
- dollar符号 匹配字符串结尾
- \w
- {num1,num2} 至少匹配num1~num2次
-
- 匹配0~n次
-
- 匹配1~n次
- ? 匹配 0/1次
- *? 非贪婪匹配,最小匹配
- [a,b] 字符集,单个字符的选择范围
- [^ ] 非字符集,单个字符的排除范围
- | 左右任意选一个
2. 正则表达式简介
- 作用:简洁表达一组字符串、通用字符串表达框架
- 用途:字符串匹配、同时查找或替换一组字符串
五、Re 库
1. 主要功能函数
- re.search() 字符串中搜索匹配正则的第一个位置
- re.match()
- re.findall()
- re.split()
- re.finditer()
- re.sub()
import re
strName = 'Hello my tiny world'
print(re.match(r'my',strName))
if re.match(r'Hello',strName):
print('匹配成功!')
print(re.search(r'my',strName))
per = re.search(r'world',strName)
index = per.span()[0]
strName[:index]
str1 = 'One111Two2Three33333Four4'
re.split(r'\d+',str1)
str2 = 'One1 11Two2 Three33 33 3Four'
re.findall(r'[a-zA-z]+',str2)
python默认最大匹配,这里展示的是最小匹配:
str3 = '<a href="http://www.baidu.com">baidu</a><a href="http://www.taobao.com">taobao</a>'
re.findall(r'href="(.*?)"',str3)
案例1:12306自动抢票
- 打开12306网站,进入开发者模式并刷新
- 在sources中找到resources==>framework==>station_name.js,保存到本地(比如E盘)
- 打开station_name.js,用正则表达式取出站点名称和对应大写字母,压缩成字典
with open('E:/station_name.js','r',encoding = 'utf-8') as f:
#以utf-8编码方式读取E盘上的station_name.js,赋给f
jsText = f.read() #将读取到的内容赋给jsText
#找到内容的起始和结束位置
firstIndex = jsText.index('\'')
lastIndex = jsText.rindex('\'')
jsText = jsText[firstIndex+1:lastIndex] #切片
import re
#正则表达式匹配中文和对应大写字母
chData = re.findall(r'[\u4e00-\u9fa5\s]+',jsText) #有些站点名相同但其中一个站点名有空格,采用\s处理
upperData = re.findall(r'[A-Z]+',jsText)
dict(zip(upperData,chData)) #压缩,转换为字典
案例2:将网络上的图片写到本地
- 网络信息分为两大类:文本数据(字符串数据流)和多媒体数据(图像、视频、音频、办公软件类型的数据,二进制数据)。
import requests #网络爬虫请求库,包含如何做反爬机制的定义
url = 'https://goss.veer.com/creative/vcg/veer/612/veer-159497091.jpg'
ret = requests.get(url)
fileName = url.split('/')[-1]
with open('E:\\'+fileName,'wb') as f:
f.write(ret.content)