函数式编程与内置函数

函数作用域:

  1. def test1():
  2. print('in the test1')
  3. def test():
  4. print('in the test')
  5. return test1()
  6.  
  7. res = test()
  8. print(res())
  9.  
  10. =========因为test中没有return值,所以默认为NONE.
  1. name = 'alex'
  2. def foo():
  3. name='xtjiayou'
  4. def bar():
  5. print(name)
  6. return bar
  7. a = foo()
  8. print(a)
  9. #return bar与return bar()不同,第一个是返回函数的内存地址,第二个是返回
  10. xtjiayou
  11. None
  12.  
  13. name = 'alex'
  14. def foo():
  15. name='linhaifeng'
  16. def bar():
  17. print(name)
  18. return bar
  19. a = foo()
  20. print(a)
  21. a() #a()执行bar内存地址不所存储的代码
  22.  
  23. ===========
  24. <function foo.<locals>.bar at 0x000002067F719840>
  25. linhaifeng

注意:以上面代码为准foo()()相当于执行了a =foo()  a()的作用。依次类推若有多层return 函数名(没有括号),可以使用多个括号,进行执行内存地址中代码。

示例:

  1. def foo():
  2. name = 'xtznb'
  3. print(name)
  4. def bar():
  5. name = 'xtcnb'
  6. print(name)
  7. def tt():
  8. print(name)
  9. return tt
  10. return bar
  11. r1 = foo()
  12. r2 = r1()
  13. r3 = r2()
  14. ==============#或者把后三句改为r1 = foo()()()
  15. xtznb
  16. xtcnb
  17. xtcnb

匿名函数:不应该独立存在,应该与其他函数共同使用。

定义方法:lambda 形式参数: 代码

  1. #利用赋值语句,进行引用匿名函数,但一般不这么用。
  2. func = lambda x:x+1
  3. print(func(10))
  4.  
  5. name = 'alex'
  6. def change_name():
  7. return name+'_sb'
  8.  
  9. fo = lambda x:x+'_sb'
  10. fo(name)
  11. ==========>>alex_sb 匿名函数和自定义函数作用一样,但更简洁,只能使用一行代码。

编程方法论:面向过程、函数式、面向对象

函数式编程:编程语言定义的函数 + 数学意义的函数

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

而函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。

我们首先要搞明白计算机(Computer)和计算(Compute)的概念。

在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语言是最贴近计算机的语言。

而计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。

对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

高阶函数:满足1.函数接受的参数是一个函数名 2.返回值中包含函数

  1. #返回值中包含函数
  2. def foo():
  3. print('from foo')
  4. return bar
  5. def bar():
  6. print('from bar')
  7.  
  8. n = foo()
  9. n()
  10. def handle():
  11. print('from handle')
  12. return handle()
  13. handle()
  14. ======================
  15. from foo
  16. from bar
  17. from handle

函数尾调用:在函数最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

  1. def test(x):
  2. if x > 1:
  3. return True
  4. elif x == 1:
  5. return False
  6. else:
  7. return True
  8. n = input('please a number')
  9. print(test(int(n,10))) #尾调用示例 True
  • map函数依次处理每个列表元素
  • filter函数依次筛选列表的每一个值,最后得一个列表
  • reduce函数把两个完整的序列压缩到一起

map函数

  1. 注意
  2. num_l = [1,2,3,4,5,6]
  3. def add_one(x):
  4. return x+1
  5. def reduce_one(x):
  6. return x-1
  7. def pf(x):
  8. return x**2
  9. def map_test(func,array):
  10.  
  11. ret = []
  12. for i in num_l:
  13. res = add_one(i)
  14. ret.append(res)
  15. return ret
  16. print(map_test(reduce_one,num_l))
  17.  
  18. #终极版本
  19. def map_test(func,array):
  20. ret=[]
  21. for i in num_l:
  22. res=func(i)
  23. ret.append(res)
  24. return ret
  25.  
  26. print(map_test(lambda x:x+1,num_l))
  27.  
  28. map内置高级函数用法
  29. num_l=[1,2,3,4,5]
  30. print(list(map(lambda x:x+1,num_l)))
  31. msg='linhalifneg'
  32. print(set(map(lambda x:x.upper(),msg)))


filter函数

  1. #过滤函数的功能
  2. movie_people = ['alex','wupe_sb','xsss_sb','sql_sb']
  3.  
  4. def sb_show(n):
  5. return n.endswith('sb')
  6. def filter_test(func,array):
  7. ret = []
  8. for p in array:
  9. if not func(p):
  10. ret.append(p)
  11. return ret
  12. res = filter_test(sb_show,movie_people)
  13. print(res)
  14.  
  15. #filter函数格式:filter(过滤方法,可迭代变量)
  16. #过滤方法可以是匿名函数
  17. movie_people = ['alex','wupe_sb','xsss_sb','sql_sb']
  18.  
  19. res = filter(lambda n:not n.endswith("_sb"),movie_people)
  20. print(list(res)) =======>>['alex']

reduce函数

from functools import reduce 从此模块中导入reduce函数

  1. #可以起到reduce作用
  2. num_l=[1,2,3,100]
  3. def reduce_test(array):
  4. res=0
  5. for num in array:
  6. res+=num
  7. return res
  8. print(reduce_test(num_l))
  9. #终极版的reduce功能
  10. numl=[1,2,3,100] lambda x,y:x*y,numl
  11. def multi(x,y):
  12. return x*y
  13.  
  14. num_l=[1,2,3,100]
  15.  
  16. def reduce_test(func,array):
  17. res=array.pop(0) #取出第一个值,以便进行下面运算
  18. for num in array:
  19. res=func(res,num)
  20. return res
  21. print(reduce_test(lambda x,y:x*y,num_l))
  22.  
  23. #指定起始值,在进行运算 注意:init不是替代第一个而是被添加到第一个
  24. num_l=[1,2,3,100]
  25.  
  26. def reduce_test(func,array,init=100):
  27. if init is None:
  28. res=array.pop(0)
  29. else:
  30. res=init
  31. for num in array:
  32. res=func(res,num)
  33. return res
  34.  
  35. print(reduce_test(lambda x,y:x*y,num_l))
  36.  
  37. #reduce函数 注意:reduce(某功能函数,可迭代变量,起始值)
  38. from functools import reduce
  39. num_l=[1,2,3,100]
  40. print(reduce(lambda x,y:x*y,num_l,2))

 内置函数

  1. bool() #转换为布尔值 空,None,0为假值
  2. int() #转换为整型
  3. float() #转换为浮点型数据
  4. len() #测试字符串长度或者统计可迭代对象的元素个数
  5. list() #转换为列表
  6. tulple() #转换为元组
  7. dict() #转换为字典
  8. set() #转换为集合
  9. str() #转换为字符串型
  10. 例如:dic={'name':'alex'}
  11. dic_str=str(dic ===》‘{‘name’:‘Alex’}’
  12.  
  13. hex() #十进制转16进制
  14. oct() #十进制转8进制
  15. id() #打印对象的内存地址
  16. input() #输入字符
  17. isinstance() #判断值与类型是否一致
  18.  
  19. globals() #打印全局变量
  20. locals() #打印局部变量
  21.  
  22. abs() #绝对值函数
  23. all() #若一个为假即为假,全真即为真 注意只能有一个参数,可以是列表
  24. any() #任意一个为真即为真
  25. chr() # 把ASCII码值转为对应的字符 chr(97) ====>>A
  26. ord() #与chr()正好相反,通过字符转换为ASCII码值
  27. pow(x,y) #x的y次幂,若是3个参数则对第三个进行取余运算。
  28. round(3.5)#四舍五入函数,===》4
  29. reversed()#反转序列,前面加上个可迭代对象才能看出来
  30. sorted() #排序,默认升序,注意:;不同类型不能排序
  31.  
  32. max() #取最大值 ha=[1,2,199,-1] max(ha)===>>199
  33. min() #取最小值
  34. age_dic = {'age1':18,'age2':81,'age3':11,'age4':28,'age5':180}
  35. print(max(age_dic.values()))
  36. #不同类型不能进行比较,字典不能比较,因为它是无序的
  37. l=['a10','b12',100]
  38. print(list(max(l)))
  39.  
  40. #拉链函数,产生生一个内存对象,可利用列表、元组等可迭代对象进行输出,注意一一对应输出
  41. zip(('a','b','c'),(1,2,3)) =======》[('a',1),('b',2),('c',3),]
  42. 例如:若要使字典中keyvalue一一对应
  43. p={'name':'alex','age':18,'gender':'none'}
  44. print(list(zip(p.keys(),p.values())))
  45. ===>>[('name', 'alex'), ('age', 18), ('gender', 'none')]
  1. dir(byte('我是gbk编码',encoading='gbk')) #打印某一对象中有哪些属性与方法
  2. help() #打印帮助信息,用于查看函数是干什么的

  3. slice(初始,结束,步长) #定义切片,可读性好
    li='hello'
    s = slice(2,52)) ====>lo
    s.start s.stop s.step =====>> 2 5 2
  4.  
  5. frozenset() #返回一个冻结的可迭代对象,冻结后序列不能再添加或删除任何元素
  6.  
  7. divmod(10,3)==>(3,1) #多用于分页,结果左侧表示一共多少页,右侧表示剩下多少条记录
  8. eval() #1.提取出字符串中的数据结构, 2.把字符串表达式进行运算
  9. express='1+2*(3/3-1)-2'
  10. print(eval(express)) ====》-1.0
  11.  
  12. #把字符串转换为字节形式,必须进行编码,也可以进行解码。注意:utf-8编码使一个字符等于3个字节,gbk 一个字符等于两个字节,ASCII码不能编码中文
  13. bytes('你好'encoading="utf-8") #解码:用什么编码就用什么解码 默认解码是gbk
  14. bytes('hello,boy!',encoading='utf-8').decode('utf-8')
  15.  
  16. hash() #进行哈希运算,可哈希的数据类型即不可变数据类型,不可变哈希类型即可变数据类型。不管输入数据多大,哈希值都定长,不可根据哈希值逆推回字符串。注意:哈希可用于判定软件木马,当下载一个软件包时产生一个哈希值,当安装时又产生一个,两个相互对比可判断是否被添加了木马或其他信息。

max、min函数高级用法

  1. 1.max函数处理的是可迭代对象,相当于一个for循环去除每个元素进行比较,注意:不同类型之间不能进行比较
    2.每个元素间进行比较,都是从第一个位置依次比较。
  1. people=[
    {'name':'王八','age':1000},
    {'name':'龟','age':10000},
    {'name':'九千岁','age':9000},
    {'name':'alex','age':18}
    ]
  2.  
  3. print(max(people,key=lambda dic:dic['age']))
  4.  
  5. ret=[]
    for item in people:
    ret.append(item['age'])
    print(ret)
    max(ret)
  1. sum函数:求和函数 例如:sum(range(5)) sum(可迭代对象)
  1. locals() 打印局部变量,以字典形式
    vars([object]) 返回是字典形式,若没有参数相当于locals()函数,若有参数(strint。。。)则将其所以方法存入字典形式
  2.  
  3. _import_() 导入模块,模块就是py文件
  1. #test.py
  2. def sya_hi():
  3.   print('hello,handsome young man!')
  1.  
  1. import test
  2. tst.say_hi()
  1.  
  1. _import_('test') #按字符串样式导入模块
  1. import() #不能调用字符类型模块
  2.  

Python从入门到精通之eighth!的更多相关文章

  1. python从入门到精通之30天快速学python视频教程

    点击了解更多Python课程>>> python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv pyth ...

  2. Python从入门到精通之Sixth!

    补充:enumerate 函数用于遍历序列(元组tuple.列表list.字典dict)中的元素以及它们的下标: >>> for i,j in enumerate(('a','b', ...

  3. Python从入门到精通之Forth!

    Python基本数据类型之列表 补充:range()方法 python2: range   立即创建 xrange  for循环的时候才一个一个创建 Python3: range     for循环的 ...

  4. Python从入门到精通之Third!

    Python运算符 算数运算符:+    -    *   /     %    //    **  比较运算符:==    >     <     >=   大于等于      & ...

  5. Python从入门到精通之Second!

    初识Python基础! -基础     -扩展名可以是任意的,但是导入模块时,如果不是.py文件就会报错. -两种执行方式      1.python解释器       文件名.py 文件路径 -Li ...

  6. Python从入门到精通之First!

    Python的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jy ...

  7. Python从入门到精通之环境搭建

    本章内容: Windows系统环境搭建 Linux系统环境搭建 Mac OS系统环境搭建 一.下载python安装包 下载地址:https://www.python.org/downloads/ 二. ...

  8. Python从入门到精通之Seventh!

    函数浅析:可以减少代码重用,保持一致性,可扩展性,易维护性. 定义方法:def 函数名(形参):     '''功能注释'''      代码块 打印函数名时,会出现函数的内存地址.两个函数名相同时, ...

  9. Python从入门到精通之Fifth!

    字典  类名:dict   字典是无序的. 字典的创建  info = {"k1":{1:"abc",[1,2,3]},"k2":True} ...

随机推荐

  1. 如何清空css 的默认边距

    在网页开发中,html的元素,有部分元素默认是有内外边距的,例如body 元素,是有默认边距的 所以在通常情况下,我们都要先清空元素的内外边距:使用通配符选择器* 清空元素的内边距和外边距 ;; } ...

  2. webservice 教程

    https://ke.qq.com/webcourse/index.html#cid=28875&term_id=100182700&taid=800324205965515& ...

  3. 可视化svg深入理解viewport、viewbox、preserveaspectradio

    直接运行此例子 深入理解svg的viewport.viewbox.preserveaspectradio实例 <!DOCTYPE html> <html lang="en& ...

  4. js一行代码解决各种IE兼容问题

    在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实 IE给出了解决方案 Google也给出了解决方案 百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html ...

  5. CentOS 6.5 64位下安装Redis3.0.2的具体流程

    系统环境:CentOS 6.5 64位 安装方式:编译安装 防火墙:开启 Redis版本:Redis 3.0.2 一.环境准备 1.安装 gcc gcc-c++ [root@iZ94ebgv853Z ...

  6. 工程启动没有报错,但是dubbo后台显示没有提供者,工程没有提供服务

    先说一下我遇到的问题:服务工程启动没有异常,消费者工程启动会出现很多nested(嵌套的)错误,但其根本错误是No provider available(缺少服务提供者).可是服务工程起来的时候明明没 ...

  7. BackgroundWorker 组件

    代码: static void Main(string[] args) { BackgroundWorker bw = new BackgroundWorker(); bw.WorkerReports ...

  8. springboot+maven整合spring security

    springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...

  9. ceph mimc版本ceph-deploy安装与配置

    系统环境centos7.6 内核5.0.9 YUM源配置 [root@k8s-sys-10-82-4-200 ceph-cluster]# cat /etc/yum.repos.d/ceph.repo ...

  10. jsp九个内置对象、四个域对象及Servlet的三大域对象

    一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...