1:什么是函数

  函数其实就是带名字的代码块,用于完成一些具体的工作。如果我们在写一段程序的时候,需要多次用到同样的一个功能,如果每次都要重复写相同的代码,不仅会增加我们的代码量,更会让我们写出的代码让别人看起来觉得很low,而如果我们把功能作为一个代码块封装在一个函数里,每次仅需要调用这个函数,是不是就很方便了?这就是函数的意义所在

1.1 函数的定义方式  

  函数的定义使用def关键字,如下:

def user():                        def 关键字后面加函数名定义函数,定义以冒号结尾
"""内部代码块""" 使用三引号来构成文档字符串,用来解释该函数的主要功能,这是一个很好的编码习惯
print("Hello World")       函数体,用来写该函数需要完成的功能的代码
user()                 使用函数名()的方式调用函数

1.2 向函数传递参数信息

  在定义函数的时候,可以在函数的()内加入变量,在调用函数的时候就可以给函数传入对应的值,以上个例子稍作修改:

def user(username):
"""内部代码块"""
print("Hello World,"+username)    在定义函数的时候传入变量username,在调用该函数的时候就可以通过传值来让函数实现相应的功能
user("尼古拉斯赵四")
输出结果:
Hello World,尼古拉斯赵四

2 形参和实参

  从名字就可以看出,实参是一个实实在在存在的参数,是实际占用内存地址的,而形参只是意义上的一种参数,在定义的时候是不占内存地址的,如在上面例子中,username就是一个形参,尼古拉斯赵四是我在调用函数时传入的一个实参,它的值被存储在形参username中。

  函数的调用中,可能存在多个实参,在给函数传递参数的时候只要有两种方式,位置实参和关键字实参,每个实参都由变量名和值组成,实参还可以是列表、字典

  1.位置实参

  在调用函数的时候,必须将每个实参都关联到函数定义中的每一个形参,最简单的关联方式就是基于实参的顺序。

def func(x,y,z):              首先在定义函数的时候传入3个形参x,y,z
print(x,y,z)
func(3,2,1)           在调用该函数时,通过位置实参的方式,将实参映射到形参,一一对应,即x=3,y=2,z=1
运行结果:
3 2 1

  需要注意一点的就是,如果使用位置实参的方式传值,传入的实参个数必须与形参相同,否则运行程序会报。

  2.关键字实参

  关键字实参是通过关键字-值的方式,关键字实参的方式就不需要考虑函数调用过程中实参的顺序。同一个参数不能传两个值

def func(x,y,z):
print(x,y,z)
func(x=1,y=2,z=3) 通过关键字=值的方式,将实参与形参关联映射,不需要考录形参的顺序,顺序也可以改变,即y=2,z=3,x=1 ,运行的结果不会发生改变
运行结果:
1 2 3

  3.既有顺序,又有关键字

def func(x,y,z):
print(x,y,z)
func(1,y=2,z=3) 在两种方式混用的时候,顺序实参必须要放在关键字实参之前,否则会程序报错,如 1,y=2.3 \ y=2 1,3这种方式都不可行
运行结果:
1 2 3

  4.默认值   

  在定义函数的时候,也可以指定形参的默认值,如果在调用函数时给函数提供了实参时,Python将使用指定的实参值,否则的,将自动调用形参的默认值。因此,如果给形参指定了默认值后,在调用时可以不用给它传值,使用默认值可以简化函数的调用。如:

def func(x,y=2):             定义函数的时候在这里给形参设置了默认值y=2
print(x,y)
func()             在调用此函数时,只传入了一个实参,y的值就会使用默认值
运行结果:
1 2

  还可以在调用的时候,更改默认值 ,如

def func(x,y=2):
print(x,y)
func(1,3) 在调用该函数的时候,给设置了默认值的形参y再次赋值,这运行结果会使用新传入的实参值
运行结果:
1 3

  在使用形参默认值的时候需要注意:在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。这让Python依然能够正确的解读位置实参。

def func(x=2,y):
print(x,y)
func(1) 这种情况程序是不允许运行的

  即:在函数调用过程中,可以混合使用位置实参,关键字实参和默认值参数,但是其中相关的规则一定要遵循,否则一定会导致程序的运行出错。

  当提供的实参多于或少于函数定义时所提供的形参时,程序会报错,这时只要根据报错信息正确修改即可。

  5.列表和字典

  当不确定需要传入的值是多少时,在定义形参的时候,可以使用*args(列表),**kwargs(字典)来表示。

def func(*args,**kwargs):        使用*args代表列表。**kwargs代表字典,这种形式可以在调用函数的时候传入多个实参
print(args)
print(kwargs)
func(*[1,2,3,4,5],**{"y":1}) 如果想要传入的值以列表或字典的形式显示出来,就需要在元素前加上*或**
运行结果:

(1, 2, 3, 4, 5)
{'y': 1}

3 函数的返回值

  函数不是直接显示输出的,相反,它会处理一些数据并返回一个或一组值。在函数中用return语句将值返回到调用函数的代码行,返回值能将程序大部分繁重的工作移交到函数中去完成,从而简化主程序。

  下面是一个简单的程序,接收姓氏和名称,返回完整的人名信息

def name(first_name,last_name):
"""返回人的姓名"""
full_name=first_name+" "+last_name
return full_name
print(name("尼古拉斯","赵四"))
运行结果:
尼古拉斯 赵四

  函数可以返回任何类型的值,包括字典、列表这样较复杂的数据结构。还是上面的例子,返回一个表示人的字典

def name(first_name,last_name,):
"""返回人的姓名"""
full_name={"first":first_name,"last":last_name}
return full_name
print(name("尼古拉斯","赵四"))
运行结果为:
{'first': '尼古拉斯', 'last': '赵四'}

  函数传递列表,传递列表在函数中很有用,在列表中包含数字、名字甚至更复杂的对象,下面举一个例子:

def func(names):
"""向列表中的所有用户问号"""
for i in names:
print("Hello"+" "+i+"!!")
func(["刘能","赵四","尼古拉斯"])
运行结果:
Hello 刘能!!
Hello 赵四!!
Hello 尼古拉斯!!

  函数还可以结合while循环,下面是我自己写的一个很简单的例子,用户输入姓氏和名字,最终输出完整的一句话。

def name(first_name,last_name,):
"""返回人的姓名"""
full_name=first_name+last_name
return full_name while True:
print("\nplease tell me your name ")
f_name=input("first name:")
l_name=input("last name:")
print("\n Hello"+name(f_name,l_name)+"!") 输入姓氏和名字,通过name函数整合后,输出结果

  

Pyhton函数篇(一)之函数中的形参与实参的更多相关文章

  1. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  2. Python函数篇:dict函数和列表生成式

    1.dict函数语法:dict()dict(**kwarg) dict(mapping, **kwarg) dict(iterable, **kwarg) 第一种:dict()构造一个空字典 h=di ...

  3. ABAP函数篇1 日期函数

    1. 日期格式字段检查 data:l_date type ekko-bedat. l_date = '20080901'. CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY ...

  4. gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性

    首先,这些C函数,在VS上要加_s后缀的原因是,这些函数存在字符串越界等问题,可以参考这篇文章,https://blog.csdn.net/silleyj/article/details/854540 ...

  5. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  6. Python函数篇

    1.函数名的命名规则: 函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合.不能使用任何的标点符号: 函数名是区分大小写的. 函数名不能是保留字. 2. 形参和实参 形参:形式参数,不 ...

  7. python学习【第四篇】python函数 (一)

    一.函数的介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以 ...

  8. 一道题带你搞定Python函数中形参和实参问题

    昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂.人生苦短,我用Python. 为了解答大家 ...

  9. 函数的形参和实参之arguments对象

    当函数调用函数时候传入的实参比函数声明时候制定的形参要少时候,剩余的形参就设置成了undefined.例如 function getPropertyNames(o,/*optional*/a){ va ...

随机推荐

  1. Hadoop(十一)Hadoop IO之序列化与比较功能实现详解

    前言 上一篇给大家介绍了Hadoop是怎么样保证数据的完整性的,并且使用Java程序来验证了会产生.crc的校验文件.这一篇给大家分享的是Hadoop的序列化! 一.序列化和反序列化概述 1.1.序列 ...

  2. DES加密And解密

    加密分为:单向加密,双向加密和对称加密. 单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原.算法代表:Base64,MD5,SHA; 双向加密:与单向加密相反,可以把密文逆推还原成明文,双向 ...

  3. 03Vue事件

    Vue提供了事件的绑定,方法写在methods对象中. 绑定dom中有两种方法: 方法一:v-on:click/dblclcick/mouseOver/mouseOut="方法名" ...

  4. (MariaDB)MySQL数据类型详解和存储机制

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  5. LeetCode 561. Array Partition I (数组分隔之一)

    Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...

  6. 通过Struts了解MVC框架,兼说如何在面试中利用Struts证明自己

    虽然目前Struts MVC框架不怎么用了,但它确是个能帮助大家很好地入门Web MVC框架,而且,一些历史项目可能还用Struts,反正技多不压身,大家如果能在面试中通过项目证明自己Struts这块 ...

  7. 【Telerik控件学习】-制作3D效果的柱状图(ChartView)

    首先,定义柱状图,并设置自定义的DataTemplate <telerik:RadCartesianChart > <telerik:RadCartesianChart.Horizo ...

  8. Ruby on Rails---Active Admin使用(一)

    概述 Active Admin提供了一个友好的后台管理界面,将CRUD等操作可视化,操作极其方便 安装 1. 添加gem gem "devise", :github => ' ...

  9. 剑指offer--面试题3

    一 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.完成一个函数,输入这样的数组和一整数,判断这个数组是否包含这个整数. 二 分析 如果这个二维数组是 ...

  10. 状压DP小结

    看了一个多星期状压DP,总算有点明白,大概可以分为两种:数据是在矩阵中的,数据是线性的,在矩阵中的一般就是排兵布阵这一种的,还有一种线性结构中给定条件让你求最大权值,比如求最大权值路线,TSP问题等, ...