python3 入门 (三) 函数与lambda表达式、闭包

函数 是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。

  • 函数代码块以def关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

函数的定义:

1 def test0():
2     "函数_文档字符串"
3     print(‘函数内部‘)
4
5 print(test0.__doc__)  # 函数_文档字符串

若采用默认参数定义函数,调用函数时,缺省参数的值如果没有传入,则被认为是默认值:

1 def test1(arg1=‘参数一‘, arg2=‘参数二‘):
2     print(‘arg1:‘+arg1)
3     print(‘arg2:‘+arg2)
4
5 test1()  # arg1:参数一  arg2:参数二
6
7 # 默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的
8 test1(‘ice‘, ‘cream‘)  # arg1:ice  arg2:cream
9 test1(arg2=‘cream‘, arg1=‘ice‘)  # arg1:ice  arg2:cream

不定长参数。加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可:

 1 def test2(*args, param):
 2     print(len(args))
 3     for arg in args:
 4         print(arg)
 5     print(param)
 6
 7 test2(1, 2, 3, 4, param=‘This is param‘)
 8
 9
10 def test3(param, *args):
11     print(param)
12     print(len(args))
13     for arg in args:
14         print(arg)
15
16 test3(‘This is param‘, 1, 2, 3, 4)

所有参数(自变量)在Python里都是按引用传递。如果在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了

 1 def test4(mylist):
 2     print(mylist)
 3     mylist.clear()
 4     print(mylist)
 5
 6 mylist = [1, 2, 3, 4]
 7 test4(mylist)
 8 print(mylist)
 9
10 # 输出:
11 # [1, 2, 3, 4]
12 # []
13 # []

return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None

 1 def test5():
 2     return (1, 2, 3, 4)
 3
 4
 5 def test6():
 6     return 1, 2, 3, 4
 7
 8
 9 def test7():
10     return [1, 2, 3, 4]
11
12 result = test5()
13 print(result)  # (1, 2, 3, 4)
14
15 result = test6()
16 print(result)  # (1, 2, 3, 4)
17
18 result = test7()
19 print(result)  # [1, 2, 3, 4]

内部函数。函数体内可以再定义函数:

 1 def outerFunc():
 2     print(‘Outer Funtion‘)
 3     def innerFunc():
 4         print(‘Inner Function‘)
 5     innerFunc()
 6
 7 outerFunc()
 8
 9 # 输出:
10 # Outer Funtion
11 # Inner Function

函数变量作用域

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

 1 temp = ‘ice cream‘
 2
 3 def test8():
 4     "全局变量可以在整个程序范围内访问"
 5     print(temp)
 6
 7
 8 def test9():
 9     inner_temp = ‘ice‘
10     print(inner_temp)
11
12 print(temp)  # ice cream
13 test8()  # ice cream
14 test9()  # ice
15
16
17 # 局部变量只能在其被声明的函数内部访问
18 print(inner_temp)  # 报错  name ‘inner_temp‘ is not defined
19
20 def test10():
21     print(temp)  # 报错  local variable ‘temp‘ referenced before assignment
22     temp = ‘ice‘
23     print(temp)

Python闭包

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量

 1 def FuncX(x):
 2     def FuncY(y):
 3         return x * y
 4     return FuncY
 5
 6 tempFunc = FuncX(3)
 7 result = tempFunc(5)
 8 print(result)  # 15
 9
10 result = FuncX(3)(5)
11 print(result)  # 15

匿名函数

python 使用 lambda 表达式来创建匿名函数

  • lambda只是一个表达式,函数体比def简单很多
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
  • lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

lambda函数的语法只包含一个语句: lambda [arg1 [,arg2,.....argn]]:expression

使用如下:

1 square = lambda x : x**2
2 print(square(3))  # 9
3
4 sum = lambda  x, y : x + y
5 print(sum(2, 3))  # 5

内置函数filter的使用:

官方文档内容如下:

filter(functioniterable)

Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

function参数可传入None、函数、lambda表达式,iterable参数传入一个可迭代对象。

若function参数为None:返回可迭代对象中所有不为False的元素

若function参数为函数或lambda表达式:返回  将元素作为函数参数、函数返回值为True  的元素

 1 reslut = filter(None, [1, 0, False, True])
 2 print(list(reslut))  # [1, True]
 3
 4 def odd(num):
 5     return num % 2
 6
 7 reslut = filter(odd, range(10))
 8 print(list(reslut))  # [1, 3, 5, 7, 9]
 9
10 reslut = filter(lambda num: num % 2, range(10) )
11 print(list(reslut))  # [1, 3, 5, 7, 9]
时间: 2024-10-05 16:32:49

python3 入门 (三) 函数与lambda表达式、闭包的相关文章

Swift语法基础入门三(函数, 闭包)

Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 { 函数实现部分 } 没有参数没有返回值 可以写为 ->Void 可以写为 ->() 可以省略 Void.它其实是一个空的元组(tuple),没有任何元素,可以写成() func say() -> V

C#语法之匿名函数和Lambda表达式

上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结.还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题.在使用委托时首先要声明代理,然后实例化,并将委托对象和已定义好的函数关联上,最后调用.这里与已定义好的函数关联的事情,如果函数是经常使用的也还好,如果不是经常使用的可能只调用一次,那这岂不是老费劲了.就是能不能在使用的时候定义下呢?于是乎有了匿名方法. 一.匿名方法的使用. 匿名方法的使用步骤和委托的使用步骤

【Python笔记】Python的几个高级语法概念浅析:lambda表达式 && 闭包 && 装饰器

本文主要记录自己对几个高级语法概念的理解:匿名函数.lambda表达式.闭包.装饰器. 这几个概念并非Python特有,但本文只限于用Python做说明. 1. 匿名函数 匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合: 1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的

C# 匿名函数和Lambda 表达式

匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数,以下主题中分别讨论了这些函数: Lambda Expressions (C# Programming Guide). ' data-guid="7df86c4348dea57abb774138a7de05b8">Lambda 表达式(C# 编程指南) . 匿名方法(C# 编程指南) 说明

3 委托、匿名函数、lambda表达式

委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式 // 声明一个委托 delegate void Printer(string s); class TestClass { static void Main() { //lambda表达式 Printer pp = x => { Console.WriteLine(&quo

委托,匿名函数和lambda表达式

很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一下自己对他的印象,顺便把自己的感悟和想法写出来,以便自己能有更深的理解,由于本人水平有限,也欢迎大家多多探讨,有问题大家一起解决一起进步. MSDN上面对委托的定义是:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在我看来委托的特性主要在: 1.把一个方法当做一个参数传递给

(一)Python入门-5函数:07lambda表达式和匿名函数-eval()函数

一:lambda表达式和匿名函数 lambda表达式可以用来声明匿名函数.lambda 函数是一种简单的.在同一行中定义函数 的方法.lambda函数实际生成了一个函数对象. lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数 的返回值. lambda表达式的基本语法如下: lambda arg1,arg2,arg3... : <表达式> arg1/arg2/arg3为函数的参数.<表达式>相当于函数体.运算结果是:表达式的运算结果. #lambd

JAVA 8 主要新特性 ----------------(三)新功能Lambda表达式入门

一.简述 Java为了扩充匿名方法在1.8中新追加的特性.本身Java之前的版本是没有匿名方法的,只有匿名对象. 二.使用 Java中使用匿名方法必须要对应接口中的一个抽象方法.(要有一个匿名方法,需要函数去接收它) 三.为什么使用 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. 四.实例一:从匿名类到 Lamb

C#匿名委托,匿名函数,lambda表达式

一.类型.变量.实例之间的关系. 类型>变量>实例 类型可以创建变量,实体类可以创建实例,实例可以存储在变量里. 二.委托使用过程: 1.定义委托(写好签名): 2.创建委托变量: 3.在委托变量里放函数(相同的签名). 事件:用预先定义好的委托(EventHandle)的定义的变量(接收两个参数). 窗体里自带一个委托变量:我们做的就是给这个变量追加函数. 给窗体Load事件添加一个函数 public partial class Form1 : Form { public Form1() {