当前位置: 首页 > news >正文

python学习——【第八弹】

前言

上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此python中的序列的学习就完成啦,这篇文章开始学习python中的函数

在这里插入图片描述

函数

在学习其他编程语言的时候我们就了解过函数函数就是执行特定任何以完成特定功能的一段代码

那么我们为什么要使用函数呢?

复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试

函数的创建

python中函数的创建方式:

def 函数名 ([输入参数]):
函数体
[return xxx]

形参:形参出现在函数的定义处
实参:实际参数的值,位置出现在函数的调用处
在这里插入图片描述

函数的调用

在学习其他的语言时我们知道,函数只有在调用的时候才能执行,python中的函数也是一样的。调用函数的方式也很简单:

[返回值] = 函数名([参数])
如果函数没有参数,则括号中可以留空
def pri():print('helloworld')
pri()#调用函数 

那么在调用函数时,对调用的参数有什么要求呢?

函数调用的参数传递

位置实参:根据形参对应的位置进行实参传递

def add(a,b):num=a+breturn num
result=add(10,20)
print(result)  #30

关键字实参:根据形参名称进行实参传递

def add(a,b):num=a+breturn num
result=add(b=10,a=20)
print(result) #30

需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。

函数参数的定义

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

def fun1(a,b=10):print(a,b)
# 函数调用
fun1(100) #100 10
fun1(20,30) #20 30 与默认形参值不相符,传递实参值

个数可变的位置形参

1:定义函数时,可能无法事先确定传递的位置的实参的个数,可以使用可变的位置参数
2:使用 * 定义个数可变的位置形参
3:结果为元组类型
4:如果没有需传递的位置实参,但是使用了可变的位置参数,这时再调用该函数,会返回一个空元组 即args=()

def fun1(*args):print(args,type(args))
fun1(10)
fun1(10,20)
fun1(10,20,30)
'''
(10,) <class 'tuple'>
(10, 20) <class 'tuple'>
(10, 20, 30) <class 'tuple'>
'''
def fun11(x,y,*args): #已知形参(x,y)要放在位置形参之前;否则会报 SyntaxError: invalid syntax 无效语法错误print('x=',x)print('y=',y)print('args=',args)
fun11(11,22,33,44,55)'''
x= 11
y= 22
args= (33, 44, 55)
'''

注意:使用个数可变的位置参数时,可变的位置参数只能是1个
在这里插入图片描述

个数可变的关键字形参

1:定义函数时,无法事先确定确定传递的关键字实参的个数时,使用可变的关键字形参

2:使用 ** 定义个数可变的关键字形参

3:结果是一个字典

4:如果没有需要传递的关键字实参,但是使用了可变的关键字参数,这时再调用该函数,会返回一个空字典 即args={}

def fun2(**args):print(args,type(args))
fun2(a=10)
fun2(a=10,b=20,c=30)
'''
{'a': 10} <class 'dict'>
{'a': 10, 'b': 20, 'c': 30} <class 'dict'>
'''def fun22(x,y,**args):  #已知形参(x,y)要放在关键字形参之前;并且位置实参的个数要和位置形参的个数保持一致,否则会报:TypeError: fun22() takes ... positional arguments but ... were given  实参数与形参数不符print('x=',x)print('y=',y)print('args=',args)
fun22(11,22,c=10,d=0)
'''
{'a': 10}
{'a': 10, 'b': 20, 'c': 30}
'''

注意:使用个数可变的关键字形参时,可变的关键字形参只能是1个

def fun6(**args,**args):pass
# 程序报错 SyntaxError: invalid syntax  无效语法

定义函数的过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变的位置形参放在个数可变的关键字形参之前。

def fun(x, y, *args, **argss):print("x=", x)print("y=", y)print("args=", args)print("argss=", argss)
fun(1, 2, 3, 4, e=5, f=6, g=7) 
'''
x= 1
y= 2
args= (3, 4)
argss= {'e': 5, 'f': 6, 'g': 7}
'''
# 可变位置参数和可变关键字参数需要传递的实参数不相匹配时,如果可变位置参数或可变关键字参数没有收到需要传递的实参的值的话,调用函数时分别返回空元组和空字典。
def fun(x, y, *args, **argss):print("x=", x)print("y=", y)print("args=", args)print("argss=", argss)
fun(3, 4) 
'''
x= 3
y= 4
args= ()
argss= {}
'''

函数参数的传递

位置参数的传递

def funs(a,b,c):print('a=',a)print('b=',b)print('c=',c)
funs(10,20,30)
lst=[11,22,33]
funs(*lst)# 使用位置参数传递,在函数调用时,将列表中的每个元素都转换为位置参数传入
'''
a= 10
b= 20
c= 30
a= 11
b= 22
c= 33
'''

关键字参数的传递

# 关键字参数传递
funs(a=111,b=222,c=333)
dic={'a':444,'b':555,'c':666}
funs(**dic)# 使用关键字参数传递,在函数调用时,将字典中的每个元素的键值对都转换为关键字参数传入
'''
a= 111
b= 222
c= 333
a= 444
b= 555
c= 666
'''

在 * 之后的参数,在函数调用时,只能采用关键字参数进行传递

def funcs(a,b,*,c,d):print('a=',a)print('b=',b)print('c=',c)print('d=',d)
funcs(10,20,c=30,d=40)
'''
a= 10
b= 20
c= 30
d= 40
'''

在这里插入图片描述

函数传递时形参的位置问题

在这里插入图片描述

函数的参数总结
1 :将序列中的每个元素都转换为位置实参 使用*

2 :将字典中的每个键值对都转换为关键字实参 使用 **

3 : 关键字形参 使用*

4 :个数可变的位置形参 使用*

5 :个数可变的关键字形参 使用**

函数调用参数传递内存分析

def fun(num1,num2):print('num1=',num1,id(num1)) #num1= 90 140471326216032print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44] 140471317443120num1=111num2.append(999)print('num1=',num1,id(num1)) #num1= 111 140471326216704print('num2=',num2,id(num2)) #num2= [11, 22, 33, 44, 999] 140471317443120
print('---------调用函数之前---------')
add1=90
add2=[11,22,33,44]
print(add1,id(add1))  #90 140471326216032
print(add2,id(add2))  #[11, 22, 33, 44] 140471317443120
print('-------------调用函数----------')
fun(add1,add2)
'''
num1= 90 140471326216032
num2= [11, 22, 33, 44] 140471317443120
num1= 111 140471326216704
num2= [11, 22, 33, 44, 999] 140471317443120
'''
print('-----------调用函数后----------')
print(add1,id(add1)) #90 140471326216032
print(add2,id(add2))  #[11, 22, 33, 44, 999] 140471317443120

在这里插入图片描述

可以发现:在函数调用过程中,若要进行参数传递:

如果是可变对象(如列表、集合、字典),在函数体内对其进行修改会影响到函数体外的这个可变对象的值(因为可变对象在内存中是可变的,可以被修改),其id地址不会发生改变

如果是不可变对象(如数值、字符串、元组),在函数体内对其进行修改不会影响到函数体外这个不可变对象的值(因为不可变对象在内存中是固定的,无法被修改),其id地址不会发生改变

函数返回值

1:当函数不需要返回值时,函数体内可以省略return;并且​函数执行完毕后,不需要给调用处提供数据

def pri():print('helloworld')
pri()

2:当函数只有一个返回值时,返回值类型就是原类型

def fun2():return 'hello'
res=fun2()
print(res,type(res)) #hello <class 'str'>

3:当函数有多个返回值时,返回值类型是一个元组

def fun(num):odd=[]even=[]for i in num:if i%2==0:odd.append(i)else:even.append(i)return odd,even
list1=[11,22,32,23,45,6,0]
print(fun(list1),type(fun(list1)))
# ([22, 32, 6, 0], [11, 23, 45]) <class 'tuple'>

变量的作用域

程序代码能访问该变量的区域 称作变量的作用域

根据变量的有效范围可分为:

局部变量

在函数体内定义并使用的变量,只在函数内部有效,局部变量使用global声明 , 这个变量就会成为全局变量

def func1(a,b):c=a+b   #c 就成为局部变量  因为c是在函数体内进行定义的变量   a,b是函数的形参  作用范围也是函数内部  相当于局部变量return c
print(func1(1,2))#3
# 使用global 声明局部变量,a b为全局变量,在函数体内可以直接被调用;c在函数体内定义,属于局部变量,因此需要用global声明才能在函数体外被调用
a=1
b=2
def func3():global cc=a-breturn c
print(func3())  #-1

全局变量

函数体外定义的变量 ,可作用于函数体内

# 全局变量  a=1,b=2为定义在函数体外的变量,属于全局变量,在函数体内与函数体外均可调用
a=1
b=2
def func2():c=a+breturn c
print(func2())  #3

递归函数

什么是递归函数如果在一个函数的函数体内调用了该函数本身, 这个函数就称作递归函数

递归的组成部分递归调用与递归终止条件

递归的调用过程每递归调用一次函数 ,都会在栈内存分配一个栈帧(每次调用函数时,在内存中都会单独开辟一个空间,配合函数运行,这个空间叫做栈帧空间。)每执行完一次函数, 都会释放相应的空间

递归的思想

递归是一去一回的过程,调用函数时,会开辟栈帧空间,函数执行结束之后,会释放栈帧空间,递归实际上就是不停地开辟和释放栈帧空间的过程,每次开辟栈帧空间,都是独立的一份,其中的资源不共享。

递归其实利用的时是压栈的思想,我们看一下下面这个例子:
在这里插入图片描述

压栈思想:
在这里插入图片描述

递归的优缺点

优点:

递归函数使代码看起来干净整洁。
使用递归可以将复杂的任务分解为更简单的子问题。
与使用嵌套嵌套相比,使用递归更容易生成序列。

缺点:

有些情况,递归背后的逻辑很难遵循。
递归调用很昂贵(效率低),因为它们占用大量内存和时间。
递归函数调试较为复杂。

递归函数的应用

利用递归函数计算阶乘

def func1(n):if n == 1:return 1else:return n*func1(n-1)
print(func1(6)) #720

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

利用递归函数计算​ ​斐波那契数列​​

斐波那契数列:1、1、2、3、5、8、13、21、34。。。

F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

计算第n位的斐波那契数是多少

def func2(n):if n == 1:return 1elif n == 2:return 1else:res=func2(n-1)+func2(n-2)return res
print(func2(6)) #8

打印出整个斐波那契数列

for i in range(1,7):print(func2(i),end=' ')
print('\n')#1 1 2 3 5 8 

键盘录入一个整数,然后根据这个正整数打印出斐波那契数列以及其数列和

num=int(input('请输入一个正整数:'))
def func3(num):if num==1:return 1elif num==2:return 1else:result=func3(num-1)+func3(num-2)return result
nums=[]
sums=0
for n in range(1,num+1):# print(func3(n),end=' ')nums.append(func3(n))sums+=func3(n)
print('产生的斐波那契数列是:',nums)
print('\n第',num,'位的斐波那契数为:',func3(num))
print('\n斐波那契数列之和为:',sums)

在这里插入图片描述

每篇一语

努力的人运气都不会太差!

如有不足,感谢指正!

相关文章:

python学习——【第八弹】

前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合&#xff0c;自此python中的序列的学习就完成啦&#xff0c;这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就了解过函数&#xff1a;函数就是执行特定任何以完成特定功能的一段代…...

铁路应答器传输系统介绍

应答器传输系统 应答器传输系统是安全点式信息传输系统&#xff0c;通过应答器实现地面设备向车载设备传输信息。 应答器可根据应用需求向车载设备传输固定的&#xff08;通过无源应答器&#xff09;或可变的&#xff08;通过有源应答器&#xff09;上行链路数据。 当天线单…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;通过BGAPI SDK直接保存Mono12/16图像3&#xf…...

C语言入门篇——介绍篇

目录 1、什么是C语言 1、C语言的优点 3、语言标准 4、使用C语言的步骤 5、第一个C语言程序 6、关键字 1、什么是C语言 1972年&#xff0c;贝尔实验室的丹尼斯里奇和肯汤普逊在开发UNIX操作系统时设计了C语言&#xff0c;C语言是在B语言的基础上进行设计。C语言设计的初衷…...

Latex数学公式排版

文章目录 Latex使用最佳方式&#xff1a;读官方文档Latex中的字符数学公式排版1.引入宏包:2.公式排版基础3.数学符号(1).希腊字母(2).指数,上下标,导数(3).分式和根式(4).关系符(5).算符(6).巨算符(7).箭头 Latex使用 最佳方式&#xff1a;读官方文档 The not so short intro…...

【Linux】-关于Linux的指令(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; TOC 前言 今天我们来讲关于Linux的基本指令&#xff0c;博主讲的指令会对应着Windows…...

【论文写作】引言写作的四个重要的语言点之时态!!!

在本篇文章当中&#xff0c;我们将着重介绍四个重要的写作语言要点之一的时态&#xff0c;其他语言点如下&#xff1a; 1. 时态 2. 标志性的衔接词 3. 主动、被动语态 4. 段落 1. 简单现在时和现在进行时 时态主要有现在时和现在进行时&#xff0c;看以下两个句子 I live in…...

Super Yolo论文翻译

论文&#xff1a;SuperYOLO: Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery【IEEE】 论文地址&#xff1a; IEEE Xplore Full-Text PDF:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10075555项目地址&#xff1a;icey…...

【CocosCreator入门】CocosCreator组件 | ProgressBar(进度条)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的ProgressBar组件是一种用于实现进度条效果的重要组件。它可以让我们在游戏中展示各种进度条效果&#xff0c;例如加载进度条、血条等。 目录 一、组件介绍 二、组件属性 三、脚本…...

大数据数仓维度建模

目录 维度建模分为三种&#xff1a; 1、星型模型&#xff1a; 2、雪花模型&#xff1a; 3、星座模型&#xff1a; 模型的选择&#xff1a; 维度表和事实表&#xff1a; 维度表&#xff1a; 维度表特性 &#xff1a; 事实表&#xff1a; 事实表特性&#xff1a; 事务型…...

ESP32设备驱动-BH1745NUC 亮度和颜色传感器驱动

BH1745NUC 亮度和颜色传感器驱动 文章目录 BH1745NUC 亮度和颜色传感器驱动2、硬件准备3、软件准备4、驱动实现BH1745NUC 是具有 IC 总线接口的数字颜色传感器 IC。 该 IC 感应红光、绿光和蓝光 (RGB) 并将它们转换为数字值。 高灵敏度、宽动态范围和出色的 Ircut 特性使该 IC …...

通达信VCP形态选股公式,憋了好几天才写出来

VCP形态的英文”Volatility Contraction Pattern”的缩写&#xff0c;意思是“波动收缩形态”。VCP形态是全美交易冠军马克米勒维尼的核心交易模式之一&#xff0c;在其著作《股票魔法师》中有详细介绍。 马克米勒维尼把VCP形态比喻为湿毛巾&#xff0c;拧过一次后仍含水&…...

vue 知识储备

vue2 和 vue3 的区别 模块拆分:vue3采用 compnent API 更注重模块上的拆分,而vue2中则需要使用完整的vuejs,无法使用单独的模块重写API:vue2组件方法挂载到实例中未使用也会被打包,vue3通过 tree-shaking机制,实现按需引入,减少用户打包后体积数据双向绑定:vue2使用 Ob…...

MySQL表的增删查改

目录 一 插入 1 基本语法 ①全列插入 ②指定列插入 ③多条记录插入 ④冲突更新 二 查询 查询全部数据 指定列查询 显示 拼接 取别名 去重查找 where 逻辑运算符和比较运算符 结果排序 Limit group by 分组 聚合函数 对于count 对于sum 对于group by 相关的语…...

详解C语言string.h中常用的14个库函数(三)

本篇博客继续讲解C语言string.h头文件中的库函数。本篇博客计划讲解3个函数&#xff0c;分别是&#xff1a;strstr, strtok, strerror。其中strstr函数我会用一种最简单的方式模拟实现。 strstr char * strstr ( const char * str1, const char * str2 );strstr可以在str1中查…...

无人机视频与GIS融合三维实景怎么实现?

无人机视频与GIS融合三维实景怎么实现?无人机三维GIS作为一项新兴的测绘重要手段&#xff0c;具有续航时间长、成本低、机动灵活等优点&#xff0c;为城市的规划建设带来极大便利。 那么此项技术有什么样的特点呢?下面智汇云舟就带大家一起来了解一下。 三维是将采集以及经运…...

瞬间让你效率提高一倍的高效学习方法

方法不对&#xff0c;努力白费&#xff1b;方法对了&#xff0c;事半功倍&#xff01;在学习的过程中我们会遇到各种困难与阻碍&#xff0c;如何发现并优化自己的学习方法就变得尤为重要。高效学习方法是指通过科学的、有效的方法来提高学习效率&#xff0c;实现更好的学习成果…...

442. 数组中重复的数据|||41. 缺失的第一个正数|||485. 最大连续 1 的个数

442. 数组中重复的数据 题目 给你一个长度为 n 的整数数组 nums &#xff0c;其中 nums 的所有整数都在范围 [1, n] 内&#xff0c;且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数&#xff0c;并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅…...

中国地图标准坐标和投影参数

目录 一、地理坐标 二、投影坐标 三、ArcGIS投影变换 四、说明 一、地理坐标 GCS_Krasovsky_1940&#xff08;克拉索夫斯基_1940椭球体&#xff09; 具体参数如下图&#xff1a; 每个国家或地区都有各自的基准面&#xff0c;我们通常所说的北京54坐标系、西安80坐标系实际上…...

CNN中卷积层、池化的计算公式

卷积计算公式 1、卷积层输入特征图(input feature map)的尺寸为&#xff1a;(batch_size,Channel,H,W) H(input)表示输入特征图的高 W(input)表示输入特征图的宽 C(input)表示输入特征图的通道数&#xff08;如果是第一个卷积层则是输入图像的通道数&#xff0c;如果是中间…...

基类派生类多态虚函数?

通常在层次关系的根部有一个基类&#xff0c;其他类则直接或间接的从基类继承而来&#xff0c;这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员&#xff0c;而每个派生类定义各自特有的成员。 成员函数与继承派生类可以继承其基类的成员, 然而有时…...

像素是什么

像素分为设备像素和设备无关像素。 下面说说来龙去脉。 一、显示器 显示图像的电子设备。 &#xff08;一&#xff09;显示器种类 1.LCD LCD&#xff08;Liquid crystal display&#xff09;&#xff0c;是液体晶体显示&#xff0c;也就是液晶显示器&#xff0c;LCD具有功耗低…...

NAT转换

目录标题 NAT&#xff1a;网络地址转换&#xff08;cisco篇&#xff09;一对一&#xff08;静态&#xff09;一对多&#xff08;动态&#xff09;多对多&#xff08;动、静均可&#xff09;端口映射&#xff08;静态&#xff09; nat:网络地址转换&#xff08;华为篇&#xff0…...

设计模式:创建者模式 - 单例模式

文章目录 1.介绍2.单例模式的结构3.单例模式的实现&#xff08;饿汉、懒汉&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;懒汉式-方式1&#xff08;线程不安全&#xff09;懒汉式-方式2&#xff08;线程安全…...

C++语言亚马逊国际获取AMAZON商品详情 API接口(

跨境电子商务是一种全新的互联网电商模式&#xff0c;运用电子化方式促成线上跨境交易&#xff0c;利用跨境物流运送商品&#xff0c;有利于打破传统的贸易格局&#xff0c;成为新的经济增长点。对我国来说&#xff0c;跨境电商平台正用一种全新的力量改变我国产业链的结构&…...

在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?

粉丝提问&#xff1a; 彭老师&#xff0c;问下&#xff0c;在程序里面执行system(“cd /某个目录”)&#xff0c;这样会切换不成功&#xff0c;为啥呢 实例代码&#xff1a; 粉丝的疑惑是明明第10行执行了cd /media操作&#xff0c; 为什么12行执行的pwd > test2.txt 结…...

c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 上一章&#xff0c;我们将c入门的基础知识进行了学习&#xff0c;本章其实才算真正的跨入到c开始可能比较难&#xff0c;但只有我们唯有不断的前进&#xff0c;才能斩断荆棘越过人生的坎坷&#xff01; 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&…...

关于Open Shift(OKD) 中应用管理部署的一些笔记

写在前面 因为参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为介绍 openshift 不同的创建应用的方式&#xff0c;包括&#xff1a; 基于 IS 创建应用基于镜像创建应用基于源码和 image 创建应用基于源码和 IS 创建应用基于模板创建应用 学习环境为 openshift v…...

【linux】对于权限的理解

权限 Linux权限的概念用户之间的切换 Linux权限管理文件权限操作文件的人Linux文件默认权限的设置权限掩码 所属组/其他删除拥有者创建的文件文件拥有者、所属组的修改修改文件拥有者修改文件所属组一次性修改拥有者和所属组 目录的执行权限 Linux权限的概念 首先&#xff0c;…...

测试人必备技能:如何进行WebSocket接口测试?

目录 前言 WebSocket介绍 HTTP与WebSocket的区别 二者关系 WebSocket测试方法 使用Postman 使用Jmeter 使用Python 结语 前言 随着Web应用的日益普及&#xff0c;WebSocket作为一种全双工通信协议&#xff0c;在移动端、游戏、视频会议等方面得到广泛应用。 而对于需…...