Python函数的定义方式与函数参数问题实例分析


Posted in Python onDecember 26, 2019

本文实例讲述了Python函数的定义方式与函数参数问题。分享给大家供大家参考,具体如下:

涉及内容:

  • 函数的定义方式
  • 函数的文字描述
  • 空操作语句
  • 位置参数
  • 默认参数
  • 关键参数
  • 可变长度参数

函数的定义方式:

Python函数的定义方式与函数参数问题实例分析

函数的文字说明:

为了让别人了解函数的意义,或者避免自己遗忘,可以使用 字符串(不需要赋值,单引号,双引号,多引号都行)、#注释 将文字说明写在函数最开始的位置

def function1() :
 """
 这是这个程序的说明文字
 """
 print("hello function")
 return 1

function1()

空操作语句:

pass语句是空操作语句,当使用pass代表不进行任何操作:

空函数就是什么操作也不执行,使用pass语句来定义

def pass_function():
 pass

pass也可以使用在循环语句中:

if a>0:
 pass

函数的参数:

Python语言中的所有参数(参数)都将通过引用传递。如果在函数中更改引用类参数所指的内容,则更改也会反映在调用函数的外部

但当在函数中企图修改参数的数据指向的时候,外部传入的参数并不会被修改,因为当发生这样的情况时,函数自己产生了一个局部变量来避免错误修改外部变量:

Python函数的定义方式与函数参数问题实例分析

如果确实要修改外部变量,那么需要在更改前,使用global来声明一下变量

print("------通过全局改变量--------")
print("before:",x)
def test_globol():
 global x
 x=6

test_globol()
print("after_test_globol:",x)

如何进行函数输入参数类型检测:

1.当传入了不恰当的参数时,内置函数一般都会检查出参数错误并提示TypeError或ValueError,比如说

>>> int("abc")
Traceback (most recent call last):
 File "<pyshell#37>", line 1, in <module>
 int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
>>> int ('10')
10
>>> int('10','12')
Traceback (most recent call last):
 File "<pyshell#46>", line 1, in <module>
 int('10','12')
TypeError: 'str' object cannot be interpreted as an integer

这是因为内置函数一般都做了参数检查。

有时候为了让我们的函数更加完善,我们定义函数的时候需要考虑进行参数检查。

对参数类型做检查,数据类型检查可以用内置函数 isinstance()实现,raise可以抛出异常:

"""
if not isinstance(参数,(参数允许的类型1,允许的类型2...))
 raise TypeError('自定义参数错误提示')
"""

def my_int(x):
 if not isinstance(x,int):
  raise TypeError("你输入的不是整数")
 print(x)

位置参数:

  • 根据位置一一对应赋值参数
def num002(a,b):
 print(a,b)

keynum002("haha","helloworld")#a->"haha",b->"helloworld"

默认参数:

1.默认参数可以简化参数的输入。

比如说某些多用的值就不必多余传入,一个例子是学生信息录入,大部分同年级学生都是同龄人,年龄一致,所以可以简化年龄参数的输入

  • 不给定变量名时,按位置顺序提供默认参数
  • 当不按顺序提供部分默认参数时,需要把参数名写上,并且给定参数名的变量不能在不给定参数名的变量
  • 如果有参数没有默认值,那么这个“必需”参数定义的时候要在默认参数前

Python函数的定义方式与函数参数问题实例分析

#如果有参数没有默认值,那么这个“必需”参数定义的时候要在默认参数前
def student2(name="aotuman",sex,age=18):
 print(name,sex,age)
student("lili","m")

由于默认参数会提前生成对象,所以对于可变对象,直接使用默认参数,可能会导致多个函数操作都是使用同一个变量:

print("默认参数的内存问题".center(50,"-"))
def student3(name,sex,age=18):
 print(name,sex,age,id(age))


student3("lili","m")
student3("lilei","f")
#结果显示在使用默认参数的情况下,id(age)的内存指向相同
#所以要注意使用指向类的变量(列表.....)
student3("hanmeimei","m",17)

def my_append(x,list1=[]):
 list1.append(x)
 print(list1)

my_append("haha")
my_append("hehe")
#结果显示默认参数中留下了上一次结果的数据

如果要解决上面的问题,可以把默认参数赋值步骤移动到执行代码中:

print("改良结果".center(50,"-"))
def my_append2(x,list1=None):
 if list1 is None:
  list1=[]
 list1.append(x)
 print(list1)


关键参数:

  • 关键参数,在输入参数时,显式给定参数名来指定参数
  • 但关键参数不能写在位置参数前面
#关键参数,在输入参数时,显式指定参数
print("\n-----关键参数-------")
def keynum002(a,b):
 print(a,b)

keynum002(b="haha",a="helloworld")

"""
keynum002(b="haha","helloworld") #这是不行的,关键参数是不能在位置参数前面的
"""

可变长度参数:

  • 可变长度参数就是传入的参数个数是可变的
  • 如果要传入多个参数,可以把参数存入list、tuple、dict类型的变量中,再把变量传给函数:
>>> def can_change(l):
 print("%s %s" % (l[0],l[1]))

 
>>> l1=["apple","pen"]
>>> can_change(l1)
apple pen
  • python定义了可变参数的参数定义方式,参数前加*说明是一个元组,加**说明是一个字典,在传值的时候传入对应的元组或字典。

这种方式下,可变参数是有默认值的,默认为空元组或空字典。

如果同时使用*和**,“*”元组参数必须位于“**”字典参数之前

Python函数的定义方式与函数参数问题实例分析

传入参数的时候,可以对对应的可变参数加对应的"*"或"**",避免某些时候传入参数的位置不对应函数参数位置的问题。

Python函数的定义方式与函数参数问题实例分析

Python函数的定义方式与函数参数问题实例分析

Python函数的定义方式与函数参数问题实例分析

def change34(value1,*value2,**value3):
 print(value1,end='\t')
 print(value2,end='\t')
 print(value3,end='\t')
change34((1,2))#* ** 有默认值
print("\n")
change34(*(1,2))#1溢出到前面的value1
print("\n")
change34(*(1,2),{1:1,2:2})#{1:1,2:2}溢出到前面的value2
print("\n")
change34("value1",*(1,2),**{'1':1,'2':2})
print("\n")
print("test2".center(50,'-'))

Python函数的定义方式与函数参数问题实例分析

  • 可使用多个关键字参数输入一个字典类的参数
def test2(**args):#**可以接受关键参数,*只能接受位置参数
 print(args)
test2(x=1,y=2,c=3)
test2(**{'x':1,'y':2,'c':3})
>>> a=[1,2,3,4,5,6]
>>> def change(x):
 x.append("changed")

 
>>> change(a)
>>> a
[1, 2, 3, 4, 5, 6, 'changed']

def test2(x):
 print(id(x))

test2(x)
print(id(x))#同一片内存指向

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python算法学习之基数排序实例
Dec 18 Python
用python代码做configure文件
Jul 20 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
python分析作业提交情况
Nov 22 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 Python
python抢购软件/插件/脚本附完整源码
Mar 04 Python
PyTorch中的torch.cat简单介绍
Mar 17 Python
Python 中面向接口编程
May 20 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 #Python
python DataFrame转dict字典过程详解
Dec 26 #Python
Numpy之reshape()使用详解
Dec 26 #Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 #Python
python路径的写法及目录的获取方式
Dec 26 #Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 #Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 #Python
You might like
求PHP数组最大值,最小值的代码
2011/10/31 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python里隐藏的“禅”
2014/06/16 Python
Python程序员开发中常犯的10个错误
2014/07/07 Python
python求crc32值的方法
2014/10/05 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
大学生找工作推荐信范文
2013/11/28 职场文书
小区门卫管理制度
2014/01/29 职场文书
电子银行营销方案
2014/02/22 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
JavaScript实现简单的音乐播放器
2022/08/14 Javascript