一、函数基础

1.定义函数的三种形式

1.1 无参函数

def foo():print('from foo')
foo()

1.2 有参函数

def bar(x,y):print(x,y)
bar(1,2)

1.3 空函数

def func():passdef upload():passdef download():passdef login():passdef register():passdef ls():pass

2. 调用函数的三种形式

2.1 语句形式

def foo():print('from foo')
foo()

2.2 表达式形式

def foo(x,y):res = x + y
return resres1=foo(1,2)*100#表达式形式
print(res1)

2.3 可以当作参数传给另外一个函数

def max2(x,y):if x > y:return xelse:return yres=max2(max2(1,2),3)
print(res)

函数返回值

一 函数的返回值需要注意:

1 返回值没有类型限制
2 返回值没有个数限制
返回1个值:调用函数拿到的结果就是一个值
返回多个值:调用函数拿到的结果就是一个元组
返回0个值,或者不写return:调用函数拿到的结果就是None

二 return关键字:

return是函数结束的标志,函数内可以有多个return,但只要执行一次,整个函数就结束

案例一

 def f1():print('first')return 1print('second')return 2print('third')return 3res=f1()print(res)#1

案例二

def foo():count=1while True:print(count)if count == 3:returncount+=1foo()

案例三

def bar():passdef foo():return [1,2],1,1.3,{'x':1},barres=foo()
print(res)#([1, 2], 1, 1.3, {'x': 1}, <function bar at 0x000001F597E51E18>)

三、函数的参数

1.函数的参数分为两大类:

1.1 形参:

指的是在定义函数阶段括号内指定变量名,即形参本质就是"变量名"

1.2 实参:

指的是在调用函数阶段括号内传入的值,即实参本质就是"值"

形参与实参的关系:在调用函数时,会将实参(值)赋值(绑定)给形参(变量名),
这种绑定关系在函数调用时临时生效,在调用结束后就失效了

def foo(x,y): #x=1 y=2x=1y=2print(x,y)foo(1,2)

2.形参与实参的具体分类

2.1位置参数

1 位置形参: 在定义函数阶段按照从左到右的顺序依次定义的形参,称之为位置形参
注意:但凡按照位置定义的形参,必须被传值,多一个不行,少一个也不行

def foo(x,y):print(x,y)
foo(1,2)#1,2
foo(1,2,3)#多,报错
foo(1,)#少,报错

2 位置实参: 在调用函数阶段按照从左到右的顺序依次传入的值,称之为位置实参
注意:但凡按照位置定义的实参,会与形参一一对应

def foo(x,y):print(x,y)foo(2,1)

2.2关键字参数

关键字实参: 在调用函数阶段,按照key=value的形式指名道姓地为形参传值
注意:
  1. 可以完全打乱顺序,但仍然能指名道姓为指定的形参传值
  2. 可以混合使用位置实参与关键字实参,但是必须注意:
1 位置实参必须放到关键字实参前面
2 不能对一个形参重复赋值

def foo(name,age):print(name,age)foo('egon',18)#name='egon' age=18
foo(18,'egon')#name='18 age='egon'
foo(age=18,name='egon')#name='egon' age=18foo('egon',age=18)#name='egon' age=18
foo(name='egon',18)#报错
foo('egon',age=18,name='lxx')#报错

2.3默认参数

默认参数:指的是在定义函数阶段,就已经为某个形参赋值了,改形参称之为有默认值的形参,简称默认形参
注意:
1. 在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
2. 位置形参应该放到默认形参前面
3. 默认参数的值在函数定义阶段就已经固定死了
4. 默认参数的值通常应该是不可变类型

def foo(x,y=2):print(x,y)foo(1)#x=1,y=2
foo(1,3)#x=1,y=3
foo(y=3,x=1)#x=1,y=3

m=10
def foo(x,y=m):#y=m=10print(x,y)m=20
foo(1) #x=1,y=10

对比

def register(name,hobby,l=[]):l.append(hobby)print('%s 的爱好为 %s' %(name,l))register('alex','piao')
register('lxx','喝腰子汤')
register('yxx','不洗澡')
register('egon','read')#alex 的爱好为 ['piao']
#lxx 的爱好为 ['piao', '喝腰子汤']
#yxx 的爱好为 ['piao', '喝腰子汤', '不洗澡']
#egon 的爱好为 ['piao', '喝腰子汤', '不洗澡', 'read']def register(name, hobby, l=None):if l is None:l=[]l.append(hobby)print('%s 的爱好为 %s' % (name, l))register('alex', 'piao')
register('lxx', '喝腰子汤')
register('yxx', '不洗澡')
register('egon', 'read')#alex 的爱好为 ['piao']
#lxx 的爱好为 ['喝腰子汤']
#yxx 的爱好为 ['不洗澡']
#egon 的爱好为 ['read']

2.4位置形参vs默认形参

对于大多情况下传的值都不相同的,应该定义成位置形参
对于大多情况下传的值都相同的,应该定义成默认形参

def register(name,age,sex='男'):print(name,age,sex)register('李铁蛋',18,)
register('李银蛋',28)
register('张铜蛋',38)
register('刘卤蛋',48)
register('刘二丫',19,'女')#李铁蛋 18 男
#李银蛋 28 男
#张铜蛋 38 男
#刘卤蛋 48 男
#刘二丫 19 女

3.可变长度的参数

站在实参的角度,参数长度可变指的是在调用函数时,传入的实参值的个数不固定
而实参的定义方式无法两种:位置实参,关键字实参,对应着形参也必须有两种解决方案*与**,类分别应对溢出的位置实参与关键字实参

3.1在形参中带*:会将调用函数时溢出位置实参保存成元组的形式,然后赋值*后的变量名

def foo(x,y,*z): #z=(3,4,5,6)print(x,y,z)foo(1,2,3,4,5,6)

3.2在实参中带*: 但凡在实参中带*星的,在传值前都先将其打散成位置实参,再进行赋值

def foo(x,y,z):print(x,y,z)
foo(1,*(2,3,4,5,6)) #foo(1,2,3,4,5,6)报错,需要3个,给了6个
foo(*(1,2,3)) #foo(1,2,3)
foo(*'hello')#  foo(‘h’,'w','l','l','o')报错,需要3个,给了6个
foo(*'abc') #foo('a','b','c')#解决方案
def foo(x,y,*z): #z=(3,4,5,6)print(x,y,z)
foo(1,*[2,3,4,5,6]) #foo(1,2,3,4,5,6)

3.3 在形参中带**:会将调用函数时溢出关键字实参保存成字典的形式,然后赋值**后的变量名

def foo(x,y,**z): #z={'z':3,'a':1,'b':2}print(x,y,z)foo(1,y=2,a=1,b=2,c=3)

3.4 在实参中带**: 但凡在实参中带**星的,在传值前都先将其打散成关键字实参,再进行赋值

def foo(x,y,**z):# z={'a':100,'b':200}print(x,y,z)#1 111 {'a': 100, 'b': 200}
foo(1,**{'a':100,'b':200,'y':111})# foo(1,b=200,a=100,y=111)def foo(x,y,z):print(x,y,z)#222 111 333
foo(**{'y':111,'x':222,'z':333})# foo(z=333,x=222,y=111)

3.5规范: 在形参中带*与**的,*后的变量名应该为args,**后跟的变量名应该时kwargs

def foo(*args,**kwargs): #args=(1,2,3,4,5) kwargs={'a':1,'b':2,'c':3}print(args)print(kwargs)
foo(1,2,3,4,5,a=1,b=2,c=3)def bar(x,y,z):print(x,y,z)def wrapper(*args,**kwargs): #args=(1,2,3,4,5,6) kwargs={'a':1,'b':2,'c':3}bar(*args,**kwargs)bar(*(1,2,3,4,5,6),**{'a':1,'b':2,'c':3}) #bar(1,2,3,4,5,6,a=1,b=2,c=3)
wrapper(1,2,3,4,5,6,a=1,b=2,c=3)

!!!!!!!!!!!!!!!当我们想要将传给一个函数的参数格式原方不动地转嫁给其内部的一个函数,应该使用下面这种形式

def bar(x,y,z):print(x,y,z)def wrapper(*args,**kwargs): #args=(1,2) kwargs={'z':3}bar(*args,**kwargs)bar(*(1,2),**{'z':3}) #bar(1,2,z=3)
wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的确是bar的参数标准

四、 命名关键字参数: 放到*与**之间的参数称之为命名关键字参数

注意: 命名关键字参数必须按照key=value的形式传值

def foo(x,y,*args,m,n,**kwargs): #args=(3,4,5,6,7,8)print(x,y)#  1,2print(args)# (3,4,5,6,7,8)print(m,n) #222,333print(kwargs)foo(1,2,3,4,5,6,7,8,n=333,m=222,a=1,b=2)

转载于:https://www.cnblogs.com/yuanxiaohui/p/10280352.html

09-Python入门学习-函数基础与参数相关推荐

  1. python入门之函数结构函数的参数_Python 基础之函数初识与函数参数

    一.函数初识 定义:满足某一个方法 满足某一个功能#(1)功能(包裹一部分代码 实现某一个功能 达成某一个目的)#(2)可以反复调用,提高代码的复用性,提高开发效率,便于维护管理#(3)函数的基本格式 ...

  2. python入门之函数结构函数的参数_python3基础之函数参数类型

    函数的参数是函数内部与外部交流的纽带,上一篇文章我们使用了最简单的参数形式(就一个参数).接下来测试一下多个参数的情况是怎样的? 1.测试1 例子中使用了两个参数p1和p2, 函数的功能就是打印出p1 ...

  3. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

  4. python从零开始到精通_「Python 入门学习指南」0基础小白助你从入门到精通!

    Python比较简单,非常适合初学者入门,内置了各种库,还有丰富的大约13万第三方库,掌握了语法和编程思维后,可以直接使用这些库做出自己的产品.这篇 Python 入门学习指南,针对没有任何编程经验. ...

  5. 用python画哆啦a梦的身体_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频...

    见网络上有人用Python 画出来个多啦A梦,很是新奇,来来来,我们看一下他们主要用到的库. 其实主要用的库就一个 turtle 库 先说明一下turtle绘图的基础知识: 1. 画布(canvas) ...

  6. python turtle绕原点旋转_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频

    见网络上有人用Python 画出来个多啦A梦,很是新奇,来来来,我们看一下他们主要用到的库. 其实主要用的库就一个 turtle 库 先说明一下turtle绘图的基础知识: 1. 画布(canvas) ...

  7. 第二章(1):Python入门:语法基础、面向对象编程和常用库介绍

    第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 目录 第二章(1):Python入门:语法基础.面向对象编程和常用库介绍 1. Python 简介 1.1 Python 是什么? ...

  8. python入门视频教程推荐-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

  9. Python入门学习---第四天

    面向对象编程 类和实例 概念与其他面向对象编程语言类似. 以Student类为例,在Python中,定义类是通过class关键字: class Student(object):pass (object ...

最新文章

  1. 系统由单体架构到微服务架构到底是如何演进的?
  2. Oracle里silent,静默方式(silent)安装Oracle软件
  3. CAReplicatorLayer复制Layer和动画, 实现神奇的效果
  4. 修改mysql root的秘密
  5. 关于webpack编译scss文件
  6. 破解金山ocr文字识别软件
  7. CTF|逆向工程软件之IDA
  8. 基于web的小区物业管理系统
  9. 高一计算机算法教案,教科版 高一信息技术 必修1 第四单元 4.2 数值计算 教案...
  10. 中兴路由器查看时间_中兴路由器的设置方法教程
  11. phpstudy升级mysql5.6_phpstudy升级mysql数据库
  12. webpack:Error: Compiling RuleSet failed: Exclamation mark separated loader lists has been removed
  13. 【区块链108将】千方基金点付大头:投资区块链,不要让过往认知限制你的想象...
  14. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
  15. 定位技术--蜂窝基站
  16. [电路]5-电压源、电流源的串联和并联
  17. 软件设计师(计算机系统)
  18. Sequoia DB数据库操作
  19. 用php建设一个简单的网站,PHP_PHP新手上路(六),建设一个简单交互的网站(二) 5 - phpStudy...
  20. C++ Style and Technique FAQ (中文版)

热门文章

  1. 5怎么用修改器_经常用电脑辐射大怎么办?这5个习惯防辐射,很多人都知道
  2. mysql期中考试题及答案_mysql 查询 练习题及答案
  3. 需要多少次找出较轻的小球
  4. 二叉树的前序中序后序 递归与非递归解法
  5. bzoj 4001: [TJOI2015]概率论(找规律)
  6. hbase工作 架构原理
  7. 结构数组-创建结构数组---获取修改结构数组数据-------操作字段
  8. (二)pscc学习笔记
  9. python制作一个桌面小工具
  10. NMS(Non-maximum suppression)非极大抑制