目录
一、什么是函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
二、函数
1.定义一个函数
规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
给我的感觉是没有括号的C语言
def 函数名(传入的参数):
函数内容
return[可以没有返回值]
2.函数的调用
函数名(参数)
参数分形参和实参,定义过程中的参数为形参,只是一个参数,表示占一个参数的位置调用过程中的参数为实参,代表一个具体的参数值
def Add(a,b):#ab为形参
return a+b
>>> Add(1,2)#1,2为ab对应的实参
3
3.函数文档
函数名.__doc__ 可查看函数文档,函数文档为脚本式内引号内的内容,注意doc前后的下划线都为英文两条也就是“_”","_",而不是一条下划线
>>> print()._doc_#一条报错
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
print()._doc_
AttributeError: 'NoneType' object has no attribute '_doc_'
>>>
>>> print.__doc__#两条ok
"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, or to sys.stdout by default.\nOptional keyword arguments:\nfile: a file-like object (stream); defaults to the current sys.stdout.\nsep: string inserted between values, default a space.\nend: string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream."
>>>
4.参数
关键字参数:指定实参对应的形参,格式如Add(a=1,b=2),它的好处是允许函数调用时参数的顺序与声明时不一致
收集参数,不定长参数:加了星号 * 的参数,可以以元组(tuple)的形式导入参数,存放所有未命名的变量参数。不知道有几个参数的时候用
5.函数的作用域
全局变量:函数外定义的变量
局部变量:函数内定义的变量(和C语言一样),比全局变量执行效率高
如果函数内全局变量和局部变量同名,只使用局部变量
global关键字:用局部变量改全局变量
>>> def ManFun():
count =10
print(count)
>>> ManFun()
10
>>> count=5#全局变量
>>> ManFun()
10
>>> count
5 #没用global()无法通过局部变量,改变全局变量
>>> def ManFun():
global count
count =10
print(count)
>>> ManFun()
10
>>> count=5#全局变量
>>> ManFun()
10
>>> count
10 #使用global()通过局部变量,改变全局变量为10
>>>
6.内嵌函数
Python3 命名空间和作用域 | 菜鸟教程 (runoob.com)
函数内定义一个函数,也叫内部函数。就是个套娃
内部函数整个定义域都在外部函数之内,也就是说交互模式(外部函数外)不能直接调用内部函数
闭包:python中从表现形式上定义如果在一个内部函数里对外部作用域(但不是全局作用域)的变量进行引用内部函数就被认为是闭包
输出局部变量,和全局变量
输出局部变量print(locals())
输出全部变量print(globals())
nonlocal关键字:如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字,也就是闭包改闭包外一层的变量
如下实例:
>>> >>> def outer():
b=10
def outer2():
print(b)#可以调用
outer2()
>>> outer()
10
>>>
#———————————————————————————————————————————————————————————————————————————————————————
>>> def outer():
b=10
def outer2():
b=20
print(b)
outer2()
>>> outer()
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
outer()
File "<pyshell#38>", line 6, in outer
outer2()
File "<pyshell#38>", line 4, in outer2
print(b)
UnboundLocalError: local variable 'b' referenced before assignment#报错:赋值前引用了局部变量“b”
#———————————————————————————————————————————————————————————————————————————————————————
>>> def outer():
b=10
def outer2():
nonlocal b#声明外部变量的局于变量后可以执行
b=20
print(b)
outer2()
>>> outer()
20
7.匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。代码更加简洁,不用命名,可读性高
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法:lambda [arg1 [,arg2,.....argn]]:expression
>>> a=lambda x,y : x**y
>>> a(2,3)
8
>>>
8.过滤器
filter(过滤函数,要过滤的内容)
>>> filter(None,[1,2,0,True,False])
<filter object at 0x0000015FA224EBB0>
>>> list(filter(None,[1,2,0,True,False]))
[1, 2, True]
>>>
——————————————————————————————————————————————————
>>> list(filter(lambda x: x%2,range(10)))
[1, 3, 5, 7, 9]
>>> list(filter(lambda x: x%2,range(10)))
——— ———1— —2——— —3—————— ———— ——————4—————
———————5—————
1.将内部结果转换为列表
2.过滤器
3.匿名函数
4.要过滤的内容
5.过滤的条件(过滤偶数)
map(函数,将加工的元素):map表示映射,将函数的每一个元素当做函数的参数进行运算加工,直到每个元素加工完毕返回到一个新序列
>>> list(map(lambda x : x%2,range(10)))
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
>>> list(map(lambda x : x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>>
9.legb规则
就是Python查找名规则
- L(Local):最内层,包含局部变量,比如一个函数/方法内部。
- E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- G(Global):当前脚本的最外层,比如当前模块的全局变量。
- B(Built-in): 包含了内建的变量/关键字等,最后被搜索。
规则顺序: L –> E –> G –> B。
在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。