百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python编程:轻松掌握函数定义、类型及其参数传递方式

off999 2024-10-18 07:59 47 浏览 0 评论

前言

本文带你轻松理解并掌握Python语言中的核心特性——函数:定义语法以及函数形式,并介绍函数的参数传递的两种方式。闲话少叙,开始——记得关注@传新视界 ,点个赞 分享给更多的朋友。

函数含义

函数(function)是执行特定任务的语句块,是允许程序员重用的部分代码,其促进了软件程序的模块化概念。这种方法背后的主要思想是将一个大的代码块划分为更小的独立部分,也因此更易于管理的子块。Python中有两种类型的函数:

内置函数(Build-in):编程时可以在程序中直接使用这些函数而无需定义它们。这种类型的函数在一开的始学习中经常使用了(例如,print()、input()、sum()等)。

用户定义函数(User-defined):Python允许程序员创建自己的函数。接下来将重点介绍这种特定的函数类型。

简而言之,函数就是定义好的且可以重复调用的结构化语句块。函数名称唯一,可接收参数,并且根据需要返回给调用者相应的结果(值),或不返回值。


函数定义

在Python中定义函数的主要规则如下:

  1. 函数块以关键字def开始,后面跟着函数名和括号。注意,由于Python是区分大小写的,所以必须使用def而不是Def。
  2. 与变量名类似,函数名可以包含字母或数字,但不包含空格或特殊字符,且不能以数字开头。
  3. 可选的输入参数(称为arguments)应放在括号内——参数数量和类型根据需要来。
  4. 函数名后跟冒号,通常函数中的语句块从冒号后换行开始并缩进。
  5. 返回数据的函数必须在其代码块中包含关键字return。

概括起来,有四种类型的函数:

  • 无参数无返回值型函数;
  • 有参数无返回值型函数;
  • 无参数有返回值型函数;
  • 有参数有返回值型函数。

函数定义的语法格式如下:

def functionName (var1, var2, … etc.):
   Statements


根据实参的存在与否以及输入和/或返回值的存在情况,函数可以分为上面的四种可能的类型。下面将分别介绍。

无参无返回值型函数

在这种类型中,函数不接受变量作为参数,也不返回任何数据。比如下面的脚本演示即为这种函数,它只在屏幕上打印预定义的字符串。

代码显而易见,定义中形参,调用时没有实参,语句块中也没有return语句。该结构只是调用print()函数来显示所需的消息。在主程序中调用这样一个函数是一个相当简单直接,如下所示:

# 定义一个既无参数也无返回值的函数
def printSomething():
      print('Hello world')

# 在主程序中直接调用
printSomething()

运行程序后输出结果为:

Hello world

有参无返回值型函数

另一种类型的函数接受变量作为参数,但不返回任何数据。在下面的示例中,通过声明的名称来调用函数,同时在所调用的函数括号中包含一些值。这些值被传递给函数的主体使用,可以被视为普通变量:

# 定义接收参数但无返回值的函数
def printMyName(fName, lName):
    print('Your name is:', fName, lName)

# 提示用户输入姓名
firstName = input('Enter your first name: ')
lastName = input('Enter your last name: ')

# 在主程序中调用所定义的函数
printMyName(firstName, lastName)

运行程序,结果类似如下:

Enter your first name:Solo

Enter your last name: Cui

Your name is: Solo Cui

无参有返回值型函数

第三种类型为不接受参数但有返回数据的函数。重要的是要记住,因为这种类型的函数返回的一个值给调用代码,这个值必须在被使用或处理之前赋值给一个变量。示例如下:

# 定义无参数但有返回值的函数
def returnFloatNumber():
    inputFloat = float(input('输入一个数字,其将返回给主程序:'))
    return inputFloat

# 主程序调用函数并显示输入结果
x = returnFloatNumber()
print('输入的数字为:', x)

运行程序结果类似如下:

输入一个数字,其将返回给主程序: 5.7

输入的数字为:: 5.7

有参有返回值型函数

这种类型函数既接受参数,又将值返回给调用代码。情况下面示例。在这种情况下,函数的调用必须包含一个参数列表,并将返回值赋给一个特定的变量以供以后使用:

# 有参有返回值函数
def calculateSum(number1, number2):
    print('计算两个数字和.')
    return(number1 + number2)

# 接受用户输入的两个数字
num1 = float(input('输入第一个数字: '))
num2 = float(input('输入第二个数字: '))

# 调用函数计算俩个数字和
addNumbers = calculateSum(num1, num2)

# 输出两个数字和
print('两个数字和为:', addNumbers)

运行程序结果类似如下:

输入第一个数字: 3

输入第二个数字: 5

计算两个数字和...

两个数字和为:: 8.0

函数参数传递方式

有两种不同的方法用来给函数传递参数。确定选择两者的哪个方法应取决于原来变量的值是否可在函数内更改。将参数值传递给函数有两种方法,通常被称为按值调用/传递(call/pass by value)和按引用调用/传递(call/pass by reference)

概要来说,函数参数传递:

其一,按值方式:参数是原始变量的副本,保持副本且不改变原始值;

其二,按引用方式:改变直接作用于原始变量,因此也就改变了原始值。


按值调用/传递

在这种情况下,实参(形参)的值作为原始变量的副本处理。因此,当程序控制返回给调用者时,调用者作用域中的原始变量将保持不变。

在Python中,如果将不可变参数(例如,整数和字符串)传递给函数,通常的做法是按值调用/传递参数。下面的示例通过介绍id()函数说明了这种情况。它接受一个对象作为参数(即id(object)),并返回这个特定对象的标识。Id()返回值是一个整数,它在对象的生命周期内是惟一的和永久的。如示例所示,在调用checkParamemterID函数之前,变量x的id为4564813232。需要注意的是,只要x的值没有更新,x的id在函数中就不会改变。但是,一旦该值更新为20,其对应的id将更改为4564813552。需要注意的最重要的一点是,x的id在调用函数后不会改变,它的原始值保持不变(4564813232)。这意味着对x值的更改应用于变量的副本,而不是调用者作用域内的原始变量。

示例代码如下:

#按值传递参数
# 定义函数'checkParameterID',带参且按值传递
def checkParameterID(x):
print('在checkParameterID函数内x值改变之前其值为 ', x, '\n其id 为', id(x))
# 在函数范围内改变参数x的值
x = 20
print('checkParameterID中x的值改变后为', x, '\n 其id为', id(x))

# 在主程序声明变量x并赋予初始值
x = 10

print('调用checkParameterID函数之前x的值是', x, '\n 其id为', id(x))

# 调用'checkParameterID'函数
checkParameterID(x)

# 函数调用后在主程序中显示关于'x'的信息
print('调用checkParameterID函数后x的值为', x, '\n 其id为', id(x))

运行输出结果类似如下:

调用checkParameterID函数之前x的值是 10

其id为 2570870194704

在checkParameterID函数内x值改变之前其值为 10

其id 为 2570870194704

checkParameterID中x的值改变后为 20

其id为 2570870195024

调用checkParameterID函数后x的值为 10

其id为 2570870194704

按引用调用/传递

在这种情况下,函数获取实参(即原始变量)的引用,而不是它的副本。如果函数内发生更改,则调用者作用域中原始变量的值也将被修改。在Python中,如果可变参数(如列表)传递给函数,则调用/传递是通过引用进行的。如下所示,updateList将值5追加到名为y的列表中。即原始可变变量x的值发生了变化,这证明函数按引用调用/传递参数的特征。示例代码如下:

# 定义函数'upDateList' 其改变列表内的值
def updateList(y):
y = y.append(5)
return y

# 声明列表'x' 有四个元素值
x = [1, 2, 3, 4]
print('在调用updateList函数之前,x的内容是:', x)

# 调用函数'updateList'
print('调用函数updateList')
updateList(x)
print('调用updateList函数后x的内容为:', x)

运行程序输出结果类似如下:

在调用updateList函数之前,x的内容是: [1, 2, 3, 4]

调用函数updateList

调用updateList函数后x的内容为: [1, 2, 3, 4, 5]

本文小结

本期内容介绍了函数的基本内容和实现语法,以及参数传递、有无参数和返回值的函数形式以及函数调用/传递的实现。

就写这些了,记得点个赞,关注一下@传新视界,分享给更多的朋友吧。

下一期再来进一步介绍关于函数参数传递的几种实现方式,敬请关注,再见!

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: