Python:函数

目录

前言:

一、函数的定义

二、函数的调用

三、函数的分类

四、全局变量和局部变量

五、函数的参数

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 -xelse: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 -xelse: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 ageage += 1print(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 ** ys = 1while y > 0:s = s * xy = y - 1return s
print(power(2,0))

5.2 默认值参数

def power(x,y=2):# return x ** ys = 1while y > 0:s = s * xy = y - 1return 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 = 0for i in number:sum += i * ireturn sum
print(calc((1,2,3,4)))
print(calc(1,2,3,4))

def calc(*number):sum = 0for i in number:sum += i * ireturn sum
print(calc(1,2,3,4,5,6))
print(calc())
def calc(*number):sum = 0for i in number:sum += i * ireturn 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 1return 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 productreturn 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.mzph.cn/news/700007.shtml

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

相关文章

ETL:数据转换与集成的关键过程

ETL&#xff1a;数据转换与集成的关键过程 在现代数据驱动的世界中&#xff0c;有效地管理和处理数据对于企业的成功至关重要。ETL&#xff08;提取、转换、加载&#xff09;是一种关键的数据处理过程&#xff0c;有助于将数据从源系统提取、清洗、转换并加载到目标系统中&…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换&#xff08;自动类型提升&#xff09; 强制转换 自增自减运算符 …

【网络编程】okhttp源码解析

文章目录 配置清单框架结构解析 配置清单 首先了解一下okHttp的配置清单&#xff1a; Dispatcher dispatcher &#xff1a;调度器&#xff0c;⽤于调度后台发起的⽹络请求&#xff0c;有后台总请求数和单主机总请求数的控制。List<Protocol> protocols &#xff1a;⽀持…

PostgreSQL 实体化视图的使用

上周的教程中&#xff0c;通过 DVD Rental Database 示例&#xff0c;让我们了解了在 PostgreSQL 中创建实体化视图的过程。正如我们所了解的&#xff0c;PostgreSQL 实体化视图提供了一种强大的机制&#xff0c;通过预计算和存储查询结果集为物理表来提高查询性能。接下来的内…

leetcode刷题日志-98.验证二叉搜索树

思路&#xff1a;根据二叉搜索树的性质&#xff0c;中序遍历满足升序。那么我们就可以使用中序dfs&#xff0c;并且记录每个节点的前一个节点的值&#xff0c;如果前一个节点值比后一个大&#xff0c;返回false。 class Solution {Integer pre null; //记录前序节点boolean …

2.23数据结构

单向循环链表 创建单向循环链表&#xff0c;创建节点 &#xff0c;头插&#xff0c;按位置插入&#xff0c;输出&#xff0c;尾删&#xff0c;按位置删除功能 //main.c #include "loop_list.h" int main() {loop_p Hcreate_head();insert_head(H,12);insert_head(…

3分钟看懂设计模式02:观察者模式

一、什么是观察者模式 观察者模式又叫做发布-订阅模式或者源-监视器模式。 结合它的各种别名大概就可以明白这种模式是做什么的。 其实就是观察与被观察&#xff0c;一个对象&#xff08;被观察者&#xff09;的状态改变会被通知到观察者&#xff0c;并根据通知产生各自的不…

VTK通过线段裁剪

线段拆分网格 void retrustMesh(vtkSmartPointer<vtkPolyData> polydata, vtkSmartPointer<vtkPoints> intermediatePoint) {vtkSmartPointer<vtkPoints> srcPoints polydata->GetPoints();int pointSize intermediatePoint->GetNumberOfPoints();/…

【动态规划】【状态压缩】LCP04 覆盖

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 本文涉及知识点 动态规划汇总 LCP04 覆盖 你有一块棋盘&#xff0c;棋盘上有一些格子已经坏掉了。你还有无穷块大小为1 * 2的多米诺骨牌&#xff0c;你想把这些骨牌不重叠地覆盖在完好的格子上&#xff0…

maven3旧版本的下载地址(含新版本)

因为现有的3.8版本与IDEA不兼容&#xff0c;我需要下载3.6版本&#xff0c;但是官网的位置非常隐蔽&#xff0c;找了很多资料才看到。故记录一下。 第一步 进入网址&#xff0c;选择需要的版本 Index of /dist/maven/maven-3 第二步 选择binaries 第三步 选择zip文件下载就可…

【Java程序设计】【C00285】基于Springboot的游戏分享网站(有论文)

基于Springboot的游戏分享网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏分享网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在网站首页可以查看首页、游戏…

uniapp-提现功能(demo)

页面布局 提现页面 有一个输入框 一个提现按钮 一段提现全部的文字 首先用v-model 和data内的数据双向绑定 输入框逻辑分析 输入框的逻辑 为了符合日常输出 所以要对输入框加一些条件限制 因为是提现 所以对输入的字符做筛选,只允许出现小数点和数字 这里用正则实现的 小数点…

IDEA生成Java Doc帮助文档

使用场景 使用IDEA&#xff08;本次使用2020.3版&#xff09;将自己写的常用的工具类打成jar包&#xff0c;安装到maven本地仓库&#xff0c;最后生成对应的doc参考文档。 操作流程 方法一 选中项目 右键 show in Explor&#xff0c;如下图&#xff1a; 选中地址栏 cmd 输入…

无公网IP情况下如何远程查看本地群晖NAS存储的文件资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

Java的编程之旅27——继承

1.继承的简介 继承是面向对象编程中的一个重要概念&#xff0c;指的是一个类可以继承另一个类的属性和方法。被继承的类称为父类或基类&#xff0c;继承这个父类的类称为子类或派生类。 通过继承&#xff0c;子类可以继承父类的属性和方法&#xff0c;使得子类具有相似的行为…

掌握BeautifulSoup4:爬虫解析器的基础与实战【第91篇—BeautifulSoup4】

掌握BeautifulSoup4&#xff1a;爬虫解析器的基础与实战 网络上的信息浩如烟海&#xff0c;而爬虫技术正是帮助我们从中获取有用信息的重要工具。在爬虫过程中&#xff0c;解析HTML页面是一个关键步骤&#xff0c;而BeautifulSoup4正是一款功能强大的解析器&#xff0c;能够轻…

2024年度中国5G随身WiFi品牌排行榜

【中国品牌网中国3C质量评测中心权威榜单联合发布】 第一名&#xff1a;格行 优势&#xff1a;作为随身WiFi行业的佼佼者&#xff0c;格行凭借其15年的物联网行业经验&#xff0c;在技术研发、产品创新及客户服务上均享有盛誉。其5G随身WiFi产品网络稳定&#xff0c;客户满意度…

行为树入门:ROS2 BehaviorTree.CPP Groot2安装与简单使用(有例程)

ROS2安装与学习及其topic学习 BehaviorTree.CPP编译与安装 和 Groot2安装 注意&#xff1a;《ROS2行为树&#xff08;C行为树&#xff09;BehaviorTree.CPP完全图形化开发&#xff0c;完美支持ROS2话题通信》这个例程实现的前提需要建一个sentry_interfaces::msg::RobotHP的m…

Spring Boot 笔记 029 用户模块

1.1 用户信息需要在多个链接使用&#xff0c;所以需要用pinia持久化 1.1.1 定义store import {defineStore} from pinia import {ref} from vue const useUserInfoStore defineStore(userInfo,()>{//定义状态相关的内容const info ref({})const setInfo (newInfo)>{i…

“IT行业职业发展的黄金之路:哪些证书能为你增光添彩?“

文章目录 每日一句正能量前言1、浙大计算机程序设计能力考试证书&#xff08;PAT&#xff09;2、全国计算机等级考试证书(NCRE)3、计算机技术与软件专业资格考试证书&#xff08;软考&#xff09;4、通信专业技术人员职业水平证书5、全国计算机应用水平考试证书&#xff08;NIT…