函数和函数式编程

python的过程就是函数,因为解释器会隐式地返回默认值None。


实际编程中大部分偏函数更接近过程,不显示地返回任何东西。


当没有显示地返回元素或者如果返回None时,python会返回一个None。


*  元组    **  字典


def子句的剩余部分包括了一个虽然可选但是强烈推荐的文档字串和必须的函数体。


函数的子句由声明的标题行以及随后的定义体组成。


装饰器是在函数调用之上的修饰。


装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数。


@decorator(dec_opt_args)

def func2Bdecorated(func_opt_args):

    :


装饰器可以如函数调用一样“堆叠”起来。


@g

@f

def foo():

    :

...与foo=g(f(foo))相同


@deco1(deco_arg)

@deco2

def func():pass

这等价于:

func=deco1(deco_arg)(deco2(func))


装饰器实际就是函数。他们接收函数对象。


在装饰器中置入通用功能的代码来降低程序复杂度。

·引入日志

·增加计时逻辑来检测性能

·给函数加入事务的能力


函数式是可以被引用的,也作为参数传入函数,以及作为列表和字典等容器对象的元素函数有一个独一无二的特征使它同其他对象区分开来,那就是函数式可调用的。


所有的对象都是通过引用来传递的,函数也不例外。


foo          函数对象的引用

foo()       函数对象的调用



如果没有值传递给那个参数,那么这个参数将取默认值。


所有必须的参数都要在默认参数之前。


在函数调用时,接受一个不定(非固定)数目的参数。


“*”操作符之后的形参将作为元组传递给函数,元组保存了所有传递给函数的“额外”的参数。如果没有给出额外的参数,元组为空。

def function_name([formal_args,] *vargs_tuple):

    "function_documentation_string"

    function_body_suite


使用字典保存参数名与参数值。“**”是被重载了的以便不与幂运算发生混淆。关键字变量参数应该为函数定义的最后一个参数,带“**”。

def function_name([formal_args,] [*vargst,] **vargsd):

    "function_documentation_string"

    function_body_suite


关键字和非关键字可变参数都有可能用在同一个函数中,只要关键字字典是最后一个参数并且非关键字元组先于它之前出现。


元组和字典参数仅仅是被调函数中最终接收的元组和字典的子集。


匿名函数与lambda


lambda [arg1[,arg2,...argN]]:expression

这个表达式的定义体必须和声明放在同一行。参数是可选的。


lambda语句由于性能的原因,在调用时绕过函数的栈分配。lambda表达式运作起来就像一个函数,当被调用时,创建一个框架对象。


偏函数应用


一个带n个参数,curried的函数固化第一个参数为固定参数,并返回另一个带n-1个参数函数对象。这种函数将任意数量(顺序)的参数的函数转化成另一个带剩余参数的函数对象。


当调用带许多参数的函数的时候,PFA是最好的方法。


如果你创建了不带base关键字的偏函数,这可能会让参数以错误的顺序传入int()。


关键字参数总是出现在形参之后。


变量作用域


标识符的作用域是定义为其声明在程序里的可应用范围,或者即是我们所说的变量可见性。变量可以是局部域或者全局域。


定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。


声明适用的程序的范围被称为了声明的作用域。在一个过程中,如果名字在过程的声明之内,它的出现即为过程的局部变量;否则的话,出现即为非局部。


一个变量的作用域和它寄住的名称空间相关。


在全局或者内建的名称空间内,可以覆盖任何匹配的名字。


如果将全局变量的名字声明在一个函数体内的时候,全局变量的名字能被局部变量给覆盖掉。


为了明确地引用一个已命名的全局变量,必须使用global语句。


虽然存在多个函数的嵌套,但你不能访问超过两个作用域。


如果在一个内部函数里,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。


闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。


闭包对于安装计算、隐藏状态和在函数对象和作用域中随意地切换是很有用的。


一个lambda表达式定义了新的作用域,所以这个作用域除了局部lambda函数,对于程序其他部分,该作用域都是不能对进行访问的。


在lambda语句中的表达式有和函数相同的作用域。


任何时候,总有一个或者两个活动的作用域。


在任何给定的时间,存在两个或者三个的活动的名称空间。从函数内部,局部作用域包围了局部名称空间,第一个搜寻名字的地方。如果名字存在的话,那么将跳过检查全局作用域。


如果函数包含了对其自身的调用,该函数就是递归的。如果一个新的调用能在相同过程中较早的调用结束之前开始,那么该过程就是递归。









本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1960332,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华大学《操作系统》(七):虚拟存储、覆盖、交换

接下来几节都是对虚拟存储的讲解。虚拟存储是非连续存储管理的扩展。通过将内存中的数据暂存到外存的方式,为进程提供更大的内存空间。虚拟存储出现的主要原因是因为程序规模的增长速度远远大于存储器容量的增长速度,导致内存空间不够用。其实针对内存空…

遵义大数据中心项目工程概况_市委书记张新文到曹州云都大数据中心等项目现场调研建设情况...

4月25日,市委书记张新文到曹县调研重点项目建设情况,研究推进措施。市委常委、秘书长任仲义参加活动。张新文首先来到曹州云都大数据中心项目建设现场,查看项目推进情况。曹州云都大数据中心,是涵盖云计算区、研发办公区、公寓生活…

linux 可执行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnus Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Com…

Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Googles BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前&a…

清华大学《操作系统》(八):置换算法

功能:置换算法是指当出现缺页异常时,需要调入新页面而内存已满时,置换算法选择被置换的物理页面。 设计目标: 尽可能减少页面的调入调出次数;把未来不再访问或短期内不访问的页面调出。 页面锁定: 了解具…

python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)

python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用。处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件:Received: from …

烂泥:通过vsphere给esxi添加本地硬盘

公司ESXi服务器的硬盘空间不够使用,现在新加了一块硬盘在ESxi服务器上。在服务器上添加完硬盘后,在Vsphere上是看不到新加硬盘的。 下面我们来通过虚拟机模拟该情况,先添加一块硬盘。如下图: 在Esxi添加完硬盘后,现在通…

清华大学《操作系统》(九):进程和线程

进程 定义: 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。 组成: 代码数据状态寄存器(正在运行的一个程序的所有状态信息):CPU状态CP0、指令指针IP通用寄存器:AX、BX、CX…

开始Flask项目

1.新建Flask项目。2.设置调试模式。3.理解Flask项目主程序。4.使用装饰器,设置路径与函数之间的关系。5.使用Flask中render_template,用不同的路径,返回首页、登录员、注册页。6.用视图函数反转得到URL,{{url_for(‘login’)}}&am…

gcc交叉编译的实现

gcc支持多种不同的语言,也支持多种不同的CPU架构。在它的实现上,不同语言编译的实现是通过conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;这个结构体的不同定义来实现的。比如c语言的编译器就通过gcc/c-lang.c指定了lang_hooks这个结构体的…

烂泥:mysql数据库使用的基本命令

1、连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot -p123456 也可写成: mysql -h 192.168.1.214 -u root -p 123456 1.2连接本地数据库 mysql -uroot -p123456 也可写成: mysql -u root -p 123456 2、…

mse均方误差计算公式_PCA的两种解读:方差最大与均方误差最小的推导

这张图片很关键,来自统计学习方法的PCA插图又要考试了,推导一下方差最大化与均方差最小化,老师上课讲了一些均方差最小化,推导的过程很详细不过自己没有记下来,复习的时候再推一遍加深印象。感谢 耳东陈 老师的精彩课件…

《操作系统》OS学习(十):进程控制

进程切换(上下文切换): 定义:暂停当前运行进程,从运行状态变成其他状态,调度另一个进程从就绪状态变成运行状态要求:切换前,保存进程上下文;切换后,恢复进程…

日志管理

1、错误日志配置 错误日志属于核心功能模块的参数 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置这一行即可 events {worker_connections 1024; }语法规则:error_log file level 错误的日志级别有[debug|info|notice|warn|err…

GCC 命令选项使用详解

GCC 命令行详解[转帖] 1、gcc包含的c/c编译器 gcc、cc、c、g gcc和cc是一样的,c和g是一样的,一般c程序就用gcc编译,c程序就用g编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为t…

mvn 打包_Spark源码打包编译的过程

前言上篇文章介绍了下 安装sbt环境 启动scala项目安装SBT环境运行Scala项目为什么要弄这个 因为我本来是想对spark源码编译部署spark是用scala语言编译的spark源码https://gitee.com/pingfanrenbiji/sparkspark提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

审计日志功能监控

背景:公司的审计日志经常出现不记录命令的情况,但是又无法监控到审计功能是否正常。所以我们思路是,每天从CMDB服务器 ssh登录到每一台主机。如果审计功能正常,则一定会在auditlog.info文件中有登录的记录。如果24小时内这个文件没…

清华大学《操作系统》(十一):处理机调度

一、处理机调度概念 进程切换(上下文切换):切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文 CPU调度:从就绪队列中挑选一个进程/线程作为CPU…

通过纯css实现图片居中的多种实现方式

html结构&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 实现img位于外层div的居中显示…

GCC 命令行详解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c编译器 gcc,cc,c,g,gcc和cc是一样的&#xff0c;c和g是一样的&#xff0c;(没有看太明白前面这半句是什 么意思:))一般c程序就用gcc编译&#xff0c;c程序就用g编译 2。gcc的基本用法 gcc test.c这样将编译出一个…