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中的字典与成员运算符初步探究
Oct 13 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python发送http请求解析返回json的实例
Mar 26 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
解决Mac下使用python的坑
Aug 13 Python
PyTorch中topk函数的用法详解
Jan 02 Python
django实现后台显示媒体文件
Apr 07 Python
python 如何做一个识别率百分百的OCR
May 29 Python
python游戏开发Pygame框架
Apr 22 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将数据导入到Foxmail
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
php输入流php://input使用浅析
2014/09/02 PHP
phplot生成图片类用法详解
2015/01/06 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
提升Python程序运行效率的6个方法
2015/03/31 Python
python实现线程池的方法
2015/06/30 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python执行使用shell命令方法分享
2017/11/08 Python
python实现ip代理池功能示例
2019/07/05 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python如何给你的程序做性能测试
2020/07/29 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
党支部书记先进事迹
2014/01/17 职场文书
中考学习决心书
2015/02/04 职场文书
市场营销计划书
2019/04/24 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏