python中的函数(Python中的函数定义通过define关键字完成)
off999 2024-10-25 13:46 20 浏览 0 评论
前言
在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满 足下述条件的程序实体: 在运行时创建 能赋值给变量或数据结构中的元素,能作为参数传给函数,能作为函数的返回结果。即在 Python 中,所有东西都是一等对象。
函数的定义
python中定义函数使用关键字def,然后跟函数名与括号内的形参列表,例如如下所示:
def function_name(parameter_list):
"""doc string"
// 具体逻辑
函数参数
- 默认值参数
在python当中我们可以为函数的参数指定默认值,这样在调用函数时,可以使用比定义时更少的参数。
def print_name(name="tom"):
print(f"my name is {name}")
print_name() // 调用时不传递参数
print_name(name="jack") // 调用时传递参数,并覆盖默认值
我们需要记住的是默认参数的值只会计算一次,但是如果参数类型是可变类型时,就会产生意想不到的结果了,例如下面的例子
当参数类型为不可变对象时:
num = 5
def print_number(arg=num):
print(arg)
num = 6
print_number(num) // 输出结果为5
当参数类型为可变对象时,例如参数类型为列表,函数会累积后续调用时传递的参数,具体代码例子如下所示:
>>> def print_list(a, L=[]):
... L.append(a)
... return L
...
>>> print(print_list(1))
[1]
>>> print(print_list(2))
[1, 2]
>>> print(print_list(3))
[1, 2, 3]
>>>
如果不想在后续调用之间共享默认值时,我们应该将默认值设置为None,具体如下所示:
>>> def pf(a, L=None):
... if L is None:
... L = []
... L.append(a)
... return L
...
>>> print(pf(1))
[1]
>>> print(pf(2))
[2]
>>> print(pf(3))
[3]
>>>
2. 关键字参数
关键字参数是指在函数调用中前面带有标识符(例如name=)或者作为包含在前面带有**的字典里的值传入的参数。例如下面所示:
def complete(shell=True, prefx="/"):
...
函数调用时,关键字参数必须跟在位置参数后面。所有传递的关键字参数都必须匹配一个函数接受的参数,关键字参数的顺序并不重要。
3. 位置参数
位置参数是指可出现于参数列表的开头以及斜杠(/)或者作为前面带有星号(*)的可迭代对象里的元素被传入。例如下面所示:
def complete(name, /, age, *):
...
4. 特殊参数
默认情况下,参数可以按位置或显式关键字传递给 Python 函数。为了让代码易读、高效,最好限制参数的传递方式,这样,开发者只需查看函数定义,即可确定参数项是仅按位置,按位置或关键字,还是仅按关键字传递。
例如下面的函数:
def complete(name, age, /, position_keyword, *, keyword):
...
其中name和age只能是位置参数,position_keyword可以是位置参数也可以是关键字参数,keyword只能是关键字参数。/和*是可选的。这些符号表明形参如何把参数值传递给函数:位置、位置或关键字、关键字。关键字形参也叫作命名形参。
- 位置或关键字参数:函数定义中未使用正斜杠(/ )和x星号(*)时,参数可以按位置或关键字传递给函数。
- 仅位置参数:仅限位置 时,形参的顺序很重要,且这些形参不能用关键字传递。仅限位置形参应放在(/ ) 正斜杠前。正斜杠(/ )用于在逻辑上分割仅限位置形参与其它形参。如果函数定义中没有 (/ ),则表示没有仅限位置形参。正斜杠(/ ) 后可以是 位置或关键字 或 仅限关键字 形参。
- 仅限关键字参数:把形参标记为仅限关键字,表明必须以关键字参数形式传递该形参,应在参数列表中第一个仅限关键字形参前添加星号(*)。
Lambda 表达式
lambda关键字用于创建小巧的匿名函数。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量。
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(55)
>>> f(0)
55
高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数。在函数式语言通常会提供 map、filter 和 reduce 三个高阶函数(有时 使用不同的名称)。在 Python 3 中,map 和 filter 还是内置函数,但是由于引入了列表推导和生成器表达式,它们变得没那么重要了。
- map函数
map 函数,它接收两个参数,第一个参数是一个函数对象(当然也可以是一个lambda表达式), 第二个参数是一个序列。返回的是一个可迭代的map对象
>>> mp = map(lambda x: x * x, [1, 2, 3, 4, 5])
>>> mp
<map object at 0x7f34c9eceda0>
>>> for item in mp:
... print(item)
...
1
4
9
16
25
- filter函数
filter 函数,和 map 函数相似。同样也是接收两个参数,一个函数对象或者是一个lambda 表达式和一个序列。它会遍历后面序列中每一个元素,并将其做为参数传入lambda表达式中,当表达式返回 True,则元素会被 保留下来,当表达式返回 False ,则元素会被丢弃。返回的是一个经过过滤操作的可迭代的filter对象。
>>> fl = filter(lambda x: x < 0, range(-3, 3))
>>> fl
<filter object at 0x7f34c9ece860>
>>> for item in fl:
... print(item)
...
-3
-2
-1
- reduce函数
reduce 函数,也是类似的。它的作用是先对序列中的第 1,2 个元素进行操作,得到的结果再与第 三个数据用 函数对象或者lambda表达式运算,将其得到的结果再与第四个元素进行运算,以此类推下去直到后面 没有元素了。返回函数对象或lambda最终运行的结果。
>>> from functools import reduce
>>> rd = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6])
>>> rd
21
>>>
函数注解
函数注解是可选的,用户可以自定义函数类型的元数据完整信息(其实就是指定函数参数的类型,作为动态语言有点多此一举了)标注以字典的形式存放在函数的__annotations__属性中,并且不会影响函数的任何其他部分。 形参标注的定义方式是在形参名后加冒号,后面跟一个表达式,该表达式会被求值为标注的值。 返回值标注的定义方式是加组合符号->,后面跟一个表达式,该标注位于形参列表和表示def语句结束的冒号之间。具体如下所示:
def complete(shell: bool = True, command: str = "") -> bool:
...
小结
在python中一切皆对象,我们可以把函数 赋值给变量、传给其他函数、存储在数据结构中,以及访问函数的属 性,供框架和一些工具使用。
相关推荐
- apisix动态修改路由的原理_动态路由协议rip的配置
-
ApacheAPISIX能够实现动态修改路由(DynamicRouting)的核心原理,是它将传统的静态Nginx配置彻底解耦,通过中心化配置存储(如etcd)+OpenRest...
- 使用 Docker 部署 OpenResty Manager 搭建可视化反向代理系统
-
在之前的文章中,xiaoz推荐过可视化Nginx反向代理工具NginxProxyManager,最近xiaoz还发现一款功能更加强大,界面更加漂亮的OpenRestyManager,完全可以替代...
- OpenResty 入门指南:从基础到动态路由实战
-
一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...
- OpenResty 的 Lua 动态能力_openresty 动态upstream
-
OpenResty的Lua动态能力是其最核心的优势,它将LuaJIT嵌入到Nginx的每一个请求处理阶段,使得开发者可以用Lua脚本动态控制请求的生命周期,而无需重新编译或rel...
- LVS和Nginx_lvs和nginx的区别
-
LVS(LinuxVirtualServer)和Nginx都是常用的负载均衡解决方案,广泛应用于大型网站和分布式系统中,以提高系统的性能、可用性和可扩展性。一、基本概念1.LVS(Linux...
- 外网连接到内网服务器需要端口映射吗,如何操作?
-
外网访问内网服务器通常需要端口映射(或内网穿透),这是跨越公网与私网边界的关键技术。操作方式取决于网络环境,以下分场景详解。一、端口映射的核心原理内网服务器位于私有IP地址段(如192.168.x.x...
- Nginx如何解决C10K问题(1万个并发连接)?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。Nginx是大型架构的必备中间件,下面我就全面来详解NginxC10k问题@mikechen文章来源:mikec...
- 炸场!Spring Boot 9 大内置过滤器实战手册:从坑到神
-
炸场!SpringBoot9大内置过滤器实战手册:从坑到神在Java开发圈摸爬滚打十年,见过太多团队重复造轮子——明明SpringBoot自带的过滤器就能解决的问题,偏偏要手写几十...
- WordPress和Typecho xmlrpc漏洞_wordpress主题漏洞
-
一般大家都关注WordPress,毕竟用户量巨大,而国内的Typecho作为轻量级的博客系统就关注的人并不多。Typecho有很多借鉴WordPress的,包括兼容的xmlrpc接口,而WordPre...
- Linux Shell 入门教程(六):重定向、管道与命令替换
-
在前几篇中,我们学习了函数、流程控制等Shell编程的基础内容。现在我们来探索更高级的功能:如何控制数据流向、将命令链接在一起、让命令间通信变得可能。一、输入输出重定向(>、>>...
- Nginx的location匹配规则,90%的人都没完全搞懂,一张图让你秒懂
-
刚配完nginx网站就崩了?运维和开发都头疼的location匹配规则优先级,弄错顺序直接导致500错误。核心在于nginx处理location时顺序严格:先精确匹配=,然后前缀匹配^~,接着按顺序正...
- liunx服务器查看故障命令有那些?_linux查看服务器性能命令
-
在Linux服务器上排查故障时,需要使用一系列命令来检查系统状态、日志文件、资源利用情况以及网络状况。以下是常用的故障排查命令,按照不同场景分类说明。1.系统资源相关命令1.1查看CPU使...
- 服务器被入侵的常见迹象有哪些?_服务器入侵可以被完全操纵吗
-
服务器被入侵可能会导致数据泄露、服务异常或完全失控。及时发现入侵迹象能够帮助你尽早采取措施,减少损失。以下是服务器被入侵的常见迹象以及相关的分析与处理建议。1.服务器被入侵的常见迹象1.1系统性能...
- 前端错误可观测最佳实践_前端错误提示
-
场景解析对于前端项目,生产环境的代码通常经过压缩、混淆和打包处理,当代码在运行过程中产生错误时,通常难以还原原始代码从而定位问题,对于深度混淆尤其如此,因此Mozilla自2011年开始发起并...
- 8个能让你的Kubernetes集群“瞬间崩溃”的配置错误
-
错误一:livenessProbe探针“自杀式”配置——30秒内让Pod重启20次现象:Pod状态在Running→Terminating→CrashLoopBackOff之间循环,重启间隔仅...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- apisix动态修改路由的原理_动态路由协议rip的配置
- 使用 Docker 部署 OpenResty Manager 搭建可视化反向代理系统
- OpenResty 入门指南:从基础到动态路由实战
- OpenResty 的 Lua 动态能力_openresty 动态upstream
- LVS和Nginx_lvs和nginx的区别
- 外网连接到内网服务器需要端口映射吗,如何操作?
- Nginx如何解决C10K问题(1万个并发连接)?
- 炸场!Spring Boot 9 大内置过滤器实战手册:从坑到神
- WordPress和Typecho xmlrpc漏洞_wordpress主题漏洞
- Linux Shell 入门教程(六):重定向、管道与命令替换
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)