Python 函数的定义与调用_python函数的定义和调用-程序员宅基地

技术标签: # Python入门基础  python  Python  开发语言  

作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
个人主页:小嗷犬的博客
个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
本文内容:Python 函数的定义与调用



定义和调用函数

Python 中使用def语句创建函数,其一般的格式如下所示:

def name(arg1, arg2, ...,argN):
    statements

下面这段代码定义了一个简单函数。

def repeator(s, n):
    result = s * n
    print(result)

这段代码仅仅是对函数的定义,并没有调用执行。这条定义语句运行后会新建一个名为repeator的变量名,其类型为function,即函数。

def repeator(s, n):
    result = s * n
    print(result)
print(type(repeator))
# <class 'function'> 

与内置函数一样,定义完函数后,可以通过函数名调用执行。

def repeator(s, n):
    result = s * n
    print(result)
repeator('嗷', 3)
# 嗷嗷嗷

在很多情况下,函数需要将计算的结果返回到调用处。在这类函数的函数体中,通常包含一条return语句:

def name(arg1, arg2, ...,argN):
    statements 
    return value

在创建函数时, 没有在函数体中添加return语句,Python 也会默默地在函数体最后添加一条return None

def repeator(s, n):
    result = s * n
    print(result)
value = repeator('嗷', 3)
# 嗷嗷嗷
print(value)
# None

函数如果以返回值来输出:

def repeator(s, n):
    result = s * n
    return result
print(repeator('嗷', 3))
# 嗷嗷嗷

在 Python 中, 还允许在函数中返回多个值。 只需将返回值以逗号隔开, 放在return关键字后面即可。

def calculator(m, n): 
    return m+n, m-n, m*n, m/n
i, j = 2, 4
r1, r2, r3, r4 = calculator(i, j)
print(f'{
      i}{
      j} 的加减乘除运算结果是:{
      r1}{
      r2}{
      r3}{
      r4}')
# 2 和 4 的加减乘除运算结果是:6,-2,8,0.5

在这里总结一下函数调用的四个步骤:

  1. 程序执行到函数调用时,在调用处暂停,等待函数执行完毕;
  2. 将实参赋值给函数的形参;
  3. 执行函数体中的语句;
  4. 调用结束后,回到调用前暂停处继续执行,如果函数体中执行了return语句, return关键字后的值会返回到暂停处,供程序使用,否则函数返回None值。

函数参数

参数传递

参数的传递过程,实际上是一个赋值的过程。在调用函数时,调用者的实际参数自动赋值给函数的形式参数变量。

def avg(m, n):
    return (m + n) /2
print(avg(5, 2))
# 3.5

不可变和可变类型参数

目前我们所学习的不可变类型包括:整型、浮点型、字符串和元组,可变类型有:列表、字典和集合等。这些都可以作为参数的类型。但参数在函数中使用时,这两种类型的表现有所不同。

下面的代码调用时,传递的是不可变类型的参数:

def priceChanger(p):
    p = p + 10 
    print('改变后的价格:{:.2f}'.format(p))
price = 10.8
priceChanger(price)
# 改变后的价格:20.80
print(price)
# 10.8

在使用可变参数时,函数体中可以改变参数的元素:

def contentChanger(name_list):
    name_list[0], name_list[1] = name_list[1], name_list[0]
    print('函数中的 name_list:', name_list)
language_name = ['C', 'Python']
contentChanger(language_name)
# 函数中的 name_list: ['Python', 'C']
print('调用函数后的 language_name:', language_name)
# 调用函数后的 language_name: ['Python', 'C']

因此,在使用可变类型参数时需要特别注意,如果在函数中修改了参数的元素,这种修改会影响调用者的变量。 如果想消除这种影响,可以使用列表copy方法或者使用分片操作创建新列表。


位置参数

位置参数是调用函数为形参赋值的一种默认方式。实参与形参按照从左到右的位置顺序依次赋值。

def myMinus(num1, num2): 
    return num1 - num2
print(myMinus(5, 2))
# 3

赋值顺序改变将得到不同的结果。

def myMinus(num1, num2): 
    return num1 - num2
print(myMinus(2, 5))
# -3

关键字参数

为了避免位置参数赋值带来的混乱,Python 允许调用函数时通过关键字参数的形式指定形参与实参的对应关系。 调用者使用name=value的形式来指定函数中的哪个形参接受某个值:

def myMinus(num1, num2): 
    return num1 - num2
print(myMinus(num1=5, num2=2))
# 3
print(myMinus(num2=2, num1=5))
# 3

指定默认参数值

在函数定义时,可以为参数指定值。这样当函数调用者没有提供对应参数值时,就可以使用指定的默认值。 指定默认参数值在 Python 的函数中广泛存在。例如,打印函数print,在查看其帮助时,其函数的部分描述如下:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

可以看到,print函数的sependfileflush参数都指定了默认值。

print('C', 'C++', 'Java', 'Python')
# C C++ Java Python

如果调用时指定了sep参数的值,则会使用该值来连接每个打印的值。

print('C', 'C++', 'Java', 'Python', sep='_')
# C_C++_Java_Python

在定义函数时, 为形参指定默认值, 就可以让该形参在调用时变为可选:

def myMod(x, y=2): 
    return x % y
print(myMod(13,4))
# 1
print(myMod(13))
# 1

任意数量参数

Python 允许在定义函数时使用单星号*来收集位置参数,双星号**收集关键字参数。

单星号*收集位置参数

单个星号将一组可变数量的位置参数组合成参数值的元组。在函数内部可以通过访问元组中的每个元素来使用参数。

def m_value(*values):
    max_value = max(values)
    min_value = min(values)
    print(f'最大值: {
      max_value}, 最小值: {
      min_value}')
m_value(8, 6, 7, 4, 3, 9)
# 最大值: 9, 最小值: 3

双星号**收集关键字参数

针对形参的关键字参数赋值形式, 利用 Python 定义函数时, 在形参前面加上双星号**来定义收集关键字参数的形参。此时形参是字典类型。

def f(**info):
    if 'name' not in info.keys():
        print('必须拥有名称信息。')
    else:
        print(info['name'] + '的诞生年份:' + info.get('time', '不详'))

f(name = 'C', time = '1972')
# C的诞生年份:1972
f(name = 'Python')
# Python的诞生年份:不详

解包参数

在调用函数时,实参也可以使用***语法。此时不是收集参数,正好相反, 实参前加上***执行的是参数解包。 通常来说, 在列表、元组等类型的实参值前加上*, 将这些类型的元素解包成位置参数的形式;在字典类型的实参值前加上**,将字典的元组解包成关键字参数的形式。

当调用者的数据存储在列表中时, 可以通过在列表前加上*对列表解包来实现位置参数形式的调用。

当调用者的数据存储在字典中时, 可以通过在字典前加上**对字典解包来实现关键字参数形式的调用。

def f(name, time='不详'):
    if name and len(name) > 0:
        print(name + '的诞生年份:' + str(time))
    else:
        print('必须拥有名称信息。')


info1 = ['C', '1972']
f(*info1)
# C的诞生年份:1972
info2 = {
    'name': 'Python', 'time': '1989'}
f(**info2)
# Python的诞生年份:1989

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_63585949/article/details/127189533

智能推荐

多大密西沙加计算机科学与技术,多伦多大学第二大校区——密西沙加校区专业及双录取介绍...-程序员宅基地

文章浏览阅读1.3k次。原标题:多伦多大学第二大校区——密西沙加校区专业及双录取介绍多伦多大学 (University of Toronto,简称U of T,UT),始建于1827年,坐落在加拿大第一大城市多伦多,起源于公元1827年的国王学院King's College。 多伦多大学亦为美国大学协会中仅有的两所非美国学府之一(另一所即为著名的麦吉尔大学)。多伦多大学每年发表的科研论文数量在北美仅次于哈佛大学,引用数量..._多伦多大学密西沙加校区计算机科学专业

Vue+Element-UI Table表头排序_element ui table 排序-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏6次。Vue+Element-UI Table表头排序Vue代码定义后台需要接受的排序属性排序sortChangeVue代码<el-table v-loading="loading" :data="standardList" @sort-change='sortChange'> <el-table-column label="序号" prop="id" width="80" sortable='custom'/></el-table>在<el-tab_element ui table 排序

Verilog HDL 同步复位和异步复位(转)_同步复位与异步复位verilog-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏68次。目录1、同步复位2、异步复位3、同步/异步复位对比4、异步复位同步释放4.1、异步复位同步释放原理在实际的工程中选择复位策略之前必须考虑许多设计方面的问题,如使用同步复位或者异步复位或者异步复位同步释放(Asynchronous Reset Synchronous Release或者Synchronized Asynchronous Reset),以及是否每一个触发器..._同步复位与异步复位verilog

IDEA Mapper文件直接跳转到xml文件的方法(安装插件MyBatisX)_mapper跳转xml的插件-程序员宅基地

文章浏览阅读9.1k次,点赞8次,收藏11次。IDEA Mapper文件直接跳转到xml文件的方法(安装插件MyBatisX)_mapper跳转xml的插件

python解析wav语音文件_python查看.wav编码格式-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏17次。说明本文主要使用python编程,实现解析wav语音文件,得到.wav语音文件的声道数,量化位数,采样频率,采样点数。编写python程序使用pycharm。下面简单介绍一下wav文件结构。一 解析.wav文件原理WAVE文件本质上就是一种RIFF格式,它可以抽象成一颗树(数据结构的一种)来看。​ 如图所示,从上到下分别对应着二进制数据在文件中相对于起始位置的偏移量。每一个格子对应一..._python查看.wav编码格式

DP mixture model-程序员宅基地

文章浏览阅读65次。http://people.csail.mit.edu/jacobe/software.html转载于:https://www.cnblogs.com/stoneresearch/archive/2011/09/03/4336539.html_dpmm饭圈

随便推点

聊城大学计算机学院宿管部,计算机学院-程序员宅基地

文章浏览阅读257次。聊城大学计算机学院文件计算机学院发【2015】6号计算机学院学生考勤管理规定为不断加强和优化学院学风建设,进一步规范学院教学秩序和生活秩序,督促学生积极参加并高质量完成学校学院规定的学习任务和各项活动,使其在德智体美劳等方面得到全面发展,根据《聊城大学学生考勤管理规定》等有关文件精神,结合我院实际,制定本规定。第一条学生应自觉遵守学校学院纪律,按时参加教学计划和学校、学院统一安排、组织的一切活动。..._聊城大学计算机学院让出去住吗

RHEL7xfs文件系统备份恢复-程序员宅基地

文章浏览阅读292次。实战:xfs文件系统的备份和恢复XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。与传统的UNIX文件系统不同,XFS不需要在dump前被卸载;对使用中的XFS文件系统做dump就可以保证镜像的一致性。这与XFS对快照的实现不同,XFS的dump和restore的过程是可以被中断然后继续的,无须冻结文..._error: cannot dump to /data/data_backup file type 4000

在colab上运行GitHub项目_colab运行github项目-程序员宅基地

文章浏览阅读4.7k次,点赞4次,收藏40次。运行我们这个项目,注意,我们当前是在仓库(Bert-Chinese-Text-Classification-Pytorch)的这个目录下,故可以直接使用如下命令,不然记得给文件(run.py)加上前缀,例如:/content/drive/MyDrive/Colab Notebooks/Bert-Chinese-Text-Classification-Pytorch/run.py。有点背,开了pro会员,还是背分到了T4,/(ㄒoㄒ)/~~科学上网、拥有谷歌邮箱、谷歌云端硬盘、colab注册。_colab运行github项目

ArcGIS去除黑边方法汇总_图像去黑边-程序员宅基地

文章浏览阅读1.6k次。在使用ArcGIS对影像进行应用的时候,如果出现了黑边,除了影响美观之外,进行镶嵌处理也可能会有问题,这里,我们介绍一下几种ArcGIS去除黑边的方法,希望能够对大家有所帮助。_图像去黑边

Halcon 画 ROI 区域并生成区域(draw_circle,gen_circle,draw_ellipse, gen_ellipse,draw_rectangle1, gen_rectangl)_wpf halcon 绘制roi-程序员宅基地

文章浏览阅读757次。1)常用的画区域,生成区域 (draw_circle,gen_circle,draw_ellipse, gen_ellipse,draw_rectangle1, gen_rectangle1, draw_rectangle2, gen_rectangle2, draw_region, draw_line,gen_region_line, gen_region points等);draw_算子,运行到该行后,需用鼠标画出需要形状,然后单击右键,停止并确认绘制;矩形轮廓边缘 像素为单位。_wpf halcon 绘制roi

Vis相关的期刊会议_vis会议-程序员宅基地

文章浏览阅读1k次。可视化可发表的期刊会议_vis会议

推荐文章

热门文章

相关标签