Python:函数

news2025/1/13 3:31:54

目录

前言:

一、函数的定义

二、函数的调用

三、函数的分类

四、全局变量和局部变量

五、函数的参数

5.1 位置参数

5.2 默认值参数

5.3 可变参数

5.4 关键字参数

5.5 命名关键字参数

5.6 参数的组合

六、函数的递归


前言:

        函数就是一个过程、功能、动作,实现一个功能或者某些功能的一个集合。 函数是一个功能或者是一个过程,在python中可以将同样的代码封装成一个函数,给这个函数起个名字,下次用到的时候直接调用即可。

一、函数的定义

在python中,定义函数的时候用到def(define function)关键字。

语法结构i:

def 函数名称([参数]):
    #缩进
    函数体
    [return 返回值]

#定义一个取绝对值的函数
def my_abs(x):
    if x < 0:
        return -x
    else:
        return x
print(my_abs(-99))

函数有返回值的情况下会根据实际情况进行返回,如果函数没有返回值,其实也是有返回值的,只是返 回的是None

1. 如果要定义一个空函数(暂时没有什么功能)使用关键字pass

2. 函数的参数检查

>>> def my_abs(x):
...     if x < 0:
...         return -x
...     else:
...         return x
...
>>> my_abs(-99)
99
>>> my_abs(-99,99)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given
>>> my_abs("-99")
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<stdin>", line 2, in my_abs
TypeError: '<' not supported between instances of 'str' and 'int'
>>> abs(-99)
99
>>> abs("-99")
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

#定义一个取绝对值的函数
def my_abs(x):
    if not isinstance(x,(int,float)):
        raise TypeError("bad operand type")
    if x < 0:
        return -x
    else:
        return x
print(my_abs("-99"))

3.返回多个值

import math
def move(x,y,step,sngle=0):
    nx = x + step + math.cos(sngle)
    ny = y + step + math.sin(sngle)
    return nx,ny
print(move(100,100,60,math.pi/6))

总结:函数可以返回多个值,指的是return可以跟多个参数,但是函数本身返回的时候只有一个,是一 个元组。

import math
def move(x,y,step,sngle=0):
    nx = x + step + math.cos(sngle)
    ny = y + step + math.sin(sngle)
    return nx,ny
# print(move(100,100,60,math.pi/6))
x,y = move(100,100,60,math.pi/6)
print(x,y)

二、函数的调用

函数名称([参数])

>>> abs(99)
99
>>> abs(1,2)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (2 given)
>>> abs("A")
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

函数调用的时候要注意函数参数的个数与函数的类型。

>>> a = abs
>>> a(-99)
99

函数名称其实是指向函数对象的引用,可以把函数名称赋值给一个变量,实则是给函数起了别名。

三、函数的分类

1,以有无参数: 有参函数、无参函数

2,是否有返回值:有返回值函数无、返回值函数

3,按定义来分类:系统自定义函数(abs max min)、第三方函数(个人自己定义的 公司 组织)

四、全局变量和局部变量

全局变量: 在python中,定义在py文件中的变量称为全局变量

特点:代码运行的过程中始终有效

name = "zhangsan"

局部变量: 定义在函数中的变量称为局部变量

特点:在函数外面是不能访问函数内的变量(局部变量)

name = "zhangsan" #全局变量
def show(msg):
    gender = "男" #局部变量
    print(msg)
    print(gender)
    print(name)
print(gender)
print(name)
show("哈哈哈")
# print(show("哈哈哈"))

print(show("哈哈哈")) ----- 打印结果为None ,因为函数没有return 。反过来说,函数内部是可以访问全局变量,但是不能修改全局变量,如果一定要在函数内修改全局变量 的话,需要使用global(全局)关键字,但是不建议这样操作。

name = "zhangsan" #全局变量
age = 18
def show(msg):
    gender = "男" #局部变量
    global age
    age += 1
    print(age)
    print(msg)
    print(gender)
    print(name)
# print(gender)
# print(name)
show("哈哈哈")
# print(show("哈哈哈"))

值传递

def add(x,y):
    return x + y
x = float(input("请输入第一个数:"))
y = float(input("请输入第二个数:"))
print(add(x,y))

x、y是不是不冲突,add(x,y)中x和y是局部变量(形参),外面的x和y是实参,是把实参传递给了形参 引用传递(传递的是对象)。

def info(fn,msg):
    fn()
    print(msg)
def print_msg():
    print("自己定义的函数")
print(print_msg)#代表的内存地址,指向的print_msg本身,代表的函数的本身
print(print_msg())#代表的是函数的返回值,没有返回值,返回的就是None

def info(fn,msg):
    fn()
    print(msg)
def print_msg():
    print("自己定义的函数")
# print(print_msg)#代表的内存地址,指向的print_msg本身,代表的函数的本身
# print(print_msg())#代表的是函数的返回值,没有返回值,返回的就是None
#引用传递
info(print_msg,"哈哈哈哈")

注意:

1,在强数据类型语言中,函数不允许嵌套、包含函数

2,在弱数据类型语言中,函数是可以作为参数,传递到另一个函数中

五、函数的参数

函数的参数(位置参数、默认值参数、命名参数、可变参数、万能参数等)

# 计算圆的周长
def get_circle_cal(r,pi):
    return 2 * pi * r
if __name__ == '__main__':
    r = float(input("请输入圆的半径:"))
    cal = get_circle_cal(r,3.14)
    print("半径为{}的圆的周长为{}".format(r,cal))

注意:python中并不是从main函数入口的,python属于脚本语言,从上到下的顺序进行执行,python 中main函数的目的:写在main函数中的代码,不会导入到其他模块中。

5.1 位置参数

def power(x):
    return x * x

对于power(x),参数x就是一个位置参数。

def power(x,y):
    # return x ** y
    s = 1
    while y > 0:
        s = s * x
        y = y - 1
    return s
print(power(2,0))

5.2 默认值参数

def power(x,y=2):
    # return x ** y
    s = 1
    while y > 0:
        s = s * x
        y = y - 1
    return s
print(power(2))

默认值参数就是传递的参数如果没有给参数赋值的情况的,按照默认的情况进行执行函数。

默认值参数必须要写在必选参数的后面,并且有多个默认值参数的情况下,变化比较大的写在前,变化 较小的写在后。

def add_end(L=[]):
    L.append("END")
    return L
print(add_end())
print(add_end())
print(add_end())

默认值参数L指向的[],[] 指的是列表,代码执行的过程中[]是会发生改变的

注意:1,默认值参数一般要指向不可变对象         2,None 是一个不可变对象

def add_end(L=None):
    if L is None:
        L = []
    L.append("END")
    return L
print(add_end())
print(add_end())
print(add_end())

5.3 可变参数

在python中,可变参数使用*表示。可变参数的意思就是调用函数的时候可以传递参数也可以不传递参数,并且传递的参数个数可以是0个或 者1个或者任意个。底层原理是将参数封装为元组进行传递的。

def calc(number):
    sum = 0
    for i in number:
        sum += i * i
    return sum
print(calc((1,2,3,4)))
print(calc(1,2,3,4))

def calc(*number):
    sum = 0
    for i in number:
        sum += i * i
    return sum
print(calc(1,2,3,4,5,6))
print(calc())
def calc(*number):
     sum = 0
     for i in number:
          sum += i * i
     return sum
# print(calc(1,2,3,4,5,6))
# print(calc())
list = [1,2,3,4]
print(calc(list[0],list[1],list[2],list[3]))
print(calc(*list))

5.4 关键字参数

底层是将参数封装为字典进行传递的

传入0个或者任意个参数

def person(name,age,**kw):
    print("name=",name,"age=",age,"other=",kw)
person("zhangsan",18)
person("zhangsan",18,city="Beijing")

用途:扩展函数的功能

def person(name,age,**kw):
    print("name=",name,"age=",age,"other=",kw)
dict = {"city":"chongqing","job":"XXX工程师"}
person("lisi",20,**dict)

5.5 命名关键字参数

*后面的参数就是命名关键字参数,使用*将必选参数和命名关键字参数隔开

如果没有传入命名关键字参数的值就会报错

def person(name,age,*,city,job):
    print("name=",name,"age=",age,"city=",city,"job=",job)
person("zhangsan",18)

def person(name,age,*,city,job):
    print("name=",name,"age=",age,"city=",city,"job=",job)
person("zhangsan",18,city="chongqing",job="XXX工程师")

如果函数中已经有了可变参数了,就不需要使用*,但是可变参数后面的参数依旧是命名关键字参数

def person(name,age,*args,city,job):
    print("name=",name,"age=",age,"city=",city,"job=",job)
person("zhangsan",18,city="chongqing",job="XXX工程师")

如果传递值的时候没有写命名关键字参数的名称的时候会报错,会把传入的参数全部当作必选参数

def person(name,age,*,city,job):
    print("name=",name,"age=",age,"city=",city,"job=",job)
person("zhangsan",18,"chongqing","XXX工程师")

命名关键字参数也可以取默认值,命名关键字参数是可以出现缺省的状态

def person(name,age,*,city="Beijing",job):
    print("name=",name,"age=",age,"city=",city,"job=",job)
person("zhangsan",18,job="XXX工程师")

5.6 参数的组合

顺序:必选参数,默认值参数、可变参数、命名关键字参数、关键字参数

def f1(a,b,c=0,*args,**kw):
    print("a=",a,"b=",b,"c=",c,"args=",args,"kw=",kw)
def f2(a,b,c=0,*,d,**kw):
    print("a=",a,"b=",b,"c=",c,"d=",d,"kw=",kw)
f1(1,2)
f1(1,2,c=3)
f1(1,2,3,"a","b")
f1(1,2,3,"a","b",X=99)
f2(1,2,3,d=99,X=88)
args = (1,2,3,4)
kw = {"d":99,"X":88}
f1(*args,**kw)
args1 = (1,2,3)
kw1 = {"d":99,"X":88}
f2(*args1,**kw1)

六、函数的递归

在python中函数里面是可以调用其他函数的,那如果调用的是自己的话就是函数的递归,函数的递归就是函数自己调用自己。

前提条件:

1. 函数自己调用自己

2. 要有终止条件

如果没有终止条件的情况下,就会出现死循环的状态(在python中,会报错)

def fact(n):
    if n == 1:
        return 1
    return n * fact(n-1)
print(fact(5))

fact(5)
5 * fact(5-1)
5 * 4 * fact(4-1)
5 * 4 * 3 * fact(3-1)
5 * 4 * 3 * 2 *fact(2-1)
5 * 4 * 3 * 2 * 1

栈溢出的问题 ------- 尾递归优化

尾递归:函数内部自己调用自己,要有终止条件,return语句中不能包含表达式

def fact(n):
    return fact_iter(n,1)
def fact_iter(num,product):
    if num == 1:
        return product
    return fact_iter(num-1,num*product)
print(fact(5))

fact(5)
fact_iter(5,1)
fact_iter(5-1,5*1)
fact_iter(4-1,4*5)
fact_iter(3-1,3*20)
fact_iter(2-1,2*60)

总结:递归优缺点

优点:逻辑简单清晰

缺点:过深的递归会造成栈溢出的问题

python解释器并没有对尾递归做优化,所以在python任何递归都会造成栈溢出的问题。

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

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

相关文章

nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群

一、前言 1、简介 Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;被广泛使用。且现如今很多高并发场景需要后端服务集群部署&#xff0c;因此nginx也需要支持集群部署从而避免单点故障的问题。 本文将详细介绍使用 KeepalivedNginx 来实现Nginx的高可用集群和N…

Leetcode2583. 二叉树中的第 K 大层和

Every day a Leetcode 题目来源&#xff1a;2583. 二叉树中的第 K 大层和 解法1&#xff1a;层序遍历 排序 先使用层序遍历计算出树的每一层的节点值的和&#xff0c;保存在数组 levelSum 中。然后将数组进行排序&#xff0c;返回第 k 大的值。需要考虑数组长度小于 k 的边…

mysql group by分组后查询无数据补0

mysql经常会用到Group By来进行分组查询&#xff0c;但也经常会遇到一个问题&#xff0c;就是不满足条件的数据就不会显示,如图总共有五个业务,业务状态为3的就不会显示: 因此&#xff0c;想要实现&#xff0c;即使没有数据&#xff0c;也想让count显示出0而不是空的效果&…

day40打卡

day40打卡 343. 整数拆分 状态表示 ​ dp[i] 表示将正整数i拆分成至少两个正整数的和之后&#xff0c;这些正整数的最大乘积 状态转移方程 ​ i > 2 时&#xff0c;对正整数i拆出的第一个正整数是j&#xff0c;则有&#xff1a; 将i拆分为 j 和 i-j&#xff0c;且 i-j…

CUDA编程 - Nsight system Nsight compute 的安装和使用 - (1) 学习记录

Nsight system & Nsight compute 安装和下载地址一、Nsight Systems1.1、主要应用1.2、比较常用的分析1.2.1、情况一1.2.2、情况二 二、Nsight Compute2.1、主要应用2.2、比较常用的分析2.2.1、情况一2.2.2、情况二 三、两者的比较3.1、Nsight systems3.2、Nsight compute …

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天&#xff0c;数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言&#xff0c;突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能&#xff0c;用户可以从管理流程入手规范变更的测试&#xff0c;或者利用产品手段减少预…

su模型在3d里渲染效果如何---模大狮模型网

SketchUp模型在其他3D应用程序中进行渲染可以获得非常好的效果&#xff0c;取决于您所选择的渲染引擎和技术水平。下面是一些常见的渲染效果和技巧&#xff1a; 一&#xff1a;光照和阴影 通过添加适当的光源和调整阴影设置&#xff0c;可以使SketchUp模型在渲染中呈现出更加真…

python递归算法

递归算法 一、嵌套调用的过程二、递归的基本原则1、递归的基本原则2、无限递归调用3、正常递归调用4、阶乘问题5、力扣&#xff1a;231. 2 的幂6、力扣面试题 08.05. 递归乘法7、力扣、326. 3 的幂8、力扣342. 4的幂 一、嵌套调用的过程 def show1():print("show 1 run s…

第2讲:C语言数据类型和变量

第2讲&#xff1a;C语言数据类型和变量 目录1.数据类型介绍1.1字符型1.2整型1.3浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2.signed 和 unsigned3.数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5…

Leetcode日记 2583. 二叉树中的第 K 大层和

Leetcode日记 2583. 二叉树中的第 K 大层和 题目&#xff1a;解题思路&#xff1a;代码实现制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 题目&#xff1a; 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和…

Jenkins邮件通知配置(7)

1、安装插件&#xff1a; Email Extension&#xff0c;Email Extension Template&#xff0c;这两个插件可以帮助我们进行邮件的编写发送以及格式化 2、配置jenkins中链接腾讯企业邮箱 先配置发送服务&#xff0c;然后在具体工程中设置接收者 基础信息&#xff1a; POP3/S…

thinkphp5.1 phpexcel 批量导入导出

1.批量导入 public function importExcel(){$authority $this->getUserAuthority(order_input, batch_import);if ($authority[code] ! 0) {return json($authority);}$file request()->file(files);if(empty($file)){return printMsg(-1, "请上传文件");}/…

LeetCode刷题日志-200.岛屿数量

思路&#xff1a; 遍历二维数组&#xff0c;每当遇到一个‘1’进行一次dfs&#xff0c;根据规则&#xff0c;将本次dfs到的所有元素标记为‘0’&#xff08;放置重复dfs&#xff0c;并且能dfs到的元素一定是与当前遍历到的元素属于统一岛屿。&#xff09;最后&#xff0c;dfs的…

Sora-OpenAI 的 Text-to-Video 模型:制作逼真的 60s 视频片段

OpenAI 推出的人工智能功能曾经只存在于科幻小说中。 2022年&#xff0c;Openai 发布了 ChatGPT&#xff0c;展示了先进的语言模型如何实现自然对话。 随后&#xff0c;DALL-E 问世&#xff0c;它利用文字提示生成令人惊叹的合成图像。 现在&#xff0c;他们又推出了 Text-t…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-19 最后编辑时间&#xff1a;2024-02-23 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

【关于python变量类型学习笔记】

python的变量类型 在创建变量时会在内存中开辟一个空间&#xff0c;变量是存储在内存中的值。 根据变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 变量可以指定不同的数据类型&#xff0c;这些变量可以存储整数&#xff0c;…

Codeforces Round 927 (Div. 3) G. Moving Platforms --- 题解 (非常好的题)

目录 Codeforces Round 927 (Div. 3) G. Moving Platforms&#xff1a; 原题链接&#xff1a;Problem - G - Codeforces 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; Codeforces Round 927 (Div. 3) G. Moving Platforms&#xff1a; 原题链接&#…

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感&#xff0c;严格遵循黄金分割比例的蓝色点晴线条&#xff0c;加上雾面工艺及高低起伏错落有致的线条处理&#xff0c;在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

app自动化元素定位工具Weditor安装使用

之前用appium自带的appium Desktop inspector老是定位不到元素 如下 用另外工具 Weditor M1电脑 安装 pip3 install weditor 启动-自动打开端口 python3 -m weditor 输入设备名称&#xff0c;点击【connect】出现绿色为连接成功 获取到

vscode中git相应插件的使用(强化工作效率)

git graph 这篇文章写的不错&#xff1a;Git Graph 对于git graph的插件的使用&#xff1a; 1、首先vscode-extension中去下载 2、打开 相应的项目&#xff0c;然后在vscode左边底下去找到git graph标识然后打开就可以看到commit记录的可视化形式了。 能够很清晰的看到你的提…