python中的函数介绍

news2024/10/5 19:12:34

文章目录

  • 1.函数
    • 1.1 语法格式
    • 1.2 函数参数
    • 1.3 函数的返回值
    • 1.4 变量作用域
    • 1.5 函数的执行过程
    • 1.6 链式调用
    • 1.7 嵌套调用
    • 1.8 函数栈帧
    • 1.9 函数递归
    • 1.10 参数默认值
    • 1.11 关键词参数

1.函数

无论是编程中的函数还是数学中的函数,本质都是差不多的,丢给函数一些值,函数在经过一系列的处理返回一个值。不过编程上函数也可以不返回值就是了。
可以把编程上的函数理解为一段可以重复使用的代码片段.

求一段区间的和。

#求1~100的和
sum = 0
for i in range(1,101):
	sum+=1
print(sum)

#求1~1000的和
sum = 0
for i in range(1,1001):
	sum+=i
print(sum)

#求20~40的和
sum = 0
for i in range(20,41):
	sum+=i
print(sum)

这3段代码都同质化严重,就只有for循环之中的范围变了,那么我们就可以把其写为一个函数来多次调用。

#定义函数
def calcSum(left,right):
	sum = 0
	for i in range(left,right):
		sum+=i
	print(sum)
#调用函数
calcSum(1,101)
calcSum(1,1001)
calcSum(20,41)
'''
5050
500500
630
'''

是不是很简洁,这就是函数的运用,把重复的代码给消除了。

1.1 语法格式

创建函数/定义函数

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

调用函数/使用函数

函数名(实参列表)#不考虑返回值
返回值 = 函数名(实参列表)#考虑返回值

函数只有在被调用时才会执行。

函数必须先定义再使用

test()

def test():
	print('hahaha')

此时会报错,因为还没有定义就执行了。

1.2 函数参数

在函数定义的时候,可以在()中指定形式参数简称形参,然后在调用时,由调用者把实际参数简称实参,传递过去。
这样就可以做到一份函数,针对不同的数据进行计算处理。

#定义函数
def calcSum(left,right):
	sum = 0
	for i in range(left,right):
		sum+=i
	print(sum)
#调用函数
calcSum(1,101)
calcSum(1,1001)
calcSum(20,41)

在这个代码中,left right就是函数的形参,1,100...就是函数的实参。
注意:

  • 一个函数可以由一个形参,也可以有多个形参,也可以没有形参。
  • 一个函数的形参有几个,那么传递实参的时候也要传相应的个数,保证个数匹配。
  • 和C++/java不同,python是动态类型的编程语言,函数的形参不必指定参数类=类型,也就是说一个函数可以支持多种不同类型的参数,类似于函数重载。
def test(tmp):
	print(tmp)
test(10)
test('hahaha')
test(False)
'''
10
hahaha
False
'''

1.3 函数的返回值

函数的参数可以视为函数的输入,那么函数的返回值就可以视为函数的输出

为了方便理解,我们可以把函数想象成一个工厂,所谓的函数输入就是提供给工厂的原材料,函数输出就工厂提供的产品。

还是上面的求和函数

##无返回值
#定义函数
def calcSum(left,right):
	sum = 0
	for i in range(left,right):
		sum+=i
	print(sum)
#调用函数
calcSum(1,101)

##有返回值
def calcSum(left,right):
	sum = 0
	for i in range(left,right):
		sum+=i
	return sum
#调用函数
print(calcSum(1,101))

这两种代码的区别就在于,前者直接子啊函数的内部就打印了,后者使用了return语句把结果返回給函数的调用者,再有调用者负责打印。

为了满足逻辑和用户交互分离的编程原则,第二种写法更好。在第一种写法中,然后后续我们需要保存结果到文件中,或者通过网络发送,第一种写法就难以胜任了。而第二种写法只负责计算逻辑不负责和用户交互,那么就会有更多的搭配可以实现。

一个函数可以有多个return语句。

#判断一个整数是否为奇数
def isOdd(num):
	if num%2 == 0:
		return False
	else:
		return True
x = int(input("输入一个整数:"))
ret = isOdd(x)
print(ret)

执行到return语句函数便会退出,回到开始调用的位置。
验证:

#判断一个整数是否为奇数
def isOdd(num):
	if num%2 == 0:
		return False
	return True
ret = isOdd(10)
print(ret)

num是偶数,返回Flase后不会再返回True了。

python可以同时返回多个值,使用,来分割多个返回值。

def test():
	a = 100
	b = 200
	return a,b
x,y = test()
print(x)
print(y)
'''
100
200
'''

如果需要关注其中的部分返回值,可以使用_来忽略不需要的返回值。

def test():
	a = 100
	b = 200
	return a,b
_,y = test()
print(y)
# 200

1.4 变量作用域

def test():
	a = 100
	b = 200
	return a,b
a,b = test()

观察代码,函数内外部存在相同命名的变量。但其实这两组变量是不同的变量,只是名字相同,它们的地址是不会相同的。
每个变量都有它们的作用域,变量只能在自己的作用域中生效。

def test():
	a = 100
	b = 200
	return a
print(a)
# error name 'a' is not defined

在不同的作用域中,允许存在不同同名的变量。

x = 10
def test():
	x = 100
	print(f'函数内部x = {x}')
test()
print(f'函数外部x = {x}')
'''
函数内部x = 100
函数外部x = 10
'''
  • 在函数内部的变量,称为局部变量。
  • 不在任何函数内部的变量,也称为全变量。
    如果函数内部尝试访问的变量在局部不存在就会尝试去全局去寻找。
x = 100
def test():
	print(f'x = {x}')
test()
# 100

如果想要在函数内部修改全局变量的值,需要使用global关键字声明。

x = 100
def test():
	global x
	x = 10
	print(f'函数内部x = {x}')
test()
print(f'函数外部x = {x}')
'''
函数内部x = 10
函数外部x = 10
'''

如果没有global的声明的话,系统会认为x = 10是一个新创建的局部变量。

if/while/for等语句不会影响到变量作用域,也就是说,在if/while/for中定义的变量,在语句外也可以正常使用。

for i in range(1,10):
	print(f'函数内部 i = {i}')
print(f'函数外部 i = {i}')

1.5 函数的执行过程

  • 调用函数才会执行函数体代码,不调用就不会执行。
  • 函数体执行结束(或者遇到return语句)则会回到函数调用位置,继续往下执行。
def test():
	print('hahaha')
	print('hahaha')
print('xixixi')
test()
print('xixixi')

1.6 链式调用

其实前面我们已经用过链式调用了

##有返回值
def calcSum(left,right):
	sum = 0
	for i in range(left,right):
		sum+=i
	return sum
#调用函数
print(calcSum(1,101))#链式调用

把一个函数的返回值,作为另一个函数的参数就是链式调用

1.7 嵌套调用

函数内部还可以调用其他的函数,这叫做嵌套调用。

def testPrint():
	print('嵌套调用')
	print('嵌套调用')
	print('嵌套调用')

test函数内调用了print函数
一个函数里面可以嵌套调用任意多个函数。
函数嵌套的过程是非常灵活的。

def a():
	print('a')
def b():
	a()
	print('b')
def c():
	b()
	print('c')
c()
'''
a
b
c
'''

1.8 函数栈帧

函数之间的调用关系,在python中会使用一个特定的数据结构来表示,称为函数调用栈。每次的函数调用,都会在调用栈里新增一个元素,称为栈帧
每个函数的局部变量都包含在自己的栈帧中

1.9 函数递归

递归是嵌套调用中的一种特殊情况,就是自己调用自己。

程序调用自身的编程技巧称为递归(recursion)
递归作为一种算法在程序设计语言中广泛应用.一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型问题层层转化为一个于原问题相似的规模较小的问题来求解.
递归策略
只需要少量的代码就可以描述出解题所需要的多重计算,大大的减少程序的代码量.
递归的主要思想在于:把大事化小

#计算10的阶乘
def factor(n):
	if n == 1:
		return 1
	return n*factor(n-1)
print(factor(10))
## 3628800

注意:递归代码要保证

  • 存在限制条件,当满足这个限制条件的时候,递归便不在继续。
  • 每次递归调用之后越来越接近这个限制条件。
    递归的优点
  • 递归类似于数学归纳法明确初始条件,盒递推公式,就可以解决一系列的问题。
  • 递归的代码量往往很少。
    递归的缺点
  • 递归代码往往难以理解,很容易超出操控范围。
  • 递归代码容易出现栈溢出的问题。
  • 递归代码往往可以转换成等价的循环代码,并且通常来说,循环版本的代码效率更高。

1.10 参数默认值

Python中的函数,可以给形参指定默认值。
带有默认值的参数,可以子啊调用的时候不传参。即缺省参数

def add(x,y,debug = False):
	if debug:
		print("haha")
	return x+y
print(add(1,2))
print(add(10,20,True))

'''
3
haha
30
'''

注意:带有默认值的参数需要放到没有默认值得参数后面

1.11 关键词参数

在调用函数得时候,需要给函数指定实参,一般默认情况下是按照形参得顺序,来传递实参的。但是我们也可以通过关键字参数,来调整这里的传参顺序,显式指定当前实参传递给哪个形参。

def test(x,y):
	print(f'x = {x}')
	print(f'y = {y}')
test(x = 10,y = 20)
test(y = 111,x = 222)

'''
x = 10
y = 20
x = 222
y = 111
'''

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

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

相关文章

【评测】湖北十堰大带宽300M高防云服务器

湖北十堰的高防服务器拥有高性能处理器、大容量DDR4 ECC内存、SSD硬盘及多种带宽配置,性价比高且配置灵活。它防御强劲,性能稳定可靠,扩展性佳,可满足各类企业需求,是优质服务器的绝佳选择。 清风云官网:ht…

【含文档】基于Springboot+Andriod的成人教育APP(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

如何正确输入IP地址前面的斜杠:详细指南

在网络配置和文档编写中,经常需要准确地输入IP地址及其子网掩码。IP地址前面的斜杠(/)用于表示子网掩码的位数,是一个重要的组成部分。然而,对于一些用户来说,输入这个斜杠可能会带来一些困惑。本文将详细介…

c++ union内存布局

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;//定义一个union union Data{int a;char s[7]; //char值的范围(-128~127) }; int main() {//创建一个unionData d;d.s[0] 255; //16进制 0xFF 16进制F对应二进制 1111d.s[1] 1; …

国外电商系统开发-运维系统拓扑布局

点击列表中设备字段&#xff0c;然后定位到【拓扑布局】中&#xff0c;可以看到拓扑发生了变化 再回头&#xff0c;您再次添加一个服务器到系统中&#xff0c;并且选择该服务器的连接节点为您刚才创建的“SDN路由器”&#xff0c;保存后&#xff0c;您可以看到这个服务器连接着…

胡超:引领中美能源与文化合作的创意先锋

中美能源合作领域迎来了一个重要的历史时刻,2024年中美可持续发展峰会(Sino-American Symposium on Sustainable Development)在全球关注下圆满落幕。这场峰会不仅成为了中美两国绿色能源合作的高端平台,也展示了作为该活动的协办方RES(Reverse Energy Solutions)在清洁能源领域…

Django网站admin用户和组的权限机制

Step 1 创建超级用户 python manage.py createsuperuser 在终端输入 Step 2 输入用户名和密码 Step 3在网站上输入 127.0.0.1&#xff1a;8000/admin Step 4创建群组和用户 让创建的组和用户可以访问网站 def index(request):groupnameslist(request.user.groups.values(name)…

【api连接ChatGPT的最简单方式】

通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理&#xff0c;若连接官网可省略&#xff1b;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…

LC刷题专题:堆、大顶堆、小顶堆

文章目录 692. 前K个高频单词215. 数组中的第K个最大元素2336、无限集中的最小数字 这篇文章以后记录自己刷到的题目中与堆有关的。 692. 前K个高频单词 这个题目整体不难&#xff0c;是前k个高频元素的改进版&#xff0c;只需要在创建小顶堆时执行排序规则即可。如果出现次数…

Yolov8轻量级网络改进GhostNet

1,理论部分 由于内存和计算资源有限,在移动设备上部署卷积神经网络 (CNN) 很困难。我们的目标是通过利用特征图中的冗余,为 CPU 和 GPU 等异构设备设计高效的神经网络,这在神经架构设计中很少被研究。对于类 CPU 设备,我们提出了一种新颖的 CPU 高效 Ghost (C-Ghost) …

【2024】uniapp 接入声网音频RTC【H5+Android】Unibest模板下Vue3+Typescript

需求 最近开发一个项目&#xff0c;需要实现声网的接入。由于采用uniapp模式&#xff0c;按照最佳实践采用优先开发H5再适配的模式。因此实现了H5和Android两种模式的接入&#xff0c;Android里采用离线打包自定义基座来进行调试。怕自己忘记了&#xff0c;在这里详细的记录完…

深入学习从入门到放弃:掌握梯度概念,开始征服深度学习!

文章目录 从现实中的例子理解什么是梯度梯度的数学定义梯度的严格的数学定义为什么梯度向量指向函数增长最快的方向&#xff1f; 为什么梯度是深度学习优化的最基础概念在python中实现梯度求导的简单案例一元线性回归多元线性回归 结合示例深度学习中的梯度求导的一般过程数学原…

开源AI智能名片链动2+1模式S2B2C商城小程序源码在B2B情境化营销中的应用

摘要&#xff1a;本文探讨情境化营销在B2B环境中的适用性&#xff0c;分析现有的B2B情境化营销案例&#xff0c;如通过物联网传感设备进行设备监控与预防保养。随后引入“开源AI智能名片链动21模式S2B2C商城小程序源码”&#xff0c;阐述其如何助力B2B企业在情境化营销中提升效…

弧形导轨驱动器高效使用技巧!

弧形导轨驱动器是一种用于驱动滑座沿着导轨做弧线运动的设备&#xff0c;其用方法因具体型号和应用场景的不同而有所差异&#xff0c;通常可以归纳为以下几个步骤&#xff1a; 1、安装前要明确弧形导轨的使用需求&#xff0c;根据需求选择合适的弧形导轨驱动器&#xff0c;准备…

Python办公自动化教程(005):Word添加段落

文章目录 2.1 Python-docx介绍2.2 安装2.3 实例 2.1 Python-docx介绍 python-docx 是一个用于创建和修改 Microsoft Word 文档&#xff08;.docx 格式&#xff09;的 Python 库。它可以方便地生成和处理 Word 文档&#xff0c;而无需直接与 Microsoft Word 程序交互。 2.2 安…

运营弹性的 5 大支柱

作者&#xff1a;来自 Elastic Elastic Platform Team 什么是运营弹性&#xff1f; 没有哪个组织能够免受干扰。无论是错误的更新、有针对性的网络攻击&#xff0c;还是导致大规模供应链动荡的全球流行病&#xff0c;大多数公司在某个时候都会遇到障碍。这是增长的代价。但成功…

2024/10/5 英语每日一段

“There’s no reason, frankly, that someone who already has a passport and just needs to renew it shouldn’t be able to do that online, “Secretary of State Antony Blinken said at a March budget hearing. The State Department launched a pilot program for on…

ARM嵌入式学习--第一天

-ARM核介绍 -CPU核 CPU又叫中央处理器&#xff0c;其主要功能是进行算数运算和逻辑运算&#xff0c;内部结构大概可以分为控制单元&#xff0c;算术逻辑单元和储存单元等几个部分 -ARM核 工作模式&#xff1a; user mode:用户模式是用户程序的工作模式&#xff0c;他运行在操作…

Python并发编程(3)——Python多线程详解介绍

左手编程&#xff0c;右手年华。大家好&#xff0c;我是一点&#xff0c;关注我&#xff0c;带你走入编程的世界。 公众号&#xff1a;一点sir&#xff0c;关注领取python编程资料 Python 的多线程入门是非常简单的&#xff0c;直接导入threading模块就可以开始多线程之旅了。模…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&#x…