函数和函数式编程

Python的函数可以返回一个值或者对象。若无返回值,默认返回None。若返回多个对象,实际返回一个元组。

函数是通过赋值(对象引用)传递的。调用者以及函数通过引用共享对象,但是不需要别名。改变函数中的参数名并不会改变调用者中的变量名,但是改变传递的可变对象可以改变调用者共享的那个对象。

函数名是一个对象的引用,可以自由地把这个对象赋给其他的名称并且通过任何引用调用它。


变量作用域:

函数定义了本地作用域,而模块定义的是全局作用域。变量分别对应三种不同的作用域:

1、若一个变量在def内赋值,它被定位在这个函数内。

2、若一个变量在一个嵌套的def中赋值,对于嵌套的函数,它是非本地的

3、若在def外赋值,它就是整个文件全局的。

如果需要给一个在函数内部却位于模块文件顶层的变量名赋值,需要在函数内部通过global语句声明。注意在原处改变对象并不会把变量划分为本地变量,实际上只有对变量名赋值才可以。例如L在顶层被赋值为一个列表,在函数内部像L.append(x)并不会将L划分为本地变量,而L=x却可以。记住:修改一个对象并不是对一个名称赋值。

在函数内对变量名赋值将会将其划分为本地变量,本地变量在引用前需定义!!!

变量名引用分为三个作用域进行查找:首先是本地,之后是函数内,之后全局,最后是内置。(LEGB)

当在函数中给一个变量名赋值时(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中声明为全局变量。

lambda:Python允许用lambda关键字创造匿名函数,用合适的表达式(而非语句)调用lambda生成一个可以像其他函数一样使用的函数对象。lambda表达式引入了新的本地作用域。

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

def maker(N):    def action(X):        return X ** N    return action    f=maker(2)  #f : <function action at ....>f(3)  #9

#外部函数maker生成并返回了一个嵌套的函数,却并不调用这个内嵌的函数。内嵌的函数记住了N的值。#实际上,本地作用域内的N作为状态信息被保留下来

也可以用类来替代闭包。

函数参数:

func(value) 调用者 常规参数:通过位置进行匹配
func(name=value) 调用者 关键字参数:通过变量名匹配
func(*seq) 调用者 传递所有对象,并作为独立的基于位置的参数(解包)
func(**dict) 调用者 成对的传递所有关键字/值,并作为独立的关键字参数(解包)
def func(name) 函数 常规参数:通过位置或变量名匹配
def func(name=value) 函数
默认参数

def func(*name) 函数 匹配并收集所有包含位置的参数,并作为元组传递给函数(收集)
def func(**name) 函数 匹配并收集所有包含位置的参数,并作为字典传递给函数(收集)

Python中允许的函数调用的完整语句为:

func(value,name=value,*seq,**dict)

函数定义头部的完整语句为:

def func(name,name=value,*name,**name)

关于A函数调用B函数,两者的声明顺序:B函数无论是在A函数之前声明还是在之后声明都可以,只要保证调用A函数的语句在B函数的声明之后就可以。

函数属性:在函数外可以向函数附加用户定义的属性。eg:函数func,func.count=0。像count这种变量的名称对于一个函数来说是本地的,但是,其值在函数退出后仍然保留。

内建函数:

apply(func[,nkw][,kw]):用可选的参数来调用func,nkw为非关键字函数,kw为关键字函数;返回值是函数调用的返回值。

filter(func,seq):调用一个布尔函数来迭代遍历每个seq中的元素;返回一个使函数返回值为True的元素的序列。

map(func,seq1[,seq2...]):将函数作用于给定序列的每个元素,并用一个列表来提供返回值;若func为None,func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表(同zip)。

reduce(func,seq[,int]):将二元函数作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列元素)连续地将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列的头两个元素。

偏函数应用:固化第一个参数为固定参数,并返回另一个带n-1个参数函数对象。

from operator import addfrom functools import partialadd1=partial(add,1)  #add1(x)==add(1,x)

使用偏函数时注意关键字参数。

Python是静态检测Python的本地变量,当编译def代码时,不是通过发现赋值语句在运行时进行检测的。也就是说,在函数中一旦发现赋值语句就将其变量视为本地变量,即使赋值在引用之后。(如果赋值在引用之后,若无global声明,则引用会报错)

时间: 2024-10-06 14:19:18

函数和函数式编程的相关文章

Python函数以及函数式编程

本文和大家分享的主要是python 函数及函数式编程相关内容,一起来看看吧,希望对大家 学习python有所帮助. 函数基本语法及特性 定义 数学函数定义: 一般的,在一个变化过程中,如果有两个变量 x 和 y ,并且对于 x 的每一 个确定的值, y都有唯一确定的值与其对应,那么我们就把 x 称为自变量,把 y 称为因变 量, y 是 x 的函数.自变量 x 的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很  同的  函数是逻辑结构化和过程化的一种编程方法 函数的

python基础13函数以及函数式编程

主要内容 函数基本语法及特性 参数与局部变 返回值 4.递归 名函数 6.函数式编程介绍 阶函数 8.内置函数 函数基本语法及特性 定义 数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一 个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变 量,y是x的函数.自变量x的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很 同的 函数是逻辑结构化和过程化的一种编程方法 函数的优点 减少重复代码 使程序变的可扩展 使程序

python 函数和函数式编程

什么是函数 调用函数 创建函数 传入函数 形参 变长参数 函数式编程 变量的作用域 递归 生成器 1 什么是函数 函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理 的小块,把重复代码放到函数中而不是进行大量的拷贝--这样既能节省空间,也有助于保持一致性,因为你只需改变单个的拷贝而无须去寻找再修改大量复制代码的拷贝. 1.1 过程 vs 函数 在C++里我不记得有过程这种东西,但是在一些其它的语言比如PL/SQL里面会有过程.过程和函数一样是可以调用的代码块,但是

Python核心编程读笔 9:函数和函数式编程

第11章 函数和函数式编程 一 调用函数 1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 foo(): foo(42)  foo('bar')  foo(y) 关键字调用 foo(): foo(x=42)  foo(x='bar')  foo(x=y) 即明确给出相应的参数名 2 参数组 Python允许程序员执行一个没有显式定义参数的函数,相应的方法是通过一个把元组(非关键字参数)或字典

函数与函数式编程

函数与函数式编程 介绍 在过去的十年间,大家广为熟知的编程方法无非两种:面向对象和面向过程,其实,无论哪种,都是一种编程的规范或者是如何编程的方法论.而如今,一种更为古老的编程方式:函数式编程,以其不保存状态,不修改变量等特性重新进入人们的视野.下面我们就来依次了解这一传统的编程理念,让我们从基本的函数概念开始. 函数定义: 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的

Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") return test1 res = test() print(res) 输出结果 test <function test1 at 0x021F5C90> 分析:这里print(res)输出的是te

python函数及函数式编程

函数是对程序逻辑进行结构化或过程化的一种编程方法.函数与过程相比,两者都是可以被调用的实体,但是传统意义上的函数或者"黑盒",可能不带任何输入参数,经过一定的处理,最后向调用者传回返回值,而过程是简单.特殊.没有返回值的函数.其实,python的过程就是函数,因为在函数中如果没有显式return返回值的话,解释器会隐式地返回默认值None. 1.函数定义 def foo([argument-list]): "function_document_string" foo

Python基础函数之函数式编程

一. 匿名函数 匿名函数就是不需要显示的指定函数,只要运行过一次后就立马释放内存空间. 主要表现形式为: lambda 形参:具体功能 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10)) 你也许会说,用上这个东西没感觉有毛方便呀, ....呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下 res = map(lambda x:x**2,[1,5

python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r

一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x print(f) #打印指向该函数的内存地址 print(f(5)) #内存地址(5) 调用运行该函数 def cala(x): y=x*x return y z=cala(5) print(z) >>> <function <lambda> at 0x10137d950&g

11 函数和函数式编程 - 《Python 核心编程》

?? 什么是函数 ?? 调用函数 ?? 创建函数 ?? 传入函数 ?? 形参 ?? 变长参数 ?? 函数式编程 ?? 变量的作用域 ?? 递归 ?? 生成器 11.1 什么是函数? 函数是对程序逻辑进行结构化或过程化的一种编程方法. 函数可以以不同的形式出现. declaration/definition          def foo(): print 'bar' function object/reference    foo function call/invocation