当前位置: 首页 > news >正文

#科研筑基# python初学自用笔记 第五篇 函数

调用函数

  • python有很多内置函数,我们可以直接调用,详见python官方文档:内置函数 — Python 3.11.2 文档,也可以在命令行中输入help(函数名)来查看该函数的使用法则。

  • 函数名的本质就是指向一个函数对象的引用,完全可以用赋值的方法为原函数起一个别名:

a=abs//给abs函数起一个别名a
print(a(-12))//使用a来代替abs实现其功能
'''
12
'''

定义函数

定义函数的格式

def my_first_hanshu(x,y,z):if x==8 and y==8 and z==8:print('Crush')else:print('Pity')return
#以下为试用自定义的函数1
my_first_hanshu(8,8,8)
'''
Crush
'''

总之,定义语句要以def开头,接下来就是函数名和参数列表,参数不需要声明数据类型,注意要使用return语句。

空函数

若要定义一个功能暂时没想好的函数,可以用pass语句:

def non():pass

这样让pass先代替函数体,使得该函数被调用时,程序可以正常运行;

此外,pass语句还可以用于条件语句和循环语句中。

参数检查

对于自定义函数,当传入不恰当的参数时,系统不会像内置函数一样返回出错信息,所以要在自定义的函数体的开端使用内置函数isinstance()和错误提示语句raise,实现数据类型的检查:

def my_first_hanshu(x,y,z):if not isinstance(x,int) and not isinstance(y,int) and not isinstance(z,int):raise TypeError('bad operand type')if x==8 and y==8 and z==8:print('Crush')else:print('Pity')

返回多个值

函数需要返回多个值时,只要把值都写在同一个return语句后即可,会返回一个元组tuple,里面包含了多个值,可以将tuple通过一个赋值号赋值给多个变量,系统会按位置一一赋值。

import math
def ma(x):return math.ceil(x),math.floor(x)
a,b=ma(1.123)
print(a,b)
'''
2 1
'''

函数的参数

位置参数

def power(a,b):s=1while b>0:b-=1s*=areturn s

上面的power函数中有两个位置参数a和b,调用函数时,传入的两个值按位置顺序依次赋值给参数a和b。

默认参数

上面定义了新的power函数后,原来power函数使用一个参数计算平方的功能就用不了了,这时可以修改一下原定义,直接在参数列表中给b赋值为2,这样如果调用函数时只写了一个参数,那就默认参数b为2:

def power(a,b=2):s=1while b>0:b-=1s*=areturn s
  • 需要注意的是,默认参数必须放在参数列表的后端,可以有多个默认参数;

  • 默认参数必须指向不变对象,比如列表也可以作为默认参数,但每次调用后,若对列表进行了增减删改,则其在下一次调用时就变化了。

可变参数

可变参数,即传入的参数个数是可变的,可以是0个或任意个。

在不使用可变参数时,若需要传入不定个数的值,则函数参数应为列表或元组:

def calc(numbers):sum=0for n in numbers:sum+=nreturn sum
calc([1,2,3,4,5,6,7,8,9])
calc((9,8,7,6,5,4,3,2,1))

若使用可变参数,只需在参数前加上*:

def calc(*numbers):sum=0for n in numbers:sum+=nreturn sum
calc(1,2,3,4,5,6,7,8,9)#不需要数据写成list或tuple
list=[11,22,33,44,55]
calc(*list)#在列表名前加*,就可以将列表的所有元素作为可变参数传进去

关键字参数

  • 可变参数允许传入任意个参数,这些参数在函数调用时自动组装为一个元组;

  • 关键字参数则允许传入任意个含参数名的参数,这些关键字参数在调用时自动组装为一个字典:

def person(name,age,**other):#前两个参数为必选参数;other为关键字参数,调用时可以不传入print('name:',name,'age:',age,'other:',other)
#可以只传入必选参数:
person('Tom',18)
'''
name:Tom age:18 other:{}
'''
#可以再传入一个关键字参数:
person('Bob',19,homeland='USA')
'''
name:Bob age:19 other:{'homeland':'USA'}
'''
#可以传入多个关键字参数:
person('Eric',18,homeland='China',gender='M')
'''
name:Eric age:18 other:{'homeland':'China','gender':'M'}
'''
  • 同样,若有给定一个字典dict,可以在调用person函数时,在关键字参数的位置上写**dict,就会将dict的内容放入other中。

命名关键字参数

  • 若单独使用一个关键字参数标志**other,则可传入的关键字参数的数量和类型没有限制;

  • 若要限制关键字参数的名字,就可以用命名关键字参数,使用特殊分隔符*,其后的参数被视为命名关键字参数:

def person(name,age,*,homeland,gender):print(name,age,homeland,gender)
#调用如下:
person('Jack',23,homeland='UK',gender='M')
'''
Jack 23 UK M
'''
  • 命名关键字参数可以有默认值,从而简化调用:

def person(name,age,*,homeland='China',gender):print(name,age,homeland,gender)
#调用如下:
person('Tom',11,gender='M')
'''
Tom 11 China M
'''

参数组合

在python中定义函数,参数定义的顺序必须是:必选参数、默认参数、可变参数、关键字参数和命名关键字参数.

递归函数

函数自己调用自己就是递归。

典例:汉诺塔问题

http://www.lryc.cn/news/10504.html

相关文章:

  • 设计模式之策略模式
  • dbdeployer 使用札记
  • MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)
  • 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法
  • 【C++修行之路】C/C++内存管理
  • spring cloud alibaba Sentinel(四)
  • Redis第三讲
  • JAVA线程池的使用
  • 力扣56.合并区间
  • 代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||
  • 我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章
  • 嵌入式C语言设计模式 --- 外观模式
  • 若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】
  • SCI论文写作神器集合 —— 超级实用
  • MAC 系统安装多版本 JDK 并任意切换
  • 配置 Smart Link 接口时需注意的互斥命令
  • QT的下载和安装
  • nacos配置中心与服务注册中心
  • UE4 手把手教你做插件(1) 从代码引用插件
  • 【Mybatis源码解析】一级缓存和二级缓存源码解析
  • 你知道MES实施的要点吗?
  • 告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢
  • Redis 命令和Redis key键
  • 如何入侵服务器
  • 在Windows10上安装虚拟机---VMware 17 Pro下载与安装
  • 生命周期函数、组件
  • 蓝桥杯 stm32 PWM 测量频率
  • Docker CPU 资源控制
  • 小红书数据平台:笔记爆文率提升的三大秘诀公式!
  • Spring MVC 之Tomcat启动流程