python函数详解

写博客能更好的梳理知识体系,整理思路。
最近重拾python,仗剑走天涯。

python函数

函数定义

def 函数名(参数列表):
	//功能代码
	[return [返回值]]

函数调用

[返回值] = 函数名([形参值])

函数传递

Python 中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递。
值传递:适用于实参类型为不可变类型(字符串、数字、元组);
引用(地址)传递:适用于实参类型为可变类型(列表,字典);

python位置参数

意思是调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。

python关键字参数

可以避免牢记参数位置的麻烦,令函数的调用和参数传递更加灵活方便。

关键字参数是指使用形式参数的名字来确定输入的参数值。通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。

python函数的默认参数

Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。这样的话,即便调用函数时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值。
语法格式

def 函数名(...,形参名,形参名=默认值):
    代码块

在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。

python函数可变参数(*args,**kwargs)

即传入函数中的实际参数可以是任意多个。
定义可变参数,主要有以下2种形式:
(1)形参前面添加一个‘*’

*args

args 表示创建一个名为 args 的空元组,该元组可接受任意多个外界传入的非关键字实参。
注意的是:当可变参数作为第一个参数时,在调用该函数时,必须以关键字参数的形式给普通参数传值,否则 Python 解释器会把所有参数都优先传给可变参数,如果普通参数没有默认值,就会报错。

(2)形参前面添加两个‘*’

**kwargs

**kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。

注意*args 可变参数的值默认是空元组,**kwargs 可变参数的值默认是空字典。

python逆向参数收集

Python 支持定义具有可变参数的函数,即该函数可以接收任意多个参数,其中非关键字参数会集中存储到元组参数(*args)中,而关键字参数则集中存储到字典参数(**kwargs)中,这个过程可称为参数收集。

Python 还支持逆向参数收集,即直接将列表、元组、字典作为函数参数,Python 会将其进行拆分,把其中存储的元素按照次序分给函数中的各个形参。

以逆向参数收集的方式向函数参数传值时,Pyhon 语法规定,当传入列表或元组时,其名称前要带一个 * 号,当传入字典时,其名称前要带有 2 个 * 号。

如果使用逆向参数收集的方式,必须注意 * 号的添加。以逆向收集列表为例,如果传参时其列表名前不带 * 号,则 Python 解释器会将整个列表作为参数传递给一个参数。

python None空值用法

Python 中,有一个特殊的常量 None(N 必须大写)。和 False 不同,它不表示 0,也不表示空字符串,而表示没有值,也就是空值。

这里的空值并不代表空对象,即 None 和 []、“” 不同。

None 是 NoneType 数据类型的唯一值(其他编程语言可能称这个值为 null、nil 或 undefined),也就是说,我们不能再创建其它 NoneType 类型的变量,但是可以将 None 赋值给任何变量。如果希望变量中存储的东西不与任何其它值混淆,就可以使用 None。

None 常用于 assert、判断以及函数无返回值的情况。
使用 print() 函数输出数据,其实该函数的返回值就是 None,因为它的功能是在屏幕上显示文本,根本不需要返回任何值,所以 print() 就返回 None。

对于所有没有 return 语句的函数定义,Python 都会在末尾加上 return None,使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。

python return返回值多个值

Python 函数能以返回列表或者元组的方式,将要返回的多个值保存到序列中,从而间接实现返回多个值的目的。

实现 Python 函数返回多个值,有以下 2 种方式:
(1)在函数中,提前将要返回的多个值存储到一个列表或元组中,然后函数返回该列表或元组;
(2)函数直接返回多个值,之间用逗号( , )分隔,Python 会自动将多个值封装到一个元组中,其返回值仍是一个元组。

利用 Python 提供的序列解包功能,之间使用对应数量的变量,直接接收函数返回列表或元组中的多个值。

python partial偏函数简单使用

偏函数,它是对原始函数的二次封装,是将现有函数的部分参数预先绑定为指定值,从而得到一个新的函数,该函数就称为偏函数。相比原函数,偏函数具有较少的可变参数,从而降低了函数调用的难度。

from functools import partial
偏函数名 = partial(func, *args, **kwargs)

偏函数的本质是将函数式编程、默认参数和冗余参数结合在一起,通过偏函数传入的参数调用关系,与正常函数的参数调用关系是一致的。

偏函数通过将任意数量(顺序)的参数,转化为另一个带有剩余参数的函数对象,从而实现了截取函数功能(偏向)的效果。在实际应用中,可以使用一个原函数,然后将其封装多个偏函数,在调用函数时全部调用偏函数,一定程序上可以提高程序的可读性。

python闭包

闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。

闭包比普通的函数多了一个 closure 属性,该属性记录着自由变量的地址。当闭包被调用时,系统就会根据该地址找到对应的自由变量,完成整体的函数调用。

lambda表达式

lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。

name = lambda [list] : 表达式

python的exec()和eval()函数

eval() 和 exec() 函数都属于 Python 的内置函数

eval() 和 exec() 函数的功能是相似的,都可以执行一个字符串形式的 Python 代码(代码以字符串的形式提供),相当于一个 Python 的解释器。二者不同之处在于,eval() 执行完要返回结果,而 exec() 执行完不返回结果。

eval(source, globals=None, locals=None, /)
exec(source, globals=None, locals=None, /)

参数的具体含义:
expression:这个参数是一个字符串,代表要执行的语句 。该语句受后面两个字典类型参数 globals 和 locals 的限制,只有在 globals 字典和 locals 字典作用域内的函数和变量才能被执行。
globals:这个参数管控的是一个全局的命名空间,即 expression 可以使用全局命名空间中的函数。如果只是提供了 globals 参数,而没有提供自定义的 builtins,则系统会将当前环境中的 builtins 复制到自己提供的 globals 中,然后才会进行计算;如果连 globals 这个参数都没有被提供,则使用 Python 的全局命名空间。
locals:这个参数管控的是一个局部的命名空间,和 globals 类似,当它和 globals 中有重复或冲突时,以 locals 的为准。如果 locals 没有被提供,则默认为 globals。

//通俗说其实后两个参数就是用来约束前一个参数命令的使用范围的。

注意,builtins 是 Python 的内建模块,平时使用的 int、str、abs 都在这个模块中。通过 print(dic[“builtins”]) 语句可以查看 builtins 所对应的 value。

两个函数的应用场景

在使用 Python 开发服务端程序时,这两个函数应用得非常广泛。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过 eval() 或 exec() 来执行,这样的设计会使服务端与客户端的耦合度更低,系统更易扩展。

注意:在使用 eval() 或是 exec() 来处理请求代码时,函数 eval() 和 exec() 常常会被黑客利用,成为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,来限制 eval() 和 exec() 的执行范围。

注意:在编写代码时,一般会使 repr() 数来生成动态的字符串,再传入到 eval() 或 exec() 函数内,实现动态执行代码的功能。

python3函数注解

函数注解是 Python 3 最独特的功能之一
函数注解的用途归结为:为函数中的形参和返回值提供类型提示信息。
示例:

def f(ham:str,egg:str='eggs')->str:
  pass
print(f.__annotations__)

结果:

{'ham': <class 'str'>, 'egg': <class 'str'>, 'return': <class 'str'>}

给函数中的参数做注解的方法是在形参后添加冒号“:”,后接需添加的注解(可以是类(如 str、int 等),也可以是字符串或者表示式);给返回值做注解的方法是将注解添加到 def 语句结尾的冒号和 -> 之间。

注意,如果参数有默认值,参数注解位于冒号和等号之间。比如 eggs:str=‘eggs’,它表示 eggs 参数的默认值为 ‘eggs’,添加的注解为 str。

函数注解没有任何语法上的意义,只是为函数参数和返回值做注解,并在运行获取这些注解,仅此而已。换句话说,为函数做的注解,Python不做检查,不做强制,不做验证,什么操作都不做,函数注解对Python解释器没任何意义。

可能使用的场景

提供类型信息:包括类型检查、让 IDE 显示函数接受和返回的类型、适配、与其他语言的桥梁、数据库查询映射、RPC参数编组等;
其他信息:函数参数和返回值的文档。

提高代码可读性的几点建议

围绕一个中心思想:不写重复性的代码。
1.要学会刻意地减少代码的迭代层数,尽可能让 Python 代码扁平化。
2.在使用函数时,函数的粒度应该尽可能细,不要让一个函数做太多的事情。往往一个复杂的函数,我们要尽可能地把它拆分成几个功能简单的函数,然后合并起来。

python断言函数

用于判断某个表达式的值,如果值为真,则程序可以继续往下执行;反之,Python 解释器会报 AssertionError 错误。

assert 表达式

有利于对程序排错,提高程序的健壮性。

命令行模式下运行 Python 程序时,加入 -O 选项就可以使程序中的 assert 失效。一旦 assert 失效,其包含的语句也就不会被执行。

python推导式(解析器)

使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可细分为列表推导式、元组推导式、字典推导式以及集合推导式。

python列表推导式

语法格式:[ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
除去 [if 条件表达式] 部分,其余各部分的含义以及执行顺序和 for 循环是完全一样的(表达式其实就是 for 循环中的循环体),执行顺序如下:

for 迭代变量 in 可迭代对象
    表达式

python元组推导式

语法格式:(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
与列表类似用法
注意的是:元组推导式生成的结果并不是一个元组,而是一个生成器对象

<generator object <genexpr> at 0x0000020BAD136620>

想要通过元组推导式获得元组可有三种方法:
1.使用tuple()函数
2.直接使用for循环遍历生成器对象,可以获得各个元素
3.使用__next__()方法遍历生成器对象

需要注意的是:
无论是使用 for 循环遍历生成器对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在!!!

python字典推导式

字典推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的字典。

{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}

python zip函数

zip() 函数是 Python 内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。
语法格式

zip(iterable,……)  #iterable,... 表示多个列表、元组、字典、集合、字符串,甚至还可以为 range() 区间。

python reversed函数

reserved() 是 Pyton 内置函数之一,其功能是对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。
语法格式

reversed(seq) #seq 可以是列表,元素,字符串以及 range() 生成的区间列表。

除了使用列表推导式的方式,还可以使用 list() 函数,将 reversed() 函数逆序返回的迭代器,直接转换成列表。

python sorted函数

sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序。
语法格式

list = sorted(iterable, key=None, reverse=False) 
 #iterable 表示指定的序列,key 参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted() 函数会返回一个排好序的列表。

使用 sorted() 函数对序列进行排序, 并不会在原序列的基础进行修改,而是会重新生成一个排好序的列表。

在这里插入图片描述
大家一起加油啦!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值