python3 入门 (三) 函数与lambda表达式、闭包
来源:互联网 发布:网上淘宝刷单兼职 编辑:程序博客网 时间:2024/06/06 02:03
函数 是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。
- 函数代码块以def关键词开头,后接函数标识符名称和圆括号()
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
- 函数内容以冒号起始,并且缩进
- Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
函数的定义:
def test0(): "函数_文档字符串" print('函数内部')print(test0.__doc__) # 函数_文档字符串
若采用默认参数定义函数,调用函数时,缺省参数的值如果没有传入,则被认为是默认值:
def test1(arg1='参数一', arg2='参数二'): print('arg1:'+arg1) print('arg2:'+arg2)test1() # arg1:参数一 arg2:参数二# 默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的test1('ice', 'cream') # arg1:ice arg2:creamtest1(arg2='cream', arg1='ice') # arg1:ice arg2:cream
不定长参数。加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可:
def test2(*args, param): print(len(args)) for arg in args: print(arg) print(param)test2(1, 2, 3, 4, param='This is param')def test3(param, *args): print(param) print(len(args)) for arg in args: print(arg)test3('This is param', 1, 2, 3, 4)
所有参数(自变量)在Python里都是按引用传递。如果在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了
def test4(mylist): print(mylist) mylist.clear() print(mylist)mylist = [1, 2, 3, 4]test4(mylist)print(mylist)# 输出:# [1, 2, 3, 4]# []# []
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None
def test5(): return (1, 2, 3, 4)def test6(): return 1, 2, 3, 4def test7(): return [1, 2, 3, 4]result = test5()print(result) # (1, 2, 3, 4)result = test6()print(result) # (1, 2, 3, 4)result = test7()print(result) # [1, 2, 3, 4]
内部函数。函数体内可以再定义函数:
def outerFunc(): print('Outer Funtion') def innerFunc(): print('Inner Function') innerFunc() outerFunc()# 输出:# Outer Funtion# Inner Function
函数变量作用域
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
temp = 'ice cream'def test8(): "全局变量可以在整个程序范围内访问" print(temp)def test9(): inner_temp = 'ice' print(inner_temp)print(temp) # ice creamtest8() # ice creamtest9() # ice# 局部变量只能在其被声明的函数内部访问print(inner_temp) # 报错 name 'inner_temp' is not defineddef test10(): print(temp) # 报错 local variable 'temp' referenced before assignment temp = 'ice' print(temp)
Python闭包
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量
def FuncX(x): def FuncY(y): return x * y return FuncYtempFunc = FuncX(3)result = tempFunc(5)print(result) # 15result = FuncX(3)(5)print(result) # 15
匿名函数
python 使用 lambda 表达式来创建匿名函数
- lambda只是一个表达式,函数体比def简单很多
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
- lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
lambda函数的语法只包含一个语句: lambda [arg1 [,arg2,.....argn]]:expression
使用如下:
square = lambda x : x**2print(square(3)) # 9sum = lambda x, y : x + yprint(sum(2, 3)) # 5
内置函数filter的使用:
官方文档内容如下:
filter(function, iterable)
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 的元素
reslut = filter(None, [1, 0, False, True])print(list(reslut)) # [1, True]def odd(num): return num % 2reslut = filter(odd, range(10))print(list(reslut)) # [1, 3, 5, 7, 9]reslut = filter(lambda num: num % 2, range(10) )print(list(reslut)) # [1, 3, 5, 7, 9]
博客园博客:欠扁的小篮子
- python3 入门 (三) 函数与lambda表达式、闭包
- Java SE8 Lambda 基础入门---lambda表达式与闭包(closure)
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
- C++11闭包函数:Lambda表达式的使用λ
- java1.8 lambda表达式 函数式编程 闭包
- lambda表达式的解析(五) Lambda表达式与闭包类型
- jdk8新特性:Lambda表达式(也称为闭包、可传递的匿名函数)与函数式接口@FunctionalInterface
- Lambda与闭包
- 函数表达式与闭包
- python3入门与进阶(三)
- python3 lambda 表达式以及在map函数中的应用
- 闭包的概念和闭包与lambda表达式的关系
- C++ 理解函数对象与lambda表达式
- 委托(四):函数参数与Lambda表达式
- 函数式接口与 Lambda表达式
- C++ lambda表达式与函数对象
- Java8:函数式编程与Lambda表达式
- 欧拉函数之HDU2588 GCD
- C++ 定义实用比较函数(Custom Compare Function) 注意点
- 八大排序算法
- Java JDBC方式连接Access数据库
- 【标准】ISO14001:2015新版标准正式发布
- python3 入门 (三) 函数与lambda表达式、闭包
- [Usaco2008 Open]Crisis on the Farm 牧场危机
- MonaServer增加luasocket脚本
- spring mvc(2):请求地址映射(@RequestMapping)
- LeetCode---Populating Next Right Pointers in Each Node
- 拷贝构造函数
- Android四大组件之--BroadcastReceiver,监测手机电量变化
- ios之开发者个人账号申请 (2015WWDC下半年新版)
- 你不知道的sql小知识