08 函数基础与参数
一、函数基础
1.定义函数的三种形式
无参函数
def foo():print('from foo')foo()
有参函数
def Foo(x):print(x)Foo()
空函数
def func():passdef upload():passdef download():passdef login():passdef register():passdef ls():pass
pass语句:
1 pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不回执行任何操作2 保证格式完整3 保证语义完整
就相当于c或java中的空语句
2. 调用函数的三种形式
语句形式
def foo()print('andy') foo()
表达式形式
def foo(x,y):return x+yresult=foo(1,2) print(result)
可以当作参数传给另外一个函数
def f1(x):return x*2def f2(x)return x+10result=f2(f1(2)) print(result)
函数返回值
一 函数的返回值需要注意:
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=18 foo('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/ouyang99-/p/10413438.html
08 函数基础与参数相关推荐
- 09-Python入门学习-函数基础与参数
一.函数基础 1.定义函数的三种形式 1.1 无参函数 def foo():print('from foo') foo() 1.2 有参函数 def bar(x,y):print(x,y) bar(1 ...
- 12_python基础—函数基础(参数、返回值、调用)
文章目录 目标 一.了解函数 二.函数基本使用 2.1 函数的定义 2.2 函数调用 2.3 第一个函数演练 思考 2.4 PyCharm 的调试工具 2.5 函数的文档注释 三.函数的参数 3.1 ...
- C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程
目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...
- C语言 函数不定长参数 - C语言零基础入门教程
目录 一.前言 二.函数不定长参数简介 1.va_start 2.va_arg 3.va_end 三.自定义不定长参数的函数 1.va_start/va_arg/va_end 案例一 2.va_sta ...
- C语言 函数缺省参数 - C语言零基础入门教程
目录 一.函数简介 1.函数声明 2.函数定义 3.函数调用 4.函数形参和实参 二.函数缺省参数 1.函数全缺省参数 2.函数半缺省参数 三.注意事项 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...
- python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值
python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...
- Python基础之函数2 (参数的返回值)
https://www.toutiao.com/a6663685808244916739/ 2019-03-02 15:04:15 函数参数的类型 不可变类型参数:整数.字符串.元组. fun(a) ...
- Python基础教程:函数的可变参数
在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c--,请计算a2 + b2 + c2 + --. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...
- 08函数的参数 进阶
1 不可变和可变的参数 问题1: 在函数内部, 针对参数使用 赋值语句, 会不会影响调用函数传递的 实参变量? -- 不会! 无论传递的参数是 可变 还是 不可变 只要 针对参数 使用 赋值语句, ...
最新文章
- 给django视图类添加装饰器
- Oracle NVL()和NVL2()函数
- Github标星59.7k:用动画的形式呈现解LeetCode题目的思路
- html中验证密码中是包含字母,在JavaScript中确认密码验证
- POJ 3241Object Clustering曼哈顿距离最小生成树
- Oracle入门(十四.21)之创建DML触发器:第二部分
- CocoaPods 简易教程 Alamofire请求数据 Swift
- MagicAjax C#版试用手记
- android仿iphone日期时间选择器,jquery仿苹果的时间/日期选择效果
- Python安全之使用Python进行MD5解密
- GUI学习之二十二——QRubberBand学习总结
- 人生「价值」的三个关键词|《价值》
- AirpodsPro 使用技巧
- vue-fullcalendar 日历插件
- 亚马逊又为卖家解锁新功能,最高提升10%转化的它不可忽略!
- Java--UML类图--使用/详解
- C语言 指向函数的指针
- 预测师的随想系列二:记一次囚徒博弈游戏
- 云服务器可以用来做什么?
- jQUery第一课(入门选择器)
热门文章
- 如何drop有default constrain…
- 个人能力以外的资本都为0_能力之外的资本等于零--可是我们就缺这个零
- 全志H616开发板Orange Pi Zero2连接香橙派5寸TFT液晶屏的测试说明
- 域名圈“巴菲特”戴跃:我认知不够,做了韭菜 | 《8问》
- c#通过ftp下载文件
- sas与matlab区别,SAS与MATLAB软件应用教学大纲
- 游戏AI三大难:样本大、成本高、灵活性差
- 基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB
- 以太网_什么是以太网
- 系统架构设计-安全篇