Python(4):函数(命名+参数+内置函数+匿名函数)

news2025/6/22 18:46:03

文章目录

  • 一、关于*的一些打散功能
  • 二、函数的特点和命名规范
  • 三、函数的返回值return
  • 四、函数的参数
    • 1.无参数的函数
    • 2.有参数的函数
  • 五、函数的命名空间
  • 六、全局变量和局部变量
  • 七、函数的作用域以及执行顺序(LEGB)
  • 八、递归函数
  • 九、常见内置函数
  • 十、匿名函数-lambda

一、关于*的一些打散功能

在说函数之前我们先了解一下*号,这个*好在传入可变参数和接收多个值会偶尔使用到

# ---------------------------全部打散
a = [1, 2, 3, 4, 5]
b = (1, 2, 3, 4, 5)
c = {1, 2, 3, 4, 5}
d = '12345'
print(*a)  # 1 2 3 4 5
print(*b)  # 1 2 3 4 5
print(*c)  # 1 2 3 4 5
print(*d)  # 1 2 3 4 5

# -----------------------------部分打散
a = [1, 2, 3, 4, 5]
b, *c = a
print(b)  # 1
print(c)  # 2,3,4,5

d, *e, f = a
print(d)  # 1
print(e)  # [2, 3, 4]
print(f)  # 5

二、函数的特点和命名规范

函数是为了将相同功能的一段代码进行封装,然后我们在使用的时候不用写重复代码,只需要传入规定的参数,然后执行对应的功能即可。 下边是函数的一个基本格式:

def func(argument1, argument2):#参数可有可无,可多可少
	"""我是注释,一般可以写函数的功能,还有参数分别是什么 和 返回值的返回内容"""
    函数功能块
    return argument1, argument2(返回值可有可无,)

函数有什么特点呢?

  1. 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
  2. 函数必须先定义后调用,定义的时候函数代码块以 def 关键词开头,后接函数标识符名称和()
  3. 函数内容以冒号起始,并且缩进。
  4. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  5. return [表达式] 结束函数,选择性地返回一个值给调用方。不写return或者只写return默认返回None,并且返回值可以设置多个
  6. 函数的本质是调用对应函数名的内存地址

函数命名的规范:

  1. 字母,下划线和数字组成,且数字不能开头
  2. 长度任意长
  3. 不能和python关键字同名

三、函数的返回值return

执行函数后,返回一个或多个规定好的值。

注意:

  1. 函数可以有1个或者多个返回值
  2. return后边不写返回的内容,默认返回None
  3. return一个作用是返回内容,另一个作用是结束函数(函数一旦执行return,函数立刻终止)
def fun():
    return "hello"

	print(1111) # 已经return,无法执行


x = fun()
print(x)     # hello

四、函数的参数

什么是函数的参数?

1.举一个例子,当我们孩子进入一个学校,我们输入孩子的名字,学校直接告诉我们孩子是不是我们学校的学生,那么我们把学校告诉我们这件事看出一个函数,然后孩子的名字就是我们需要告知学校的参数。
2.同样有的函数也可以不传参数,只执行他自己的事情,我们调用函数就只是一个触发他的过程,例如我们喊出鸡你太美。这个时候就没有传入参数,直接叫的。

关于函数参数顺序遵循: 位置参数,元组参数,默认参数,字典参数

1.无参数的函数

def print_():
    print('hello world')

print_()         # 输出hello world
print_()         # 输出hello world

2.有参数的函数

我们先了解什么是实参和形参?

  • 形参就是函数名圆括号里面的参数,形参包括默认参数,可变参数
  • 实参就是我们调用函数时候传入的参数,传参需要按照规定的形式填,实参包含关键字参数,顺序参数

① 位置(顺序)参数和关键字参数

def add(name, age, sex):  # 此处参数位置叫形参,定义的时候没有实际的值
    """
        函数执行了一个传入名字年龄性别而返回一句话的内容,返回值msg为一句话
    """
    msg = f'我叫{name},年龄{age}岁,性别是{sex}生。'
    return msg

#  ---------------------实参:此处调用函数括号的参数叫实参,因为此处的参数有实际的值

 # 位置参数:传入值的顺序要与实际参数相对应,那么这种一般按顺序对应的就叫位置参数
result =add('彪子', '18', '女') 
print(result) # 我叫彪子,年龄18岁,性别是女生。


# 关键词参数:关键词参数可以不按原函数定义参数顺序写。但是关键字参数和位置参数同时使用时候,关键字参数必须放在位置参数后边
result1 = add(name='彪子', age='18', sex='女')  # 全部关键字参数
print(result1)  # 我叫彪子,年龄18岁,性别是女生。

result2 = add('彪子', '18', sex='女')  # 部分关键字参数
print(result2)  # 我叫彪子,年龄18岁,性别是女生。

②默认参数

  • 默认参数要有不可变类型的对象,如果是可变类型,可能有逻辑错误。
  • 默认参数针对的形参
def fun(name,age,sex='男'):
    print('名字:',name)
    print('年龄:',age)
    print('性别:', sex)
    
fun('张三',18 )                  #sex不写,则按函数定义时候的默认参数 男 进行赋值
fun('李四',18,'女')              #sex写后,会把默认参数的值重新赋值

结果:
在这里插入图片描述
④可变参数

*args,一个*号,传入的为元组形式,即使传入一个值也会为元组

def fun(*args):                     
    print(args,type(args))
    
fun()
fun(1)
fun(1,2,3,4)

结果:
在这里插入图片描述

**kwargs,传入的是字典参数(传入形式: 键值名=参数)

def fun(**kwargs):
    print(kwargs,type(kwargs))

fun(name='张三',age=18)

结果:
在这里插入图片描述

五、函数的命名空间

Python中的三种命名空间

内置命名空间 —— python解释器

  • 就是python解释器一启动就可以使用的名字存储在内置命名空间中
  • 内置的名字在启动解释器的时候被加载进内存里

全局命名空间 —— 我们写的代码但不是函数中的代码

  • 是在程序从上到下被执行的过程中依次加载进内存的
  • 放置了我们设置的所有变量名和函数名

局部命名空间 —— 函数

  • 就是函数内部定义的名字
  • 当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了

注意:

  • 在局部:可以使用全局、内置命名空间中的名字
  • 在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
  • 在内置:不能使用局部和全局的名字的

六、全局变量和局部变量

问题如果我们在外部想使用局部的变量怎么办呢?

  • global()函数可以访问全局命名空间
  • locals()可以访问局部名称空间

在这里插入图片描述
而且我们使用global可以在局部改变全局的a值(前提是本身函数内部没有定义a)
在这里插入图片描述

问题:如何实现局部变量和全局变量的互相修改呢?

  • global可以将局部变量变为全局变量
  • nonlocal可以修改外层(非全局)变量

global使用

def fun():
    global a
    a+=20
    print('函数内部:',a)
    
a=10
fun()
print('函数外部',a)

结果:
在这里插入图片描述

nonlocal使用

def fun():
    a=9
    def fun1():#--------------函数嵌套enclosing
        nonlocal a#-------------可以修改外层(非全局)的变量
        a=98#--------------就是将外层的a=9改变为98
        print('我是内部',a)

    fun1()
    print('我是外部',a)

fun()

结果:
在这里插入图片描述

七、函数的作用域以及执行顺序(LEGB)

问题:函数的作用域,是指一个参数在定义后的使用区间,如果一个函数调用了一个值,那么函数是怎么在代码里找到这个值呢?

这是一个函数套函数的形式,我们作用域遵循的原则就是LEGB

a = 1
b = 2
c = 3

def fun_out():
    a = 10
    b = 20
    def fun_in():
        a = 100
        print(a)#-----------L Local(函数内部)首先查找局部作用域,有则输出,没有找E
        print(b)#-----------E Enclosing(嵌套函数外层函数的内部)L没有该值就查找嵌套作用域,有则输出,没有向G
        print(c)#-----------G Global(模块全局)E没有该值找全局作用域G,有则输出,没有向B
        print(__name__)#----B Built-in(内建作用域)最后一步,查找内建作用域,,有则输出,没有报错
    fun_in()
    
fun_out()

结果:
在这里插入图片描述

八、递归函数

  • 递归函数是函数的高阶使用了,就是通过规则函数重复的调用自己本身,然后直到符合自己的结束条件参会结束。
  • 但是不能一直重复调用,所以我们需要设置一个明确的结束递归条件,也叫递归出口

递归函数经典案例:斐波那契数列

假定每对大兔每月能生产一对小兔,而每对小兔生长两个月就成为大兔.这个问题导致了著名的数列:1,1,2,3,5,8,13,21,34,55,89,144,233,·…它是一个线性递归数列,那么比如我们初始一只兔子,那么指定月份后,我们有多少只兔子呢

def fbnq(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fbnq(n - 1) + fbnq(n - 2)
n = int(input('请输入月份:'))
for i in range(1,n+1):
    print(i, '月兔子有:', fbnq(i))

结果:
在这里插入图片描述

九、常见内置函数

1.求绝对值的函数:abs()

a=-1
print(abs(a))  # 1

2.求最大值得函数:max()

# 1.无key
a=[0,2,4,2,1,3]
print(max(a))#  返回最大的4

# 2.有key的max(参数,key=函数名)
a=[-1,-2,-4,-6]
b=max(a,key=abs)# 比较的时候按绝对值比较,输出原数值
print(b)

3.列表的内置排序函数(默认升序):sort()

①无key的sort()

b = [-1, -4, -2, -3]
b.sort()
print(b)#----------------------------------[-4,-3,-2,-1]

②有key的sort(参数,key=函数名)

a = [-1, -4, -2, -3]
a.sort(key=abs)#都是升序,只是按执行完的绝对值方法进行的升序,还是写的原值
print(a)#----------------------------------[-1, -2, -3, -4]

③降序

a = [-1, -4, -2, -3]
a.sort(reverse=True)
print(a )# -1,-2,-3,-4]

4.map(函数名,可迭代内容)

会依次将可迭代内容的每个元素执行该函数,并且返回新的值

x = [1, 2, 3, 4, 5]
def fun(x):
    return x * x
    
b = map(fun, x)

# 本身返回一个map对象,需要转换
print(list(b))#  [1, 4, 9, 16, 25]

5.filter(函数名,序列)
会依次将可迭代内容的每个元素执行该函数返回True或False,True的放到新列表,过滤不符合要求的元素,将符合元素放在一个新列表中

# 过滤奇数的方法
def fun(x):
    if x%2==0:
        return True
    else:
        return False
a=[1,2,3,4,5,6]
b=filter(fun,a)

# 本身返回一个filter对象,需要转换
print(list(b))#-------------------------------------------[2,4,6]

6.zip(序列1,序列2,序列3…)
将序列的各个对应元素一一打包成元组,按照最短的算

a=[1,2,3,4]#按照最短的,一一匹配
b=('a','b','c')
c=('啊','哦','窝')
d=zip(a,b,c)
for i in d:
    print(i)

结果:

在这里插入图片描述

十、匿名函数-lambda

1.基本定义

  • 形式: 变量名=lambda 参数1,参数2...:表达式

  • 注意:

    • 匿名函数的表达式参数是未知参数
    • 匿名不能包含循环,return,可以包含if-else
    • lambda表达式会产生一个新的局部作用域
  • 优点: 代码简洁,不增加额外变量

  • 缺点: 难于理解,降低了可读性

2.使用示例

举例1

hs = lambda x, y: x + y
b = hs(2, 3)

print(b) # -----------------------------5

举例2:匿名函数和三元表达式的搭配

max = lambda a, b: a if a > b else b

print(max(3, 4))  #  4

举例3: 匿名函数求列表的偶数

a = [1, 2, 3, 4, 5, 6, 7]

result = list(filter(lambda a: True if a % 2 == 0 else False, a))
print(result)  # [2, 4, 6]

3.匿名函数常见考题

题1:

def hehe():
    a=[]
    for i in range(3):
        a.append(lambda y:y*i)
    return a
z=hehe()
print(z[0](2))#--------------------------4
print(z[1](2))#------------------------4
print(z[2](2))#------------------------------4

原因:因为嵌套作用域的变量在嵌套的函数被调用时才会查找,所以他们实际上是统一的值(最后一次循环变量的值)。
理解方法1:相当于每次往列表里传入一个 lambda y:y * i 的表达式,而这个i真正是:调用的最后一次循环的i
理解方法2:比如第一次循环,往列表添加 lambda y:y * i 的表达式,此时i指向的是0,第二次,又往列表添加一个 lambda y:y*i 的表达式,此时i指向新的1,把原先的0覆盖…,最后指向4

若要改成预期结果,那么只需按照下边的改,或者是将其改造成一个生成器,不会让其提前运行也可

def hehe():
    a = []
    for i in range(3):
        a.append(lambda y, i=i: y * i)#---------此处的i,是默认参数,会自动赋值
    return a


z = hehe()
print(z[0](2))#--------------------------------0
print(z[1](2))#-------------------------------2
print(z[2](2))#-----------------------4

原因:i在每次运行时,都会把遇到的i=常数,赋值给匿名函数

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

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

相关文章

c++的学习之路:11、string(3)

昨天写string的时候没有说全,这里就开始接着讲。 目录 一、resize 二、insert 三、erase 一、resize 昨天说这个的时候没有考虑到缩小范围时咋处理,然后发现报错了,接着我调试发现缩小就不能正常执行了,因为用的是strcap所以…

芯片设计围炉札记

文章目录 语言Verilog 和 VHDL 区别 芯片验证 语言 System Verilog的概念以及与verilog的对比 IC 设计软件分析 Verilog 和 VHDL 区别 Verilog HDL 和 VHDL 的区别如下: 语法结构:Verilog的语法结构类似于C语言,而VHDL的语法结构则更接近…

流程图步骤条

1.结构 <ul class"stepUl"> <li class"stepLi" v-for"(item, index) in stepList" :key"index"> <div class"top"> <p :class"{active: currentState > item.key}">{{ item.value }}…

没有公网IP怎么办?

在网络通信中&#xff0c;公网IP是指可以直接访问互联网的IP地址。由于各种原因&#xff0c;有一些用户可能没有自己的公网IP地址。那么没有公网IP的情况下&#xff0c;我们应该怎么办呢&#xff1f; 局域网的限制 我们需要了解局域网的概念。局域网是指在一个相对较小的范围内…

R语言记录过程

如何使用这个函数as.peakData 函数构造过程 出现问题是缺少函数的问题 up不告诉我&#xff0c;这里是代表c,h,o的值&#xff0c;你从里面获取把值&#xff0c;设置成c,h,o就可以了 现在开始测试参数 第一次 startRow : 开始查找数据的第一行。不管startRow的值是多少&#xff…

3D Matching:实现halcon中的find_surface_model

halcon中的三维匹配大致分为两类&#xff0c;一类是基于形状的(Shape-Based)&#xff0c;一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体&#xff0c;3D物体模型必须是CAD模型&#xff0c;且几何边缘清晰可见&#xff0c;使用的相机也要预…

2024年能源环境、材料科学与人工智能国际会议(ICEEMSAI2024)

2024年能源环境、材料科学与人工智能国际会议(ICEEMSAI2024) 会议简介 2024国际能源环境、材料科学和人工智能大会&#xff08;ICEEMSAI 2024&#xff09;主要围绕能源环境、物质科学和人工智慧等研究领域&#xff0c;旨在吸引能源环境、先进材料和人工智能专家学者、科技人员…

虹科Pico汽车示波器 | 免拆诊断案例 | 2011款东风悦达起亚K5车发动机偶尔起动困难

一、故障现象 一辆2011款东风悦达起亚K5车&#xff0c;搭载G4KD发动机&#xff0c;累计行驶里程约为24.5万km。车主反映&#xff0c;第1次起动发动机时偶尔无法起动着机&#xff0c;第2次能够正常起动着机&#xff0c;但发动机故障灯异常点亮。为此在其他维修厂维修过&#xf…

【今日刷题】LeetCode 199.二叉树的右视图(中等)

今日刷题&#xff1a;LeetCode 199.二叉树的右视图&#xff08;中等&#xff09; 题目描述&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,…

取证——流量分析2

计算流量包文件的SHA256值是&#xff1f;[答案&#xff1a;字母小写][★☆☆☆☆] 4db1c8f3bfa8e29f294f8581e8cccad6f5b3012387d53ef844f2de6fb9ef1fd6 流量包长度在“640-1279”之间的的数据包总共有多少&#xff1f;[答案&#xff1a;100][★☆☆☆☆] frame.len > 640…

智能时代中的工业应用中前所未有的灵活桥接和I/O扩展功能解决方案MachXO2系列LCMXO2-1200HC-4TG100I FPGA可编程逻辑IC

lattice莱迪斯 MachXO2系列LCMXO2-1200HC-4TG100I超低密度FPGA现场可编程门阵列&#xff0c;适用于低成本的复杂系统控制和视频接口设计开发&#xff0c;满足了通信、计算、工业、消费电子和医疗市场所需的系统控制和接口应用。 瞬时启动&#xff0c;迅速实现控制——启动时间…

23、区间和

区间和 题目描述 假定有一个无限长的数轴&#xff0c;数轴上每个坐标上的数都是0。 现在&#xff0c;我们首先进行 n 次操作&#xff0c;每次操作将某一位置x上的数加c。 接下来&#xff0c;进行 m 次询问&#xff0c;每个询问包含两个整数l和r&#xff0c;你需要求出在区间…

02-结构化程式与自定义函数

视频教程&#xff1a;b站视频【MATLAB教程_台大郭彦甫&#xff08;14课&#xff09;原视频补档】https://www.bilibili.com/video/BV1GJ41137UH/?share_sourcecopy_web&vd_sourc*ed6b9f96888e9c85118cb40c164875dfc 官网教程&#xff1a; MATLAB 快速入门 - MathWorks 中…

Java面试题戏剧

目录 第一幕 、第一场&#xff09;某大厦楼下大门前第二场&#xff09;电梯中第三场&#xff09;走廊中 第二幕、第一场&#xff09;公司前台第二场&#xff09;公司卫生间 第三幕、第一场&#xff09;一场异常面试 第四幕 、第一场&#xff09;大厦楼下门口第二场&#xff09;…

InternVideo2重塑视频理解新标杆,多模态学习引领行业风向

引言&#xff1a;视频理解的新篇章——InternVideo2的介绍 随着视频内容在日常生活中的普及&#xff0c;视频理解技术的重要性日益凸显。视频不仅包含丰富的视觉信息&#xff0c;还蕴含着动态变化和多模态元素&#xff0c;如音频和文本。这些特性使得视频成为一个复杂的数据类型…

【Python】科研代码学习:十七 模型参数合并,safetensors / bin

【Python】科研代码学习&#xff1a;十七 模型参数合并&#xff0c;safetensors / bin 前言解决代码知识点&#xff1a;safetensors 和 bin 的区别&#xff1f;知识点&#xff1a;save_pretrained 还会新增的文件知识点&#xff1a;在保存模型参数时&#xff0c;大小发生了成倍…

【Linux的进程篇章 - 进程终止和进程等待的理解】

Linux学习笔记---008 Linux之fork函数、进程终止和等待的理解1、fork函数1.1、什么是fork?1.2、fork的功能介绍1.3、fork函数返回值的理解1.4、fork函数的总结 2、进程的终止2.1、终止是在做什么&#xff1f;2.2、进程终止的3种情况 3、进程的终止3.1、进程终止的三种情况3.2、…

数据结构-移除元素(简单)

题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

pycharm debug 的时候 waiting for process detach

当你使用pycharm debug或者run的时候&#xff0c;突然出现了点不动&#xff0c;然后一直显示&#xff1a;waiting for process detach 可能是以下问题&#xff1a; 1、需要设置Gevent compatible pycharm一直没显示运行步骤&#xff0c;只是出现waiting for process detach-C…

Day04-SHELL自动化编程-循环与颜色函数库

Day04-SHELL自动化编程-循环与颜色函数库 11. 必知必会核心命令11.1 命令概述11.7 案例11.8 小结 12 Shell编程-循环12.1 循环概述12.2 for循环1&#xff09;最常用的for循环格式2&#xff09;c语言格式for循环3&#xff09;for循环格式及应用场景4&#xff09;案例 12.3 while…