八.Python的函数

目录

一、什么是函数

二、函数

1.定义一个函数

2.函数的调用

3.函数文档

4.参数

5.函数的作用域

6.内嵌函数

7.匿名函数



一、什么是函数

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

二、函数

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

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值