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-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
使用Python的turtle模块画图的方法
Nov 15 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
Python queue队列原理与应用案例分析
Sep 27 Python
python deque模块简单使用代码实例
Mar 12 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
Python正则表达式如何匹配中文
May 27 Python
浅析python函数式编程
Sep 26 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
浅析pandas随机排列与随机抽样
Jan 22 Python
Python中的 enumerate和zip详情
May 30 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/01/17 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
原生js实现随机点名
2020/07/05 Javascript
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
在python中bool函数的取值方法
2018/11/01 Python
python设置随机种子实例讲解
2019/09/12 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
Python实现播放和录制声音的功能
2020/08/12 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
开办大学饮食联盟创业计划书
2014/01/29 职场文书
法学函授自我鉴定
2014/02/06 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python