09-Python入门学习-函数基础与参数
一、函数基础
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():
pass def upload():
pass def download():
pass def login():
pass def register():
pass def ls():
pass

2. 调用函数的三种形式
2.1 语句形式
def foo():
print('from foo')
foo()
2.2 表达式形式
def foo(x,y):
res = x + y
return res res1=foo(1,2)*100#表达式形式
print(res1)
2.3 可以当作参数传给另外一个函数

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

函数返回值
一 函数的返回值需要注意:
1 返回值没有类型限制
2 返回值没有个数限制
返回1个值:调用函数拿到的结果就是一个值
返回多个值:调用函数拿到的结果就是一个元组
返回0个值,或者不写return:调用函数拿到的结果就是None
二 return关键字:
return是函数结束的标志,函数内可以有多个return,但只要执行一次,整个函数就结束
案例一

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

案例二

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

案例三

def bar():
pass def foo():
return [1,2],1,1.3,{'x':1},bar res=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=2
x=1
y=2
print(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=10
print(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,2
print(args)# (3,4,5,6,7,8)
print(m,n) #222,333
print(kwargs) foo(1,2,3,4,5,6,7,8,n=333,m=222,a=1,b=2)

09-Python入门学习-函数基础与参数的更多相关文章
- python入门学习:7.函数
python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数 使用关键字def ...
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- python入门学习:9.文件和异常
python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件 首先创建一个pi_ ...
- python入门学习:8.类
python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类 面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...
- python入门学习:6.用户输入和while循环
python入门学习:6.用户输入和while循环 关键点:输入.while循环 6.1 函数input()工作原理6.2 while循环简介6.3 使用while循环处理字典和列表 6.1 函数in ...
- python入门学习:3.操作列表
python入门学习:3.操作列表 关键点:列表 3.1 遍历整个列表3.2 创建数值列表3.3 使用列表3.4 元组 3.1 遍历整个列表 循环这种概念很重要,因为它是计算机自动完成重复工作的常 ...
- python入门学习:5.字典
python入门学习:5.字典 关键点:字典 5.1 使用字典5.2 遍历字典5.3 嵌套 5.1 使用字典 在python中字典是一系列键-值对.每个键都和一个值关联,你可以使用键来访问与之相关 ...
- python入门学习:2.列表简介
python入门学习:2.列表简介 关键点:列表 2.1 列表是什么2.2 修改.添加和删除元素2.3 组织列表 2.1 列表是什么 列表,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...
- Python入门学习:1.变量和简单的数据类型
python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用 变量,顾名思义是一个可变的量, ...
随机推荐
- Linux-Shell编程之求命令行中所有整数之和
前言 复习shell编程知识,书中有此练习题,之前学习时便没有搞透彻,此次是非啃下不可. 但是,摸索许久,却屡碰南墙,于是查阅网络博客,结果有让人比学不懂知识更让生气的是:博文遍地,净是抄袭!连个截图 ...
- 最短路径(Dijkstra算法)
算法局限性:边的权值不能为负. 需要两个辅助数组dist[],path[],分别记录起点到各点的最短距离和最短路径 算法步骤: 1.根据起点v0初始化dist[]和path[]数组. 2.在剩下的点中 ...
- 多线程/多进程/异步IO
SOCK_STREAM :TCPSOCK_Dgram :UDP family=AF_INET: 服务器之间的通信AF_INET6: 服务器之间的通信AF_UNIX: Unix不同进程间的通信 永远遵循 ...
- 将Chrome插件Momentum背景图片设为桌面壁纸
Momentum简介 Momentum插件是一款自动更换壁纸,自带时钟,任务日历和工作清单的chrome浏览器插件.官方的解释就是:替换你 Chrome 浏览器默认的“标签页”.里面的图片全部来自50 ...
- Maven - 镜像<mirror>
使用镜像如果你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用set ...
- Day 18: 记filebeat内存泄漏问题分析及调优
ELK 从发布5.0之后加入了beats套件之后,就改名叫做elastic stack了.beats是一组轻量级的软件,给我们提供了简便,快捷的方式来实时收集.丰富更多的数据用以支撑我们的分析.但由于 ...
- VUE 滚动插件(better-scroll)
1. 概述 1.1 说明 better-scroll是一款重点解决移动端(已支持PC)各种滚动场景需求的插件.例如淘宝聚划算中的类型选择(女装/家纺/生鲜美食等),没有滚动条显示却实现了滚动功能. 1 ...
- IDEA内的SpringBoot插件安装与SpringBoot项目生成地址
最新安装idea,在新建项目时没有spring initializr选项,也没有spring assistant选项.因此需要安装相应插件 在菜单栏 file>>settings>& ...
- 最优的路线(floyd最小环)
问题描述 学校里面有N个景点.两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度:否则它们之间没有直接的道路相连.这里所说的道路是没有规定方向的,也就是说,如果从I到J有直接的道路,那么 ...
- IDEA启动maven项目
一.安装IDEA 自行到官网下载,有条件请购买版权 地址:https://www.jetbrains.com/idea/ 二.修改快捷键(如果不是eclipse老用户请忽略这段) 左上角File→Sr ...