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之不要红头文件(1)
Sep 28 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
python list元素为tuple时的排序方法
Apr 18 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
浅谈python3中input输入的使用
Aug 02 Python
QML使用Python的函数过程解析
Sep 26 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
python内置进制转换函数的操作
Jun 02 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相关资料
2006/10/09 PHP
十天学会php之第八天
2006/10/09 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
PHP attributes()函数讲解
2019/02/03 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
基于zepto.js实现手机相册功能
2017/07/11 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
js实现随机点名
2021/01/19 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
Python实现时间序列可视化的方法
2019/08/06 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
sort命令的作用和用法
2013/08/25 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
商场活动策划方案
2014/01/24 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
学校欢迎标语
2014/06/18 职场文书
五年级学生评语大全
2014/12/26 职场文书
汽车车尾标语大全
2015/08/11 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS