14--面向过程、匿名函数、内置函数
一、面向过程编程与函数式编程
# 编程思想/范式
# 一.面向过程的编程思想:
核心是"过程"二字,过程即流程,指的是做事的步骤:先什么、再什么、后干什么
基于该思想编写程序就好比在设计一条流水线
# 优点:复杂的问题流程化、进而简单化
# 缺点:扩展性非常差
# 面向过程的编程思想应用场景解析:
1.不是所有的软件都需要频繁更迭:比如编写脚本 典型案例如linux内核,git,httpd
2.即便是一个软件需要频繁更迭,也不并不代表这个软件所有的组成部分都需要一起更迭:
比如 登录(接受用户输入、检核输入的合法性、永久保存)、注册、认证
# 二.函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,
比起面向过程,函数式更加注重的是执行结果而非执行的过程
代表语言有:Haskell、Erlang
而python并不是一门函数式编程语言
但是仍然为我们提供了许多函数式编程好的特性,如lambda、map、reduce、filter
二、匿名函数
# 1.def用于定义有名函数
# func=函数的内存地址
def func(x,y):
return x+y
print(func)
# 2.lamdab用于定义匿名函数
print(lambda x,y:x+y)
# 3.调用匿名函数
# 方式一:
res=(lambda x,y:x+y)(1,2)
print(res)
# 方式二: # 不建议这样用,这样直接赋值给变量,就相当于定义一个有名函数了。
func=lambda x,y:x+y
res=func(1,2)
print(res)
# 4.匿名函数的使用场景:
基本上使用于临时调用一次的场景:
更多的是将匿名与其他函数配合使用(就是作为其他函数的参数,内部临时使用)
三、部分内置函数、以及与匿名函数的综合应用
1. 以下函数都支持迭代器协议,用来处理可迭代对象
2. 4/5/6 在实际开发中,我们完全可以用列表生成式或者生成器表达式来实现三者的功能
1.max的应用--最大值
# max(可迭代对象, key=func)
key=func func是max的比较依据,默认为空
# 1.没有指定key时,max()默认以参数1的可迭代对象每次迭代后返回的值来作为比较的依据
# 2.指定key时,max()执行时,会是将 参数1的可迭代对象每次迭代后返回的值 作为该函数的参数,
然后该函数的返回值,来作为max比较的依据
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
# 需求1:找出薪资最高的那个人==》lili
# 分析过程:
# 1.没有指定key时,max() 默认可迭代对象迭代的值来作为比较的依据
列表是每个元素来迭代遍历
res=max([3,200,11,300,399])
print(res) # 399
# 字典是以键来迭代遍历
res=max(salaries)
print(res) # 'tom'
# 2.现在需求是需要以字典的值来比较,故需要定义key=func()
# 迭代出的内容 比较的值
'siry' 3000
'tom' 7000
'lili' 10000
'jack' 2000
# 3.定义func(),来返回字典的值,用来作为比较依据
def func(k):
return salaries[k]
res=max(salaries,key=func) # 返回值=func('siry')
print(res)
# 4.实际中该比较依据函数func() 通常是临时使用一次,故设置成匿名函数更加合理
res=max(salaries,key=lambda k:salaries[k])
print(res)
2.min的应用--最小值
res=min(salaries,key=lambda k:salaries[k])
print(res)
3.sorted的应用--排序
sorted(可迭代对象, key=func,reverse=True)
key=func func是比较依据,默认为空
reverse=True 是否翻转,默认是从小到大排序,默认为false
# 原理跟max()是一样的,内部也存在一个迭代比较,只是返回的不是单个值,而是一个新的比较后的排序列表
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)
4.map的应用--映射
map(func,可迭代对象)
func是映射后处理函数
# 原理:将可迭代对象每次迭代后返回的值,加上处理函数后的结果
python2中是将结果以列表返回,python3中以生成器返回
l=['alex','lxx','wxx','薛贤妻']
new_l=(name+'_dsb' for name in l)
print(new_l)
res=map(lambda name:name+'_dsb',l)
print(res) # 生成器
5.filter的应用--过滤
filter(func,可迭代对象)
func是过滤函数,返回布尔值
# 原理:将可迭代对象每次迭代后返回的值,以过滤函数进行过滤后的结果(将布尔值为True进行保留)
python2中是将结果以列表返回,python3中以生成器返回
l=['alex_sb','lxx_sb','wxx','薛贤妻']
res=(name for name in l if name.endswith('sb'))
print(res)
res=filter(lambda name:name.endswith('sb'),l)
print(res)
6.reduce的应用--合并(了解)
# 在python2中,是内置函数
# 但在python3中,已经将其取消了内置函数,放在了functools模块中
reduce(func,可迭代对象, 初始值)
接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值
from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3],10) # 16
print(res)
res=reduce(lambda x,y:x+y,['a','b','c']) # 'abc'
print(res)
四、常见内置函数
# =================》掌握
# 1 abs: 求绝对值
abs(-1) # 1
# 2 all: 判断是否全为真 只要传的参数有一个为假,结果为假
all([1,0]) # False
all([]) # True
# 3 any: 判断是否有一个为真 只要传的参数有一个为真,结果为真
any([1,0]) # True
# 4 bin、oct、hex : 10进制转换其他进制
bin 10进制转二进制
oct 10进制转八进制
hex 10进制转十六进制
# 5 callable: 判断对象是否是可调用的
callable(len) # True
# 6 chr、ord: 字母、数字 在ASCII表的对应
chr 数字在ASCII表对应的字母
ord 字母在ASCII表对应的数字
chr(65) # 'A'
ord('A') # 65
# 7 dir: 查看对象的属性列表 无参数时,获得当前模块的属性列表
l = [1,2]
dir(l) # ['__add__', '__class__' ...]
# 8 divmod: 返回除法的商和余数 常用来 数据分页展示
print(divmod(10000,33)) # (303, 1)
# 9 enumerate: 枚举函数 将可迭代对象的值 和 索引,以元祖形式返回
参数 start: 下标起始位置的值
for i,v in enumerate(['a','b','c'], start=1):
print(i,v)
# 10 eval: 将字符串 以表达式执行 并返回表达式的值
res=eval('{"a":1}') # 相当于定义一个字典
print(res,type(res)) # {'a':1} dict
# 11 exec: 执行储存在字符串或文件中的Python语句
相比于eval,exec可以执行更复杂的Python代码
exec("""
for i in range(5):
print(i)
""") # 0 1 2 3 4
# 12 isinstance: 判断是否是某类的实例化对象,常用来判断是不是某个类型
class Foo:
pass
obj=Foo()
print(isinstance(obj,Foo))
print(isinstance([],list)) # 类型判断推荐使用isinstance
print(type([]) is list) # 不推荐使用
# 13 __import__(str) # 将字符串作为模块导入,常用来初始化环境配置时,直接将文本作为模块导入
import 'time' # 错误 正常导入时 应是模块名称变量 不是字符串
time=__import__('time')
time.sleep(3)
# 14 pow: 计算次方 或 次方再求余数 (取模)
pow(x,y): 返回x的y次方的值
pow(2, 3) # 8
pow(x,y,z): 返回x的y次方的值对z取余(x**y%z)
pow(2,3,2) # 2 2**3 % 3 = 2
# 15 reversed: 翻转 逆序
l = [1, 3, 4]
list(reversed(l)) # [4, 3, 1]
# 等同于:列表的 reverse()
l.reverse()
l # [4, 3, 1]
# 16 round: 返回浮点数x的四舍五入值
round(10/3, 2) # 浮点数,保留小数位数
# 3.33
# 17 zip:: 拉链函数 将两个可迭代对象中对应的元素一一结合,以短的一方结束 # 打包为元组的列表
v1='hello'
v2=[111,222,333,444,5555,6666]
res=zip(v1,v2)
print(list(res))
# [('h', 111), ('e', 222), ('l', 333), ('l', 444), ('o', 5555)]