Python函数和 lambda表达式

news2024/11/19 3:40:08

Python提供了许多内置函数,比如:print(),len()等。它还支持用户自定义函数。

一、Python函数

1、函数定义使用

(1)函数定义

Python 允许我们将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。

定义函数需要使用 def 关键字,一般格式如下:

def 函数名(参数列表):
    函数体
    [return [返回值]]

说明:

  • 函数名:就是一个符合 Python 语法的标识符,推荐见名知意。
  • 形参列表:设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。
  • 函数体:实现特定功能的多行代码
  • [return [返回值] ]:可选参数,用于设置该函数的返回值。不带表达式的 return 相当于返回 None,即没有返回值。

(2) 函数使用

函数调用的基本语法格式:

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

示例代码如下:

# 自定义函数
'''
定义一个求 2个数之和的函数
'''
def my_sum(a, b):
    '''
        求 2个数之和
    '''
    sum = a + b
    print("my_sum 函数执行了")
    return sum


# 调用函数
res = my_sum(10, 2)
print("my_sum 返回值为:", res)

在这里插入图片描述

2、为函数提供说明文档

函数的说明文档通常位于函数内部、所有代码的最前面。

通过调用 Python 的 help() 内置函数或者 __doc__ 属性,可以查看某个函数的使用说明文档。

help(my_sum)
print("-----------")
print(my_sum.__doc__)

在这里插入图片描述

3、函数参数传递

python 中一切都是对象,在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

函数参数传递可以传不可变对象和传可变对象。可以理解为值传递还是引用传递,

  • 不可变类型:适用于实参类型为不可变类型(字符串、数字、元组)。类似 Java的值传递
  • 可变类型:适用于实参类型为可变类型(列表,字典)。类似 Java的引用传递

(1)传不可变对象实例

通过 id() 函数来查看内存地址变化。

def change(a):
    print(id(a))  # 指向的是同一个对象
    a = 10
    print(id(a))  # 一个新对象


a = 1
print(id(a))
print("-----调用函数之前------")
change(a)

在这里插入图片描述
(2)传可变对象实例

def changeme(mylist):
    """修改传入的列表"""
    mylist.append([1, 2, 3, 4])
    print("函数内取值: {},id:{}", mylist, id(mylist))
    return


mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: {},id:{}", mylist, id(mylist))

在这里插入图片描述

4、函数参数类型

4.1 位置参数

位置参数也称必需参数/必备参数,是指必须按照正确的顺序将实际参数传到函数中。

即调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致(传多传少都不行)。

示例代码如下:

def my_sum(a, b):
    sum = a + b
    print("my_sum 函数执行了")
    return sum

# 调用函数时,必须传递 2 个参数,否则会引发错误
res = my_sum(10, 2)
print("my_sum 返回值为:", my_sum(10, 2))

print("my_sum 返回值为:", my_sum(2))  # TypeError: my_sum() missing 1 required positional argument: 'b'

4.1.1 强制位置参数

Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。

在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

# 正确调用函数
f(10, 20, 30, d=40, e=50, f=60)

# 错误调用函数
# f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式。 TypeError: f() got some positional-only arguments passed as keyword arguments: 'b'
# f(10, 20, 30, 40, 50, f=60)  # e 必须使用关键字参数的形式。TypeError: f() takes 4 positional arguments but 5 positional arguments (and 1 keyword-only argument) were given

4.2 关键字参数

关键字参数是指使用形式参数的名字来确定输入的参数值。

通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。因为 Python 解释器能够用参数名匹配参数值。

示例代码如下:

def dis_str(str1, str2):
    print("str1=", str1)
    print("str2=", str2)

# 位置参数调用
dis_str("aaa", "bbb")
print("------1-----")
# 关键字参数调用
dis_str(str2="bbb", str1="aaa")
print("------2-----")
# 混合传参调用
dis_str("aaa", str2="bbb")

在这里插入图片描述

注意:位置参数和关键字参数可以混合传参。但是,混合传参时关键字参数必须位于所有的位置参数之后。

4.3 默认参数

Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。

默认参数是指调用函数时,如果没有传递参数,则会使用默认参数。

Python 定义带有默认值参数的函数,其语法格式如下:

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

注意:

  • 当定义一个有默认值参数的函数时,有默认值的参数必须位于所有没默认值参数的最后,否则会产生语法错误。
  • 可以使用“函数名.__defaults__”查看函数的默认值参数的当前值,其返回值是一个元组。

示例代码如下:

# str1没有默认参数,str2有默认参数
def dis_str(str1, str2="str2222"):
    print("str1=", str1)
    print("str2=", str2)


dis_str("aaa")
print("------------")
dis_str("aaa", "bbb")

print("查看函数的默认值参数的当前值:", dis_str.__defaults__)

在这里插入图片描述

4.4 不定长参数

不定长参数是指一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数。

基本语法如下:

def functionname([formal_args,] *var_args_tuple|**var_args_dict ):
   "函数_文档字符串"
   function_suite
   return [expression]

注意:

  • 一种是参数带两个星号 *,表示会以元组(tuple)的形式导入,存放所有未命名的变量参数。
  • 一种是参数带两个星号 **,表示参数会以字典(dict)的形式导入,存放所有未命名的变量参数。

示例代码如下:

# sarg1为位置参数,vartuple为可变参数
def printInfo1(arg1, *vartuple):
    print("printInfo1输出: ")
    print("arg1={},type={}", arg1, type(arg1))
    print("vartuple={}, type={}", vartuple, type(vartuple))


def printInfo2(arg1, **vardict):
    print("printInfo2输出: ")
    print("arg1={},type={}", arg1, type(arg1))
    print("vardict={}, type={}", vardict, type(vardict))


# 调用函数
printInfo1(70, 'abc', 60, 50, "www")
printInfo2(70, k1='abc', k2=60, k3=50, k4="www")

在这里插入图片描述

4、return函数返回值

Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值。

  • 该返回值可以是任意类型。
  • 该返回值参数可以指定,也可以省略不写(不写 return 相当于返回 None)。

示例代码如下:

def changeme(mylist):
    mylist.append([1, 2, 3, 4])
    print("函数内取值: mylist={},id(mylist){}", mylist, id(mylist))
    return mylist


mylist = [10, 20, 30]
print("调用函数之前: mylist={},id(mylist){}", mylist, id(mylist))
mylist = changeme(mylist)
print("函数返回值: mylist={},id(mylist){}", mylist, id(mylist))

在这里插入图片描述

二、lambda表达式

lambda 表达式,又称匿名函数,所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。常用来表示内部仅包含 1 行表达式的函数。

如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。

Python 使用 lambda 关键字来创建匿名函数。语法格式如下:

name = lambda [list] : 表达式

其中:

  • name 为该 lambda表达式的名称。即调用函数名
  • [list] 作为可选参数,等同于定义函数是指定的参数列表;

该语法格式转换成普通函数的形式,如下所示:

def name(list):
    return 表达式
name(list)

示例代码如下:求 2 个数之和的函数

# 使用普通函数的方式
def my_sum(a, b):
    sum = a + b
    return sum

sum = my_sum(10, 2)
print("使用普通函数的方式:sum= ", sum)

# 使用 lambda 表达式方式
sum_fun = lambda x, y: x + y
print("使用 lambda 表达式方式:sum= ", sum_fun(3, 5))

在这里插入图片描述

可以理解 lambda 表达式为简单函数(函数体仅是单行的表达式)的简写版本。相比函数,lamba 表达式具有以下 2 个优势:

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一刷代码随想录——字符串

1 力扣344.反转字符串题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。class Solution { public:v…

数据库原理与应用-关系数据库

关系数据结构及形式化定义关系操作关系的完整性关系代数关系演算

WebSocket协议简介

一、WebSocket协议是什么 WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信,它实现了浏览器与服务器全双工(full-duplex)通信,也就是允许服务器主动发送信息给客户端。 WebSocket 协议主要为了解决基于 HTTP/1.x 的 Web …

【正点原子Linux连载】第一章 VMware虚拟机安装 摘自【正点原子】ATK-DLRV1126系统开发手册

1)实验平台:正点原子RV1126 Linux开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692176265749 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第一章 V…

flex布局常用属性记录

场景:前端常用的页面布局当使用 flex 布局时,首先想到的是两根轴线 — 主轴和交叉轴。主轴由flex-direction 定义,另一根轴垂直于它。我们使用 flexbox 的所有属性都跟这两根轴线有关;这里只做主轴的介绍:主轴主轴由 f…

算法刷题-四数之和、缺失的第一个正数、N 皇后

文章目录四数之和缺失的第一个正数N 皇后四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a b c d 的值与 target 相等?找出所有满足条件且不重复…

【基础篇】6 # 栈:如何实现浏览器的前进和后退功能?

说明 【数据结构与算法之美】专栏学习笔记 什么是栈? 栈是一种“操作受限”的线性表,只允许在一端插入和删除数据,其特性就是后进先出、先进后出。 栈既可以用数组来实现,也可以用链表来实现。 用数组实现的栈叫作顺序栈用链…

【正点原子Linux连载】第三章 RV1126开发环境搭建 摘自【正点原子】ATK-DLRV1126系统开发手册

1)实验平台:正点原子RV1126 Linux开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692176265749 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第三章 R…

Gartner发布2022云Web应用程序和API保护魔力象限

8月30日,知名咨询机构Gartner发布2022云Web应用程序和API保护魔力象限。当前,云Web应用程序和API保护市场迅速增长。 Gartner预测,到 2024 年,70%实施多云战略的企业将青睐云 Web 应用程序和API保护平台 (WAAP&#x…

26岁从财务转行软件测试,4年沉淀我已经是25k的测开工程师...

此文绝对不是喂鸡汤,而是告诉你实实在在的转行办法。有点长,请细看有些人会轻松上岸。有些人会挣扎着上岸。有些人会淹死在水里。我属于挣扎着上岸的。我原来是做财务方面的,后面自学转行做了软测程序员,从事软件测试工作4年&…

SpringMVC之简介

看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的一部分。那么SpringMVC到底是用来做什么的呢? 回想web阶段,我们学习过Servlet,而SpringMVC与…

Atlas中间件快速入门(实现数据库读写分离)

一、Atlas简介 1 2 3 41. Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 2. 它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性 3. 目前该项目在360公司内部得到了广泛应…

屏幕录制没有声音怎么办?看看你有没有打开这个设置

电脑是我们学习和办公不可或缺的工具,有时我们需要使用工具对电脑屏幕进行录制。但很多小伙伴录制的电脑录屏文件只有画面没有声音。屏幕录制没有声音怎么办?不用慌!有可能你只是忘了在录制前打开这个设置。今天小编就来教大家录制前需要开启…

公司企业如何制作微信小程序店铺?

​微信小程序除了可以为公司企业充当展示官网之外,有些主打线上销售商品的公司企业也会借助小程序来卖货,那就是我们常说的微信小程序店铺。那么公司企业如何制作微信小程序店铺?下面给大家做个讲解。 一、注册小程序账号 微信小程序店铺也属…

有效管理 Kubernetes 的流行解决方案,7 款 DevOps 工具管理 Kubernetes ,集群管理更加的轻松顺畅和高效

有效管理 Kubernetes 的流行解决方案,7 款 DevOps 工具管理 Kubernetes ,集群管理更加的轻松顺畅和高效。 在新兴的云原生环境中,Kubernetes无处不在。它已成为编排容器的标准。但是,管理多个 Kubernetes 集群(必须以…

前端整理 —— 前端安全

1. XSS(跨站脚本攻击) 什么是XSS 是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全常见类型…

【并发编程十四】c++原子操作(2)——实现自旋锁

【并发编程十四】c原子操作(2)——实现自旋锁一、自旋锁简介二、使用自旋锁三、不使用自旋锁四、分析简介 在介绍完原子操作,我们这篇使用c提供的原子操作,实现一个自旋锁,并加以利用。 原子操作参见【并发编程十三】…

什么是shell?shell在Linux内怎么编写脚本?

目录 一、概念 二、简单创建脚本 三、shell语法 1.变量 2.环境变量 3.参数变量 4.条件 5.控制结构 if语句 elif语句 for语句 一、概念 什么是shell? shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。 下图显示了sh…

kali之setoolkit使用

kali之setoolkit使用 1 搭建钓鱼网站 钓鱼网站是黑客常用的用于盗取目标用户名与账号的方式,今天主要介绍setoolkit来制作钓鱼网站 setoolkit是kali下的社会工程学工具集。 ①进入setoolkit 命令行输入: setoolkit②选择社会工程学攻击 - 网络攻击 - …

基于Android的二手车交易系统

需求信息: 1、登录功能:用户可以注册登录,管理员可以给销售人员权限,所以销售人员只能登陆。 2、维护车辆信息:主要实现的是客户添加修改查询删除车辆信息,然后发布车辆需要提交,提交给管理员,管理员审核了…