一、函数概念

1.什么是函数函数就是具有某个具体功能的工具
2.为什么要用函数提供开发效率减少代码冗余提高程序的扩展性
3.定义一个函数def是定义函数的关键字,函数在定义的时候只检测函数体语法 不执行函数体代码
4.函数名: 函数名的命名规则与变量名一致5.调用函数的固定格式:            函数必须先定义在调用,定义之后可以在任何位置调用函数名+括号函数名只要遇到括号会立即执行函数体代码代码中遇到函数名加括号 优先级最高先去执行函数 再看下面的代码

引子

1.len() 内置函数
2.如果没有len()我们能不能自己定义一个类似的函数呢?s = 'hello'
def my_len():  # 自定义函数n = 0for i in s:n += 1print(n)res = my_len()
print(res)  # None#我们自己写的函数现在的问题问题1.没有返回值 只能固定的执行打印操作问题2.只能够固定的统计某一个容器类型的长度

二、函数返回值

#解决 问题1
1.所有的函数都有返回值,无论你写不写return,不写的情况下默认返回None2.只写return 或者return None并不是为了考虑返回值 而是为了结束函数的运行
# 函数内要想返回给调用者值 必须用关键字return
返回值有以下几种情况:
1.不写return
2.只写return
3.写return None (和只写return一样)
4.写return返回一个值
5.写return返回多个值

2.1  不写return

# 不写return:函数默认返回None
def func():print('hahaha') res = func() #开始调用
print(res)  #None

2.2  只写return 或者 写return None(情况一样)

# 只写return: return除了可以返回值之外 还可以直接结束整个函数的运行函数返回的也是None(None就表示什么都没有)
def func():l = ['jason','egon','tank']while True:for i in l:if i == 'egon':  # 当i为egon的时候 直接结束函数运行# break  # 如果这里不写return,写break,那么只能结束for循环,回到while循环,继续执行下一次for循环,一直执行,死循环输出jasonreturn  #整个函数结束标志,结束函数# print('asdasdkljlsjadl')  # return会结束整个函数, 这一行代码永远都不会运行print(i)  #jason
res = func()
print(res)  #None

2.3   写return返回一个值

# 写return返回一个值:这个值可以是python任意数据类型
def func():return '123'
def func1():return [1,2,3]
def func5():return True
print(func(),func1(),func5())  #123 [1, 2, 3] True

2.4   写return返回多个值

# 返回多个值,默认元组形式 (函数不希望自己处理的结果被修改)
def func2():return [1,2,3],[1,2,3],[1,2,3]  # ([1, 2, 3], [1, 2, 3], [1, 2, 3])
res1 = func2()
print(res1)
#如果不想让return帮你做处理,自己手动加上你想返回的数据类型符号
def func4():return [[1,2,3,4],[1,2,3,4],[1,2,34]]
res = func4()
print(res)  #[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 34]]

三、函数参数的分类

函数参数的两大类型形参:在函数的定义阶段 括号内写的变量名 叫做该函数的形式参数 简称 形参实参:在函数的调用阶段 括号内实际传入的值 叫做实际参数 简称 实参形参与实参的关系形参就相当于变量名,而实参就相当于变量的值函数调用传参的过程 就是给形参变量名赋值的过程注意:形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除只在函数内部有效 函数外部无任何影响

3.1 形参 实参

#无参数s = 'hello'
l = [1.2,3,4]
def my_len():# 需要0个参数n = 0for i in s:n += 1return n  #返回n的值给函数

res = my_len () #调用函数
print(res)  #5#我能不能像len()一样也能在括号内传递参数呢?
def my_len(args):  # 'args'为形参,相当于占位符,后面实参传入之后,形参的值即为实参的值print(args)n = 0for i in args:n += 1return n  #返回n给函数,即my_len()print(my_len('hello'))  #调用函数,将实参'hello'传递给形参‘args’
print(my_len('hello world'))
print(my_len([1,2,3,4,5]))print(args) # 直接报错  形参和实参的绑定关系只在函数内部有用,出了函数关系就不存在了hello
5
hello world
11
[1, 2, 3, 4, 5]
5

3.2  函数的简易架构

1.基本架构形式def 函数名(形参1,形参2...):'''函数的注释 用来描述该函数的作用以及各个形参的类型'''函数体代码1函数体代码2...return 函数的返回值2. 实例
def func(x,y): # 三个引号直接回车,自动跳出注释格式"""该函数的作用:param x: 对形参x的解释:param y: 对形参y的解释:return: 对函数返回值的解释"""print('hahaha')return 'heihei'
3.调出注释格式
print(help(func))  #查看函数的注释,没写注释输出None
print(help(len))  #千万不要加括号,加括号优先级最高直接调用函数了

3.3 位置参数和关键字参数

1. 第一种直接按照位置传  一一对应
# 位置参数:在函数定义阶段按照位置从左往右依次书写的变量名 叫做函数位置形参
# 位置形参在调用的时候 必须为其传值
def my_max(x,y):print(x,y)  # 20 10if x > y:return xelse:return y
# res = my_max(1)  # 在调用函数的时候 少一个实参不行
# res = my_max(1,2,3)  # 在调用函数的时候 多一个实参也不行
res = my_max(20,10)
# 位置实参:在函数的调用阶段 传入的参数会按照位置一一对应给形参
print(res)  #202. 第二种指名道姓的传  >>>:关键字传参
my_max(y=20,x=10)
my_max(10,y=20)  # 位置和关键字混合使用
my_max(20,y=40)
my_max(20,y=40,x=30)

注意:在函数的调用阶段 位置参数和关键字参数可以混合使用
但是必须保证1.位置参数必须在关键字参数的前面(越短的越靠前,越长的越复杂的越靠后)2.同一个形参不能被多次赋值

3.4默认值参数

1. 默认值参数: 在函数的定义阶段,形参(变量名)就已经被赋值了
2. 调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值调用的时候如果给默认值形参传值 ,那么就使用你传的值
3. 默认值参数的应用场景当形参接收的到值比较单一的情况下 通常可以考虑用默认值形参
def register(username,age,gender='male'):print(username,age,gender)register('jason',18)  #开始调用
register('tank',28)
register('egon',84)
register('kevin',58)
register('xiaohou',17,'female')jason 18 male
tank 28 male
egon 84 male
kevin 58 male
xiaohou 17 female

3.4.1 默认值参数  坑点1 (类似字典的.fromkeys())

def info(username,hobby,l=[]):l.append(hobby)print('%s 的爱好是 %s'%(username,l))
info('jason','study')
info('tank','生蚝')
info('kevin','喝腰子汤')
info('egon','女教练')jason 的爱好是 ['study']
tank 的爱好是 ['study', '生蚝']
kevin 的爱好是 ['study', '生蚝', '喝腰子汤']
egon 的爱好是 ['study', '生蚝', '喝腰子汤', '女教练']# 解决方法1 不使用默认列表,每次都传入新的空列表
def info(username,hobby,l=[]):l.append(hobby)print('%s 的爱好是 %s'%(username,l))
info('jason','study',[])
info('tank','生蚝',[])
info('kevin','喝腰子汤',[])
info('egon','女教练',[])jason 的爱好是 ['study']
tank 的爱好是 ['生蚝']
kevin 的爱好是 ['喝腰子汤']
egon 的爱好是 ['女教练']# 解决方法2 每次都给列表重新赋值
def info(username,hobby,l=None):if l == None:l = []l.append(hobby)print('%s 的爱好是 %s'%(username,l))
info('jason','study')
info('tank','生蚝')
info('kevin','喝腰子汤')
info('egon','女教练')jason 的爱好是 ['study']
tank 的爱好是 ['生蚝']
kevin 的爱好是 ['喝腰子汤']
egon 的爱好是 ['女教练']

3.4.2 默认参数 坑点2

m = 100
def my_max(x,y=m):print(x,y)
m = 222
my_max(111)  # 111  100  //而不是111 2221.函数在定义阶段 内部所使用的变量都已经初始化完毕了
不会因为调用的位置的变化 而影响到内部的值(暂时可忽略,但是很重要)2.函数无论在什么地方被调用都会跑到函数定义阶段去执行代码形参中用到的值都是往函数定义阶段代码往上找

3.5可变长参数 (动态参数)

可变长参数:
1.站在调用函数传递实参的角度:  实参的个数不固定的情况,也就意味形参也不固定
2.站在形参的角度: 可以用*和**来接收多余的(溢出的)位置参数和关键字参数

3.5.1 带你去看*

1.站在形参的角度 看 *
形参中的*会将多余的(溢出的)位置实参 统一用元组的形式处理 传递给*后面的形参名
def func(x,y,*z):print(x,y,z)  # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8)
func(1,2,3,4,5,6,7,8,54,43,4,5,6,6,7,8,)def func(x,*z):print(x,z)
func(1,z=8)  #直接报错   /// *在形参中只能接收多余的位置实参 不能接收关键字实参

2.站在实参的角度 看 *
def func(x,y,z):print(x,y,z)
#l = [1,2,3] #想将123对应xyz怎么办?
#a,b,c = l
#func(a,b,c) #解压赋值虽然可以但是如果有成千上万个数,怎么办呢?
func(*[1,2,3])  #1 2 3    *会将列表打散成位置实参一一传入等价于func(1,2,3,4,5,6)
func(*(1,2,3))  #1 2 3    等价于func(1,2,3)*只能将列表 元组 集合 字符串 (字典不行)
*的内部你可以看成是for循环

3.5.2 带你去看**

1.站在形参的角度看 **
def func(x,y,**z):print(x,y,z)  # z = {'r': 1, 'a': 1, 'b': 2, 'c': 3}
func(x=1,y=2,r=1,a=1,b=2,c=3)
**会接收所有多余的关键字参数 并将关键字参数 转换成字典的形式 字典的key就是关键字的名字
字典的value就是关键字的名字指向的值  将字典交给**后面的变量名2.站在实参的角度看 **
def func(x,y,z):print(x,y,z)
d = {'x':1,'y':2,'z':333}
func(**d)  #  1 2 333   // 等价于func(x=1,y=2,z=333)
**会将字典拆封成 key = value的形式

3.5.3  *与** 总结

1.形参中:        *在形参中能够接受多余的位置参数 组织成一个元祖赋值给*后面的变量名**在形参中能够接受多余的关键字参数 组织成一个字典赋值给**后面的变量名2.实参中:*:在实参中 *能够将列表 元祖 集合 字符串 打散成位置实参的形式传递给函数 (*就看成是for循环取值)**:在实参中 能将字典打散成key = value的形式 按照关键字参数传递给函数3.结合使用
# 需求 你写的函数 无论调用者按照正确传参的方式无论怎么传 你的函数都能够正常执行
# 注意python推荐形参*和**通用的写法
def func2(*args, **kwargs):print(args, kwargs)
func2(1, 2, 3, 4, 5, 6, x=1, y=2, z=3)
#(1, 2, 3, 4, 5, 6) {'x': 1, 'y': 2, 'z': 3}

四、定义函数的三种方式

4.1 空函数

空函数:可以快速帮助你构建项目框架 使项目架构清晰明了应用频率非常高购物车功能def register():passdef login():passdef shopping():passdef pay():pass

4.2 无参函数

def func():print('from func')

4.3 有参函数

def func(x,y,*args,**kwargs):pass

4.4 命名关键字参数(技多不压身)

1.命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
2. 在给命名关键字参数传值的时候 只能用关键字为其传值
3.在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
4.其实z和m都是命名关键字参数 不是默认值参数和位置参数
def func(x,y=1,*args,z=3,m,**kwargs):print(x,y)  #1 2print(args)  # (1, 2, 3, 4, 5, 6, 7, 78, 8, 9, 0)print(z,m)  # 69 999print(kwargs)  # {'o': 666999, 'l': 999666}
func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)

转载于:https://www.cnblogs.com/xp1315458571/p/11160343.html

函数概念 返回值 参数相关推荐

  1. C语言函数无返回值 参数

    void的两种说法: 1.void代表无返回值,不需要return 2.void代表返回值的类型是无类型,return要写但后面不加变量 形式参数,意思有点类似变量定义,写法类似变量的定义 如果调用的 ...

  2. python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值

    python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...

  3. Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象...

    一.拾遗 1.通常情况下无参函数只是进行操作,所以不需要返回值:有参数函数则需要返回值. 2.练习: 判断用户输入一串字符,如果这串字符的长度小于5则重新输入,如果大于5则退出循环. while Tr ...

  4. 函数的返回值返回概念

    函数的返回值返回值概念 函数自身的处理数据或执行结果,需要被二次使用或其他程序调用时,需要将数据返回出来 如何拿到返回值 关键字:return 要返回的数据 return的功能 可以让函数返回指定的值 ...

  5. MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦!

    MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦! 返回的向量第一个元素表示有多少行,第二个元素表示有多少列,如果size()的输入参数是一个向量,那么返回 ...

  6. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数

    Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...

  7. python 函数递归一次增加一次变量_python基础之函数、返回值,局部变量、全局变量,递归(继续补充不定长参数)...

    1.python中函数定义:函数是逻辑结构化和过程化的一种编程方法.(完成某一种特定的功能) def test02(): #"" msg = 'hello WuDaLang' re ...

  8. 高阶函数之函数作为参数使用 高阶函数之函数作为返回值使用 函数作为参数的练习

    高阶函数之函数作为参数使用 <!DOCTYPE html> <html lang="en"> <head><meta charset=&q ...

  9. 不显示参数名_第51p,万能参数与返回值,Python中函数的返回值

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第51篇文章,第三阶段的课程:Python进阶知识:详细讲解Python中的函数(四)====>函数的参数与返回值(下篇). ...

最新文章

  1. 结构 win32_COM编程攻略(十五 持久化与结构化存储)
  2. 踩不出足迹(牛客练习赛88 )
  3. elasticsearch——海量文档高性能索引系统
  4. 996,别让年轻人累到不觉得累
  5. 信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题
  6. CSDN 联合 18 家大厂招聘直播,10 小时突破百万热度!
  7. [转载] 使用selenium_一日一技:使用Selenium的浏览器自动化
  8. 使用微信机器人实现华为OLT和中兴OLT挂测的简单功能
  9. Processing绘制星空-2-绘制流星
  10. android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)
  11. wps如何用循环函数_WPS版Excel中怎样使用函数进行运算
  12. MATLAB 机器人工具箱简单教程:(下载及安装)
  13. 6.easyui+ztree案例:zTree树
  14. 2008服务器文件夹镜像,【玩转腾讯云】导入镜像-Windows 2008 R2 Datacenter
  15. Socket中send()函数和recv()函数详解
  16. 第十二周 任务四
  17. 【推荐】2015年5月~2016年7月开源云计算应用程序排行榜
  18. 定向推送,虚假宣传,资本助力的团油有谁撑腰?
  19. 仙居机器人_【101梦想秀】不得了!他是仙居机器人领域的领跑者!
  20. 是否能够成为真正的编程高手,主要是在于是否有毅力坚持学习和练习。本实例要求输出名言“贵有恒,何必三更起五更睡:最无益,只怕一日曝十日寒。”主要是想让读者激励自己,坚持学习C语言

热门文章

  1. ecshopcron.php,ecshop商业模板 高仿小米商城源码,小米手机商城源代码模板价值百元...
  2. 用Python实现拨打电话
  3. babel 插件编写
  4. asp jsp cgi php之间的区别和优点
  5. BIND的进阶二:视图,日志,转发,子域的授权
  6. 【人工智能行业大师访谈2】吴恩达采访 Pieter Abbeel
  7. 小程序canvas头像不显示解决办法
  8. linux ftp下载文件到本地,如何使用get指令利用FTP下载文件到本地
  9. 预失真算法matlab实现,2013-全国研究生数学建模B题-seleh模型预失真MATLAB仿真代码...
  10. 一个IT人的辞职信:怀着梦想去远行!