函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法

函数的定义格式,函数一般都是有返回值的

 #语法

#函数名要能反映其意义
  def 函数名(参数1,参数2,参数3,...):
  '''注释'''
    函数体
    return 返回的值

def test(x):
'''
函数功能:计算 2*x+1 正规军写函数前都会写注释,说明这个函数要实现的功能
:param x:整形数字
:return: 返回计算结果
'''
y=2*x+1
return y #函数的调用,需要传入参数
print(test(4)) print(test) # 代表番函数的内存地址被打印出来 <function test at 0x00AFB618>
#结果 9

# 再定义一个test函数,那么本段程序有两个test函数,怎么执行?
# Python 解释器是从上到下执行的,当执行到test()时,是不带参数的,所以该段程序是不带参数的test()函数
def test():
'''
2*x+1
:param x:整形数字
:return: 返回计算结果
'''
x=3
y=2*x+1
return y
a=test()
print(a)

为什么要使用函数 ?

那如果不使用函数会有如下问题:

1、代码的组织结构不清晰,可读性差
2、遇到重复的功能只能重复编写实现代码,代码冗余
3、功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大 
所以,如果使用函数,将得到以下好处: 1.代码重用

 2.保持一致性,易维护

3.可扩展性

过程:过程本身也是一个函数,只不过是没有返回值
def test01():    # test01就是一个过程,因为无返回值
msg = 'test01'
print(msg) def test02(): # test02 是一个函数,因为有返回值
msg = 'test02'
print(msg)
return msg t1 = test01()
t2 = test02()
print(t1) # 结果 None
print(t2) # 结果 test02
def test03():
msg = 'test03'
print(msg)
return 1,2,3,4,'a',['alex'],{'name':'alex'},None # 返回值可以是一个,也可是多个
# 结果

test01
test02
test03
test03
None
test02

(1, 2, 3, 4, 'a', ['alex'], {'name': 'alex'}, None)

def test01():
pass def test02():
return 0 def test03():
return 0, 10, 'hello', ['alex', 'lb'], {'WuDaLang': 'lb'} t1 = test01()
t2 = test02()
t3 = test03() print('from test01 return is [%s]: ' % type(t1), t1)
print('from test02 return is [%s]: ' % type(t2), t2)
print('from test03 return is [%s]: ' % type(t3), t3) #结果
from test01 return is [<class 'NoneType'>]: None
from test02 return is [<class 'int'>]: 0
from test03 return is [<class 'tuple'>]: (0, 10, 'hello', ['alex', 'lb'], {'WuDaLang': 'lb'})

总结:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,

所以在python中即便是过程也可以算作函数。

总结:

返回值数 = 0,返回None

返回数值 = 1 ,返回Object

返回数值 > 1,返回tuple

函数参数

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

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

3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)

4.默认参数

5.参数组

def calc(x,y): #x=2,y=3
res=x**y
return res
# 函数如果碰到return,该函数就的结束了,即使你后面有多个return,也不会执行;如果需要有多个return,需要通过 条件判断的形式进行
return y
res=calc(2,3)
print(res)
# 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量,
# 所以,此时想打印x,y,程序会报错
print(x)
print(y)
# 结果
NameError: name 'x' is not defined
def test(x,y,z):#x=1,y=2,z=3
print(x)
print(y)
print(z) #位置参数,必须一一对应,缺一不行多一也不行
test(1,2) # TypeError: test() missing 1 required positional argument: 'z'
test(1,2,3) # 1,2,3, 位置一一对应的关系,传值,成就就正常 #关键字参数,无须一一对应,缺一不行多一也不行
test(y=1,x=3,z=4) #位置参数一定要在关键字参数左边,不可混合使用
test(1,y=2,3)#报错, SyntaxError: positional argument follows keyword argument, 位置参数跟在了关键字参数的后面。
print(test(1,3,y=2))#报错, TypeError: test() got multiple values for argument 'y' ,就是参数y给传了多个参数
test(1,3,z=2,y=4)#报错,test() got multiple values for argument 'y',就是参数y给传了多个参数
test(z=2,1,3)#报错,位置参数必须在关键字参数的左边
test(1,3,z=2)
# 默认参数
def handle(x,type='mysql'):
print(x)
print(type) handle('hello')
# 结果
hello
mysql handle('hello',type='sqlite') # 默认参数传参写关键字,
# 结果
hello
sqlite handle('hello','sqlite') # 默认参数传参不写关键字
# 结果
hello
sqlite
# 还有, 比如安装软件, 有些功能默认是安装的,有些功能默认不是安装的
def install(func1=False,func2=True,func3=True):
pass
# 参数组:  两个星** 表示字典字典, 一个星表示*列表

# 一个*后面,最好按照规定就写args,实参的第一个参数就给形参的第一个参数,其他的实参都默认按照列表的方式处理,传给args了
def test(x,*args):
print(x)
print(args) # test(1)
# 结果
1
() test(1,2,3,4,5)
# 结果
1
(2, 3, 4, 5) test(1,{'name':'alex'})
#结果
1
({'name': 'alex'},) test(1,['x','y','z']) # 如果列表前没加*, 就表示把列表作为一个整体传给args参数的第一个元素
# 结果
#
# (['x', 'y', 'z'],) test(1,*['x','y','z']) # 如果列表前加*, 就与*args对应起来了,表示把列表的元素遍历一遍,依次赋给args参数
# 结果
1
('x', 'y', 'z') test(1,*('x','y','z'))
# 结果
1
('x', 'y', 'z') 上面示例的实参的传递方式都是按照位置的方式进行的。 下面示例的实参的传递方式按照关键字的方式
# 两个**后面最好也按照规定就写kwargs,
def test(x,**kwargs):
print(x)
print(kwargs) test(1,y=2,z=3)
#结果
1
{'y': 2, 'z': 3} test(1,1,2,2,2,2,2,y=2,z=3)
# 结果
TypeError: test() takes 1 positional argument but 7 were given
y前面的是按照位置参数的方式传的,必须一一对应,但是位置形参只有一个,实参却传递了7个 test(1,y=2,z=3,z=3)#会报错 :一个参数不能传两个值
# 结果
SyntaxError: keyword argument repeated 关键字参数重复了 下面的示例形参表示方法,意味着该函数无所不能,可以接受任意形式的参数
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,1,2,1,1,11,1,x=1,y=2,z=3) #报错
# 结果
TypeError: test() got multiple values for argument 'x' test(1,1,2,1,1,11,1,y=2,z=3)
1 -->给了x
(1, 2, 1, 1, 11, 1) -->给了 args
{'y': 2, 'z': 3} -->给了 kwargs def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs,kwargs['z']) test(1,1,2,1,1,11,1,y=2,z=3)
# 结果
1
(1, 2, 1, 1, 11, 1)
{'y': 2, 'z': 3} 3 def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs,kwargs.get('y')) test(1,*[1,2,3],**{'y':1})
#结果
1
(1, 2, 3)
{'y': 1} 1

第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数的更多相关文章

  1. Python函数的定义、参数传入与函数的调用

    作为计算机代码的一种抽象方式,函数在Python中扮演了极为重要的角色.今天给大家介绍Python函数的定义.参数的传入以及调用方式.其中函数参数的传入方式为本节重点内容.Python函数的参数形式包 ...

  2. python - 函数的定义和使用

    目录 函数的定义和使用 一. 为什么要用函数? 二. 函数的参数 三. 函数的变量 global和nolocal 四. 递归函数 五. lamabda匿名函数 函数的定义和使用 1 def test( ...

  3. python 函数的定义及传参

    函数是一个通用的程序结构部件,是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 定义一个简单的函数: >>> def test(a): #创建一个函数,函数名是test ...

  4. (转)python中函数参数中如果带有默认参数list的特殊情况

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

  5. [Python]可变类型,默认参数与学弟的困惑

    一.学弟的困惑 十天前一个夜阑人静.月明星稀的夜晚,我和我的朋友们正在学校东门的小餐馆里吃着方圆3里内最美味的牛蛙,唱着最好听的歌儿,畅聊人生的意义.突然,我的手机一震,气氛瞬间就安静下来,看着牛蛙碗 ...

  6. Python中为什么不能用可变对象作为默认参数的值

    def func(numbers = [], num=1): numbers.append(num) for number in numbers: print(number) func() >& ...

  7. Python开发【第十一篇】函数

    函数 什么是函数? 函数是可以重复执行的语句块,可以重复调用并执行函数的面向过程编程的最小单位. 函数的作用: 函数用于封装语句块,提高代码的重用性,定义用户级别的函数.提高代码的可读性和易维护性. ...

  8. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  9. python 函数指动态形参,作用域

    函数的动态形参, 作用域 一 动态形参 如果我们需要给⼀一个函数传参, ⽽而参数⼜又是不确定的. 或者我给⼀一个 函数传很多参数, 我的形参就要写很多, 很⿇麻烦, 怎么办呢. 我们可以考虑使⽤用动态 ...

随机推荐

  1. 并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究

    一.ArrayBlockingQueue类图结构 如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,c ...

  2. linux学习(一)开始

    第一关 用u盘安装ubuntu, 大部份工作制作的安装U盘会失败,使用Win32DiskImager就行了,这个工具需要手动填写完整iso路径. 第二个问题 装完后发现乱码,连英文都乱码,不知道原因, ...

  3. C# String与StringBuilder (转载)

    1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,所以对字符串添加或删除操作比较频繁的话.那就不要用String而用StringBuilder. 例如: ...

  4. neo4j 安装步骤 转自:http://blog.csdn.net/luoluowushengmimi/article/details/19987995

    1. Neo4j简介 Neo4j是一个用Java实现的.高性能的.NoSQL图形数据库.Neo4j 使用图(graph)相关的概念来描述数据模型,通过图中的节点和节点的关系来建模.Neo4j完全兼容A ...

  5. 关于In-App Purchase(内购)的注意事项

    前言:关于In-App Purchase(内购)的注意事项 一点注意事项: 内购应该有游客身份的购买选项,不然可能被拒,前一段时间我这边一直是因为没有游客身份购买被拒. 在验证内购结果的时候要注意使用 ...

  6. 嵌入式:FreeRTOS的使用(未完)

    为了方便与UCOS对比,顺序按照UCOS那篇编写. 0.一些移植.系统相关 1.框架写法(个人习惯相关) 1-1.main 函数里创建一个开始任务 int main(void) { 初始化外设 xTa ...

  7. Xcode 新建js文件

    Xcode 新建js文件

  8. DBCacheServer服务升级

    前段时间完成了该服务的设计的功能,花了很多时间和经历,最终完成了一个版本,已经测试了:现在后期再次在以前的基础上,完成了一些扩展. 1.扩展了内存存储 最初版本只是采用了gauva cache进行存储 ...

  9. 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】

    IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...

  10. angularjs路由不断刷新当前页面

    最近做项目遇到个问题,使用angular-route的时候,第一次点击 [按钮 a]会进入按钮a对应的控制器,接着再次点击a按钮的的时候就不会进入控制器了.我想要的效果是每次点击都能进入control ...