菜鸟学习日记(python)——函数

news2024/11/17 6:33:59

函数是组织好的,用来实现某些功能的代码块,它可以重复使用。

函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但我们也可以自己创建函数,这被叫做用户自定义函数。

定义函数

用户自定义函数的用法如下:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return [表达式] 结束函数,返回一个值给调用方,不带表达式的 return 相当于返回 None。

函数的一般格式如下:

def 函数名(参数列表):

        函数体

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

以下是简单的实例:

#不带参数的函数
def hello():
    print('hello python')
a=3
b=4
hello()
#带参数的函数
def hello(a,b):
    print(a*b)
a=3
b=4
hello(a,b)
#比较两个数的大小
def max(a,b):
    if a>b:
        return a
    else:
        return b
print(max(3,4))

函数调用

定义函数时,我们给了函数的名称,指定了函数的参数和代码块结构。那么调用函数时,按照以下格式调用:

函数名(函数实参列表)

上面的max(3,4)就是函数调用,

参数传递

在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的

a=[1,2,3]
print(id(a))
a="Runoob"
print(id(a))

执行以上代码,结果如下:

可以看到,a的id改变了,这是因为, a 没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型([1,2,3])对象,也可以是指向 String 类型("Runoob")对象。

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

  • 可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

下面是传不可变对象和可变对象的实例:

#传不可变类型
def change1(a):
    print('没改前:',id(a))
    a=6
    print('改后:',id(a))
    return a
a=1
print('没改前:',id(a))
print(change1(a))       #调用change1(a),并将返回结果打印出来

#传可变类型
def change1(list1):
    print('没改前:',id(list2))
    list1.append([4,5,6])
    print('改后:',id(list2))
    return list1
list2=[1,2,3]
print('没改前:',id(list2))
print(change1(list2))

可以看到,如果传的是不可变的数据类型(a),那么重新赋值,会让数据的id改变,说明不是在原有的数据上进行了修改,而是将a重新指向了一个新的对象。

如果传的是可变的数据类型(list2),那么改变它的值后,数据的id并没有改变,说明它是在原有的数据的基础上进行了修改。

参数

python中调用函数时,可使用的正式参数类型如下:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数
必需参数

必需参数须以正确的顺序传入函数。调用时参数的数量必须和声明时的一样。

例如,执行以下代码,就会报错

def test2(a,b):
    print('a*b的值为:',a*b)
a=3
b=2
test2(a)

关键字参数

关键字参数是指在函数调用时,通过指定参数名来传递参数值。关键字参数的主要特点是可以不按照定义顺序传递参数。关键字参数的使用可以增加函数调用的可读性,避免参数顺序混淆的问题。执行下面的代码:

def test3(name,sex):
    print('姓名为:',name)
    print('性别为:',sex)
test3(sex='男',name='花花')

可以看到,函数调用时,参数没有按照函数声明时的顺序去写,但是不会报错。

默认参数

默认参数是在函数定义时给参数赋予一个默认值,如果在调用函数时没有传递对应的参数,函数将使用默认值。使用默认参数,可以简化函数的调用,尤其是在函数需要被频繁调用的情况下,示例代码如下:

def test4(a,b=4):
    print('a+b的值为:',a+b)
a=3
test4(a)

我们没有给出b对应的值,但是b默认为4,计算出来a+b的值是7

要注意的是:我们在定义函数时,参数顺序是:有默认值的参数必须在没有默认值的参数后面,不能默认参数在前。

不定长参数(可变参数)

你可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数。不定长参数在函数定义时不确定参数个数的情况下,可以接收任意数量的参数。Python提供了两种方式来实现不定长参数:使用星号(*)和双星号(**)。

1.使用星号(*)来定义可变参数

加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数

下面是一个简单的例子:

def printinfo(arg1, *vartuple):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    print(vartuple)

# 调用printinfo 函数
printinfo(70, 60, 50)
vartuple就是一个不定长参数,从上面可以看到,它是由60,50组成的一个元组

如果在函数调用时没有指定参数,它就是一个空元组。执行这条语句:printinfo(70)

结果如下:

1.使用两个星号(**)来定义可变参数,参数会以字典的形式导入,以下是一个实例:

def printinfo(arg1, **vardict):
    print("输出: ")
    print(arg1)
    print(vardict)
# 调用printinfo 函数
printinfo(1, a=2, b=3)

强制位置参数

Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。

在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

#正确用法
f(10, 20, 30, d=40, e=50, f=60)

#错误用法
f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60)           # e 必须使用关键字参数的形式

return 语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式或值。

def sum(a,b):
    return a+b
a=sum(1,2)   #将返回值赋值给a
print(a)     #打印a的值

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

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

相关文章

Kubernetes 的用法和解析 -- 2

一.集群常用指令 1.1 基础控制指令 # 查看对应资源: 状态 $ kubectl get <SOURCE_NAME> -n <NAMESPACE> -o wide [rootkube-master ~]# kubectl get pods -n kuboard -o wide# 查看对应资源: 事件信息 $ kubectl describe <SOURCE_NAME> <SOURCE_NAME_R…

Android--UML类图使用详解

明敕星驰封宝剑&#xff0c;辞君一夜取楼兰 一&#xff0c;定义 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分…

C语言练习(检查一个数是否为质数 、剪绳子)

目录 检查一个数是否为质数 题目描述 输入格式 输出格式 样例输入 样例输出 解题思路 代码示例 剪绳子 题目描述 输入格式 输出格式 样例输入 样例输出 解题思路 代码示例 检查一个数是否为质数 题目描述 输入一个正整数&#xff0c;检查该数是否为质数 输入格式 输入一个正整…

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…

github 学习番外篇

我们可以按照仓库开始的提示提交仓库 不知道为什么 出现了 我用 git branch 查看了一下&#xff0c;竟然没发现分支 后来发现是只有commit以后才会显示这个分支 后来显示 这是因为本地和远程仓库不同步的原因 这时候我们就需要git pull 一下 发现两个仓库由于不关联不能git…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

山峰个数 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个数组,数组中的每个元素代表该位置的海拔高度。0表示平地,>=1时表示属于某个山峰,山峰的定义为当某个位置的左右海拔均小于自己的海拔时,该位置为山峰。数组起始位置计算时可只满足一边的条件。 …

原子学习笔记1——阻塞和非阻塞IO

阻塞式 I/O 顾名思义就是对文件的 I/O 操作&#xff08;读写操作&#xff09;是阻塞式的&#xff0c;非阻塞式 I/O 同理就是对文件的I/O 操作是非阻塞的。 当对文件进行读操作时&#xff0c;如果数据未准备好、文件当前无数据可读&#xff0c;那么读操作可能会使调用者阻塞&…

Linux---cp和mv命令选项

1. cp命令选项 命令选项说明-i交互式提示-r递归拷贝目录及其内容-v显示拷贝后的路径描述-a保留文件的原有权限 cp -i命令选项效果图: cp -r命令选项效果图: cp -v命令选项效果图: cp -a命令选项效果图: -a选项说明: -a 选项还支持拷贝文件夹并且文件夹中的文件权限不丢失 …

WPF-附加属性《十二》

非常重要 依赖属性和附加属性&#xff0c;两者是有关系的&#xff0c;也是有些区别的&#xff0c;很多时候&#xff0c;可能会把两者混淆了。 附加属性&#xff08;Attach Property&#xff09; 顾名思义&#xff0c;就是附加上面的属性&#xff0c;自身是没有的&#xff0c;…

详解Keras3.0 KerasCV API: StableDiffusion image-generation model

Stable Diffusion 图像生成模型&#xff0c;可用于根据简短的文本描述&#xff08;称为“提示”&#xff09;生成图片 keras_cv.models.StableDiffusion(img_height512, img_width512, jit_compileTrue) 参数说明 img_height&#xff1a;int&#xff0c;要生成的图像的高度…

TCP/IP详解——UDP 协议

文章目录 1. UDP1.1 UDP 头部1.2 UDP 校验和1.3 UDP 传输过程1.4 UDP-Lite1.5 最大 UDP 数据报长度1.6 UDP 输入队列 1. UDP UDP&#xff1a;用户数据报协议&#xff08;User Datagram Protocol&#xff09;面向无连接的&#xff0c;也就是无需建立连接&#xff0c;传输不可靠。…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

音视频参数介绍

一、视频参数概念 单个视频帧&#xff1a;可以简单地理解成为一张图片 单个视频帧主要的参数概念&#xff1a; 分辨率&#xff1a; 分辨率是指图像或显示器上像素的数量&#xff0c;通常用横向像素数乘以纵向像素数表示。例如&#xff0c;1920x1080 表示宽度为1920像素&…

数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构&#xff0c;严格意义上来说&#xff0c;他并不像他的名字一样是一棵树型的数据结构&#xff0c;而更多是一种设计思想。 LSM Tree最先在1996年被提出&#xff0c;后来被广泛运用于现代NoSQL&#xff08;非关系型数据库&#xff09;系统中&#xf…

【Spark精讲】Spark与MapReduce对比

目录 对比总结 MapReduce流程 ​编辑 MapTask流程 ReduceTask流程 MapReduce原理 阶段划分 Map shuffle Partition Collector Sort Spill Merge Reduce shuffle Copy Merge Sort 对比总结 Map端读取文件&#xff1a;都是需要通过split概念来进行逻辑切片&…

CSS新手入门笔记整理:CSS常用属性表

字体样式 属性 属性值 说明 font-family 微软雅黑/苹方 字体类型 font-size 数值 字体大小 font-weight 数值/关键字 字体粗细&#xff08;字重&#xff09; font-style normal&#xff08;正常(默认值)&#xff09;italic&#xff08;斜体&#xff09;oblique&am…

湖南财信:灰盒测试筑牢安全防线,保障差异化金融服务体系建设

湖南财信是国有独资公司&#xff0c;湖南省唯一的省级地方金融控股公司、省属国有大型骨干企业。湖南财信坚持金融科技战略&#xff0c;以数字化建设为驱动&#xff0c;创新融资服务手段&#xff0c;逐步打造出差异化产品与数字化服务体系&#xff0c;全方位、多维度推动金融服…

大语言模型:开启自然语言处理新纪元

导言 大语言模型&#xff0c;如GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;&#xff0c;标志着自然语言处理领域取得的一项重大突破。本文将深入研究大语言模型的基本原理、应用领域以及对未来的影响。 1. 简介 大语言模型是基于深度学习和变压器&…

WPF 基于TableControl的页面切换

文章目录 前言其它项目的UserControl切换TableControl添加按钮&#xff0c;隐去TableItem的Header 结论 前言 我想用WPF简单实现一个按钮视图切换的效果&#xff0c;但是我发现别人的实现效果非常的麻烦。 其它项目的UserControl切换 我网上找了个开源的项目&#xff0c;他是…