前言

  • 学习渠道:慕课网:Python进阶
  • 记录原因:我只是想边上课边做笔记而已,呵呵哒
  • 食用提示:教程环境基于Python 2.x,有些内容在Python 3.x中已经改变

函数式编程

  • 定义:一种抽象计算的编程模式
  • 特点

    • 把计算视为函数而非指令
    • 纯函数式编程不需要变量,没有副作用,一个函数任意执行多少次结果都是确定的,测试简单
    • 支持高阶函数,代码简单
  • Python支持的函数式编程

    • Python允许变量,不是纯函数式编程
    • 支持高阶函数,函数可以作为变量传入
    • 支持闭包,可以返回函数
    • 有限度地支持匿名函数

高阶函数

  • 定义:能接受函数作为参数的函数
  • 特点

    • 变量可以指向函数
    • 函数名其实就是指向函数的变量
    import math
    def add(x, y, f) :
return f(x) + f(y)
    print add(25, 9, math.sqrt);

8.0

- ###map()
- Python内置的高阶函数
- map(fun, list)将函数fun依次作用在list的每个元素上
- map()不改变原有list,而是返回一个新的list
- map()可以处理包含任何类型的list,只要传入的fun可以处理
    def fort_name(s) :
return s.capitalize(); #首字母大写,其余小写
# return s[0].upper()+s[1:].lower();
# return s.title();
    print map(format_name, ['adam', 'LISA', 'barT'];
# Python3中需要用户list()转换map()
print (list(map(format_name, ['adam', 'LISA', 'barT']));
print (list(map(lambda x: x.capitalize(), ['adam', 'LISA', 'barT'])));
# 可以处理字符串含有空格的情况?
print [name.capitalize() for name in [' adam ', ' LISA ', ' barT ']];

['Asam', 'Lisa', 'Bart']

- ###reduce()
- Python内置的高阶函数(Python3之后移除了,[关于移除](https://www.artima.com/forums/flat.jsp?forum=106&thread=98196))
- reduce(fun, list)对list的每个元素**反复**调用函数fun,并返回最终结果值
- reduce(fun, list, val0)还可接收一个计算初值
    from functools import reduce
# Python3中reduce()被从全局名字空间里移除了,现在被放置在functools模块中,使用前需要引用
    def prod(x, y) :
return x * y
    print reduce(prod, [2, 4, 5, 7, 12])

3360 # 2 * 4 * 5 * 7 * 12 = 3360

- ###filter()
- Python内置的高阶函数
- filter(fun, list)对list的每个元素进行判断,返回True或False
- filter()根据判断结果,返回由符合条件的元素组成的新list
    import math
    def is_sqr(x) :
return math.sqrt(x) % 1 == 0
    print filter(is_sqr, range(1, 101))

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

- ###sorted()
- Python 内置的高阶函数
- sorted(list) 对 list 进行排序
- sorted(list, cmp_fun) 传入一个函数对 list 排序
- cmp_fun(x, y) :如果 x 应排在 y 前面,返回 -1;如果 x 应排在 y 后面,返回1;如果 x 和 y 相等,返回0
    def cmp_ignore_case(s1, s2):
# return cmp(s1.lower(), s2.lower());
if (s1.lower() < s2.lower()) :
return -1;
elif (s1.lower() > s2.lower()) :
return 1;
else :
return 0;
    print sorted(['bob', 'about', 'Zoo', 'Credit'])
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
# print (sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case))

['Credit', 'Zoo', 'about', 'bob'] # 'Z' 的ASCII码比 'a' 小

['about', 'bob', 'Credit', 'Zoo']

- ###返回函数
- 在函数 f() 中定义函数 g() ,返回函数 **g**
- 可以把一些计算延迟
    def calc_prod(lst) :
def mult_ prod() :
return reduce(lambda x, y : x * y, lst)
return mult_prod
    # 调用calx_prod()没有返回计算结果,而是返回函数
delay_calc = calc_prod([1, 2, 3, 4])
    # 对返回函数进行调用时,才获得结果(延迟)
print delay_calc()

24

- ###闭包
- 定义:内层函数引用了外层函数的局部变量(参数),然后返回内层函数的情况
- 在函数内部定义的函数无法被外部访问,为防止不必要的调用,可将函数移入函数内部
- 正确使用闭包,要确保局部变量在函数返回后不能变。即:**返回函数不要引用任何循环变量,获后续会发生变化的变量**
    def count() :
fs = []
for i in range(1, 4) :
def f() :
return i*i
fs.append(f)
return fs
    f1, f2, f3 = count()
# f1=count()[0],f2=count()[1],f3=count()[2]
    print f1(), f2(), f3()

9, 9, 9

    # fs存放的是f(),并没有进行i的计算
# f()只在执行时才去获取外层参数i
# 等f()执行时,i的值已经改变
# fs = [i*i, i*i, i*i]
    def count():
fs = []
for i in range(1, 4):
def f(j = i): # changed
return j * j # changed
fs.append(f)
return fs
    f1, f2, f3 = count()
print f1(), f2(), f3()

1, 4, 9

    # 问题的产生是因为函数只在执行时才去获取外层参数i,若函数定义时可以获取到i,问题便可解决
# 默认参数可以在完成定义时获取i值
- ###匿名函数
- 定义:`lambda 函数参数:表达式`
- 限制:只能有一个表达式,返回值就是表达式的结果
- 不需要显式地定义函数,可简化代码
- 可以被返回
    def is_not_empty(s):
return s and len(s.strip()) > 0
    print filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
# 效果等同与于
print filter(lambda s:s and len(s.strip()) > 0, ['test', None, '', 'str', ' ', 'END'])
- decorator装饰器
- 本质:其实就是定义一个高阶函数,它接收一个函数作为参数,然后返回一个新函数
- 作用:定义了一个函数,运行时动态增加功能,又不改动函数本身的代码
- 使用:decorator用Python提供的@语法,简化代码,避免每个函数编写重复性代码
- 打印日志:@log
- 检测性能:@performance
- 数据库事务:@transaction
- URL路由:@post('/register')


Python学习 - 入门篇2(更新中)的更多相关文章

  1. Python学习 - 入门篇1

    前言 学习渠道:慕课网:Python入门 记录原因:人总归要向记忆低头[微笑再见.gif] 记录目标:形成简洁的知识点查阅手册 变量和数据类型 变量 赋值 在Python中,可以把任意数据类型赋值给变 ...

  2. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  3. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  4. Python之入门篇1

    一.安装python解释器 官网: https://www.python.org/downloads/windows/ 自行下载安装,添加环境变量 #测试安装是否成功 windows --> 运 ...

  5. Kotlin教程——史上最全面、最详细的学习教程,持续更新中....

    关于这个系列教程,我是从最基础的开发环境搭建到项目进阶到后面的项目开发这个过程来写的.我一直秉承从实际项目开发以及源码解析的角度去写好这个教程,并让从未接触过编程的朋友能学好kotlin这门语言.所以 ...

  6. 《Java从入门到放弃》入门篇:hibernate中的多表对应关系

    hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些 ...

  7. python正则表达式入门篇

    文章来源于:https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. ...

  8. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径

    REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...

  9. 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...

随机推荐

  1. 针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题

    一.针对shiro框架authc拦截器认证成功后跳转到根目录,而非指定路径问题 首先,我们先来了解一下authc登录拦截器工作原理 authc拦截器有2个作用: 1>登录认证     请求进来时 ...

  2. 大数据学习之Hadoop运行模式

    一.Hadoop运行模式 (1)本地模式(默认模式): 不需要启用单独进程,直接可以运行,测试和开发时使用. (2)伪分布式模式: 等同于完全分布式,只有一个节点. (3)完全分布式模式: 多个节点一 ...

  3. python列表学习

    #创建列表,通过[]来创建列表my_list=[] #创建了一个空列表#print(my_list,type(my_list)) #列表追存储的数据,我们称为元素#一个列表中可以存储多个元素,也可以在 ...

  4. 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

    原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+ ...

  5. scala (7) Set and Tuple

    /** * 不可变长Set集合 */ val set0 = Set(1, 2, 3, 4, 5) //++并没有改变原有的set集合,只是将两个set进行合并形成新的set集合 val newSet0 ...

  6. Altera三速以太网IP核使用(下篇)--- 百兆网接口设计与使用

    MAC IP核的主要作用是:实现数据链路层协议,分为TX方向与RX方向,TX方向实现的是在原包文的前面加上7个55和1个D5,RX方向则相反.在使用这个 MAC IP核之前,首先确认下自己使用的网卡是 ...

  7. PL/SQL轻量版(三)——游标与异常处理

    一.游标 1.概念 游标是一个 指向上下文的句柄( handle) 或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上下文区会发生些什么事情. 2.游标处理 处理显式游标 主要包含以下四个 ...

  8. 20155305《信息安全系统设计基础》10月18日课堂 fork,exic,wait

    20155305<信息安全系统设计基础>10月18日课堂 fork,exic,wait fork()函数 1.fork函数作用 一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序 ...

  9. 20155325 2016-2017-2 《Java程序设计》第2周学习总结

    教材学习内容总结 上节课讲了些思维方法:git,vim的使用技巧,推荐了picpick截图软件. 第三章书本上涵盖了基本语法内容 由于在语法方面java和c有相似之处,所以我重点关注不同之处和易忽略之 ...

  10. spring boot启动报内存溢出的问题

    问题: springBoot项目,已经两次了,启动报内存溢出,内存泄露 分析: 内存泄露是因为垃圾回收器想要回收程序不用的对象,但是该对象还有引用存在 解决: 1.第一次是mybatis文件和Java ...