python基础教程函数参数

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

    python里有很多的内置函数给我们的工作带来了很多发便利,在我们实现某些功能或者优化代码的时候,可以自己定义一个函数,同时我们在定义一个类的时候也会用到函数的一些知识去构造一个方法,这里就涉及到一些关于函数的基础知识和函数传参的知识。

一、函数的相关介绍

1.函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。

函数特性

  • 减少重复代码

  • 使程序变的可扩展

  • 使程序变得易维护

2、函数的定义示例

定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def  echostr():        #用关键字def定义一个函数 
 
     print ( "Hello, world"  )
 
echostr()  #调用函数
 
 
结果:
 
Hello, world
 
def  printstr(str1,str2,str3):
     return  str1,str2,str3    #使用return返回参数
  
s = printstr( "mysql" , "1929" , "baidu" #对调用函数,初始化s对象
print (s)                           #打印s
 
结果:
( 'mysql' '1929' 'baidu' )

一般情况下,在函数中使用return语句,会返回一个参数,而上面的我们返回了三个参数,这时就会输出一个元组,

1
2
3
print ( type (s))
 
< class  'tuple' >  输出结果验证为元组

函数定义小结

  1. 定义函数时,需要确定函数名和参数个数;

  2. 如果有必要,可以先对参数的数据类型做检查;

  3. 函数体内部可以用return随时返回函数结果;

  4. 函数执行完毕也没有return语句时,自动return None。

  5. 函数可以同时返回多个值,但其实就是一个tuple。


3、简单的传参式定义示例

 下面的的示例中定义了3个参数a,b,c,在调用的过程中给传入mysql,1929,baidu三个参数分别给a,b,c.

1
2
3
4
5
6
7
def  printstr(a,b,c):
     print (a,b,c)
 
printstr( "mysql" , "1929" , "baidu" )
 
结果:
mysql  1929  baidu

4、函数参数与局部变量

  在我们学习C语言之类的语言都会学过形参、实参的概念,而python里面也是存在形参和实参的概念。

形参变量 只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。

实参变量 可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

wKioL1j8HZrwcrTmAAA2jxzHxzE732.png-wh_50

默认参数:

  在我们我们设计产品时,特别有好多的地方会显示一些默认值,当你未传入值时就会传入默认参数,传入和,默认参数不一样的值时会替代默认参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def  stuInfo(name,age,sex,address,telphone,shcool = "清华大学" ):
     print ( "The student name is:" ,name)
     print ( "The student age is:" , age)
     print ( "The student sex is:" , sex)
     print ( "The student address is:" , address)
     print ( "The student telphone is:" , telphone)
     print ( "The student shcool is:" , shcool)
 
stuInfo( "linux" , 18 , "boy" , "北京" , "18393820785" #未传入默认参数shcool
 
执行结果:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * The First stuent info * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
The student name  is : linux
The student age  is 18
The student sex  is : boy
The student address  is : 北京
The student telphone  is 18393820785
The student shcool  is : 清华大学
 
stuInfo( "docker" , 2 , "girl" , "上海" , "NULL" , "上海交通大学" ) #传入和默认参数值不同的参数
执行结果:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * The Second stuent info * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
The student name  is : docker
The student age  is 2
The student sex  is : girl
The student address  is : 上海
The student telphone  is : NULL
The student shcool  is : 上海交通大学

 默认参数注意点

一是必选参数(函数定义时所有的非默认参数)在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);

传入变量时容易产生歧义,所以我们将默认参数放置在必选参数的最后,

二是如何设置默认参数。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

关键字参数

  在上面的示例中,使用的是按照参数定义的顺序传入参数,当我们定义的参数比较多的时候,就容易混乱,有一个关键字参数这时候就比较适合这种情景,同时使用关键字参数就可以打乱我们传入参数的顺序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def  stuInfo(name,age,sex,address,telphone,shcool = "清华大学" ,):
     print ( "The student name is:" ,name)
     print ( "The student age is:" , age)
     print ( "The student sex is:" , sex)
     print ( "The student address is:" , address)
     print ( "The student telphone is:" , telphone)
     print ( "The student shcool is:" , shcool)
stuInfo(name = "docker" ,age = 2 ,sex = "girl" ,address = "上海" ,telphone = "NULL" ) #使用定义函数的关键字
 
 
结果:
The student name  is : docker
The student age  is 2
The student sex  is : girl
The student address  is : 上海
The student telphone  is : NULL
The student shcool  is : 清华大学

 很明显,这样用关键字传入参数很清晰、明了,当我们排除异常和解决bug等都是比较好的方案。同时关键字参数还可以和我们定义的参数按照位置顺序(位置参数)结合使用,但是需要注意:关键参数必须放在位置参数之后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
stuInfo( "docker" , 2 ,sex = "girl" ,address = "上海" ,telphone = "NULL" )
 
执行结果:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * The Second stuent info * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
The student name  is : docker
The student age  is 2
The student sex  is : girl
The student address  is : 上海
The student telphone  is : NULL
The student shcool  is : 清华大学
 
 
stuInfo(name = "docker" , 2 , "girl" , "上海" , "NULL" #关键字参数在位置参数前面调用 会报错
 
执行结果:
   stuInfo(name = "docker" , 2 , "girl" , "上海" , "NULL" )
                          ^
SyntaxError: positional argument follows keyword argument
 
执行报错  语法错误 关键字参数在位置参数的后面

注意点:

在定义函数、调用函数的过程中,必须记住,关键字参数必须放在位置参数的后面。

非固定参数*args

例如上面定义的函数,主要包含姓名、年龄、性别、家庭住址、手机号码、学校等信息,想要传入更多的参数,这时我们定义的参数就不能满足需求,这时我们就可以用非固定参数,在不确定他们传入多少个参数的时候就可以使用非固定参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def   stuInfo2( * args):
     print (xargs)
 
     return  xargs
stuInfo2( "docker" , " " , "girl" , "上海" , "NULL" )
 
 
结果:
 
( 'docker' ' ' 'girl' '上海' 'NULL' )
 
默认参数与非固定参数的结合
def  stuInfo(name,age,sex,address,telphone,shcool = "清华大学" , * xargs):
     print ( "The student name is:" ,name)
     print ( "The student age is:" , age)
     print ( "The student sex is:" , sex)
     print ( "The student address is:" , address)
     print ( "The student telphone is:" , telphone)
     print ( "The student shcool is:" , shcool)
     print ( "非固定变量:" ,xargs)
 
stuInfo( "docker" , 2 , "girl" , "上海" , "NULL" , "mysqlDBA" , "redis" , "python" , "java" )

非固定参数**kwargs

除了上面介绍的*args非固定参数外,还有一种非固定参数**kwargs,*kwargs 会把多传入的参数变成一个dict形式。

**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。

在函数中处理键值参数

1
2
3
4
5
6
7
8
9
def  greet_me( * * kwargs):
     for  key, value  in  kwargs.items():
         print ( "{0} == {1}" . format (key, value))
 
greet_me(name = "alibaba" #调用函数
greet_me(obc = "mysql" )   #调用函数
结果:
name  = =  alibaba
obc  = =  mysql
1
2
3
4
5
6
def  stu_info(name,age, * args, * * kwargs):  # *kwargs 会把多传入的参数变成一个dict形式
     print (name,age,args,kwargs)
 
stu_info( "jack" , 32 , "baidu" , "python" ,job1 = "mysqlDBA" ,job2 = "linux SRE" )
 
jack  32  ( 'baidu' 'python' ) { 'job2' 'linux SRE' 'job1' 'mysqlDBA' }

*args参数结果是一个tuple型的

**kwargs参数结果是字典型,键值形式的。

组合参数

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def  f1(a, b, c = 0 * args,  * * kw):
     print ( 'a =' , a,  'b =' , b,  'c =' , c,  'args =' , args,  'kw =' , kw)
 
def  f2(a, b, c = 0 * , d,  * * kw):
     print ( 'a =' , a,  'b =' , b,  'c =' , c,  'd =' , d,  'kw =' , kw)
 
f1( 1 , 2 )
f1( 1 , 2 ,c = 3 )
f1( 1 , 2 , 3 , "a" , "b" )
f1( 1 , 2 , 3 , 'a' , 'b' ,x = 99 )
f2( 1 , 2 ,d = 99 ,ext = None )
 
 
结果:
=  1  =  2  =  0  args  =  () kw  =  {}
=  1  =  2  =  3  args  =  () kw  =  {}
=  1  =  2  =  3  args  =  ( 'a' 'b' ) kw  =  {}
=  1  =  2  =  3  args  =  ( 'a' 'b' ) kw  =  { 'x' 99 }
=  1  =  2  =  0  =  99  kw  =  { 'ext' None }

*xargs、**kwargs还通过一个tuple和dict,调用我们定义好的参数,例如

1
2
3
4
5
args  =  ( 1 2 3 4 )
kw = { 'd' "baidy" 'x' '191991' }
f1( * args, * * kw)
结果:
=  1  =  2  =  3  args  =  ( 4 ,) kw  =  { 'd' 'baidy' 'x' '191991' }

对于任何函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

    此外,其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。


参数小结:

  • Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

  • 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

  • 要注意定义可变参数和关键字参数的语法:

  • *args是可变参数,args接收的是一个tuple;

  • **kw是关键字参数,kw接收的是一个dict。

  • 以及调用函数时如何传入可变参数和关键字参数的语法:

  • 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

  • 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})

  • 使用*args**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

  • 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

  • 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数



本文转自 tianya1993 51CTO博客,原文链接:http://blog.51cto.com/dreamlinux/1918581,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
216 0
|
2月前
|
索引 Python 容器
[oeasy]python096_列表_计数函数_count
本教程详细介绍了Python中列表的计数方法`count`,包括其基本用法、与`len`函数的区别,以及如何结合索引操作查找和删除特定元素。同时探讨了字符串对象的`count`方法,并通过实例演示了如何统计字符出现次数。
49 7
|
2月前
|
机器学习/深度学习 数据处理 索引
Python内置函数:面试通关的49个秘密武器
本文精选49个Python高频面试内置函数,涵盖数值处理、类型转换、序列操作、字典集合、函数式编程及高级特性,结合真实代码案例解析底层逻辑与应用场景,助你提升开发效率,轻松应对技术面试。
55 1
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
2月前
|
机器学习/深度学习 数据安全/隐私保护 计算机视觉
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异
|
2月前
|
XML Linux 区块链
Python提取Word表格数据教程(含.doc/.docx)
本文介绍了使用LibreOffice和python-docx库处理DOC文档表格的方法。首先需安装LibreOffice进行DOC到DOCX的格式转换,然后通过python-docx读取和修改表格数据。文中提供了详细的代码示例,包括格式转换函数、表格读取函数以及修改保存功能。该方法适用于Windows和Linux系统,解决了老旧DOC格式文档的处理难题,为需要处理历史文档的用户提供了实用解决方案。
131 1
|
1月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
3月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
236 1
|
3月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
143 0

推荐镜像

更多