[笔记][cloudera课程][python数据分析]python高阶函数、匿名函数和模块

7 篇文章 0 订阅
5 篇文章 0 订阅

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自动抢票
  1. 打开12306网站,进入开发者模式并刷新
  2. 在sources中找到resources==>framework==>station_name.js,保存到本地(比如E盘)
  3. 打开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:将网络上的图片写到本地
  1. 网络信息分为两大类:文本数据(字符串数据流)和多媒体数据(图像、视频、音频、办公软件类型的数据,二进制数据)。
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值