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)]
posted @ 2022-06-19 10:21  Edmond辉仔  阅读(29)  评论(0)    收藏  举报