python 之 函数 基础
为什么要有函数?什么是函数? 1、组织结构不清晰,可读性差 2、代码冗余 3、管理维护的难度极大,扩展性
具备某一个功能的工具就是程序的中函数 事先准备工具的过程----》函数的定义 拿来就用----》函数的调用
所以函数的使用必须遵循:先定义,再调用
注意:没事先定义函数而直接调用,就相当于在引用一个不存在的变量名
5.1 函数定义和调用结构
定义阶段:在定义阶段只检测语法,不执行函数体代码
调用阶段:根据函数名找到函数的内存地址,然后执行函数体代码
1、语法 函数定义阶段
def 函数名(参数1,参数2,...): #def:定义函数的关键字
文档描述 #函数名:是用来调用函数的, 函数名的命名必须能反映出函数的功能
代码1 #文档描述:推荐写上,来增强函数的可读性
代码2 #代码块:函数的功能实现代码
代码3
return 值 #return:函数的返回值
1.1 调用阶段:函数名加括号就是在调用函数
def foo():
print('from foo')
bar()
foo()
2 定义函数的三种类型:
2.1 有参函数:参数是函数体代码用来接收外部传入值的
def max2(x,y): #x=100,y=101
if x > y:
print(x)
else:
print(y)
max2(100,101)
2.2 无参函数:当函数体的代码逻辑不需要函数的调用者掺入值的情况下,就无参
def func():
print('----------------------')
print('---soft run-----------')
print('----------------------')
def interactive():
name=input('username>>: ').strip()
pwd=input('password>>: ').strip()
print(name,pwd)
2.3 空函数:函数体为pass
def auth():
这是一个认证功能
:return:
pass
def put():
上传功能
:return:
pass
def get():
下载功能
:return:
pass
def ls():
list contents
:return:
pass
5.2 函数返回值
什么时候应该有返回值: 函数体代码运行完毕后需要有一个返回结果给调用者
返回值有三种形式:
1 没有return,返回值None
def func():
pass
res=func()
print(res)
2 return后跟一个值,返回该值本身
def func1():
return 1
res=func1()
print(res)
3 return可以逗号分隔,返回多个值,会返回一个元组给调用者# (1, 2, [1, 2, 3])
def func2():
return 1,2,[1,2,3]
res=func2()
print(res)
return注意点: 1、return返回值的值,没有类型限制 2、return是函数结束的标志,函数内可以写多个return,但执行一次,函数就立刻结束,并把return后的值作为本次调用的返回值
def func3():
print('first')
return 1
print('second')
return 2
print('third')
return 3
res=func3()
print(res)
5.3 函数参数
5.31 形参与实参
1、形参与实参是什么? 形参(形式参数):指的是在定义函数时,括号内定义的参数,形参其实就变量名 实参(实际参数),指的是在调用函数时,括号内传入的值,实参其实就变量的值
#x,y是形参
def func(x,y): #x=10,y=11
print(x)
print(y)
#10,11是实参
func(10,11)
2、注意: 实参值(变量的值)与形参(变量名)的绑定关系只在函数调用时才会生效/绑定,在函数调用结束后就立刻解除绑定
5.32 位置参数
位置参数 位置即顺序,位置参数指的就是按照从左到右的顺序依次定义的参数
1 在定义函数时,按照位置定义的形参,称为位置形参
def foo(x,y,z):
print(x,y,z)
#注意:
#位置形参的特性是:在调用函数时必须为其传值,而且多一个不行,少一个也不行 2 在调用函数时,按照位置定义的实参,称为位置实参
#注意:位置实参会与形参一一对应
5.33 关键字参数
1、什么是关键字参数: 在调用函数时,按照key=value的形式定义的实参,称为关键字参数
def foo(x,y,z):
print(x,y,z)
foo(y=2,x=1,z=3)
注意: 1、相当于指名道姓地为形参传值,意味着即便是不按照顺序定义,仍然能为指定的参数传值
2、在调用函数时,位置实参与关键字实参可以混合使用,但必须必须遵循形参的规则
def foo(x,y,z):
print(x,y,z)
foo(1,z=3,y=2)
# foo(1,z=3)
3、不能为同一个形参重复传值
def foo(x,y,z):
print(x,y,z)
foo(1,x=1,y=3,z=2)
4、位置实参必须放到关键字实参的前面
def foo(x,y,z):
print(x,y,z)
foo(1,y=3,z=2)
5.34 默认参数
在定义阶段,已经为某个形参赋值,那么该形参就称为默认参数 注意: 1 定义阶段已经有值,意味着调用阶段可以不传值
def register(name,age,sex='male'):
print(name,age,sex)
register('egon',18,) # egon 18 male
register('alex',73,'female') # alex 73 female
register('wxx',84,) # wxx 84 male
2 默认形参必须在位置参数的后面
def func(x,y=1):
pass
3 默认参数的值只在定义阶段赋值一次,也就是说默认参数的值在定义阶段就固定死了
m=10
def foo(x,y=m):
print(x,y)
m='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
foo(1) # 1 10
foo(1,11) # 1 11
4 记住:默认参数的值应该设置为不可变类型
def register(name,hobby,l=[]): # 列表 可变数据类型
l.append(hobby)
print(name,l)
register('wxx','play') # wxx ['play']
register('alex','read') # alex ['play', 'read']
register('egon','music') # egon ['play', 'read', 'music']
def register(name,hobby,l=[]): # 列表 可变数据类型
l.append(hobby)
print(name,l)
register('wxx','play',[]) # wxx ['play']
register('alex','read',[]) # alex ['read']
register('egon','music',[]) # egon ['music']
def register(name,hobby,l=None):
if l is None:
l=[]
l.append(hobby)
print(name,l)
register('wxx','play') # wxx ['play']
register('alex','read') # alex ['read']
register('egon','music') # alex ['music']
应用: 对于经常需要变化的值,需要将对应的形参定义成位置形参
对于大多数情况值都一样的情况,需要将对应的形参定义成默认形参
5.35可变参数
什么是可变长度参数 可变长度指的参数的个数可以不固定,实参有按位置定义的实参和按关键字定义的实参, 所以可变长的实参指的就是按照这两种形式定义的实参个数可以不固定,然而实参终究是要给形参传值的 所以形参必须有两种对应的解决方案来分别处理以上两种形式可变长度的实参,形参: * 、**
1.形参里包含*与**
* 会将溢出的位置实参全部接收,然后保存成元组的形式赋值给args
def foo(x,y,z,*args): #args=(4,5,6,7,8)
print(x,y,z)
print(args)
foo(1,2,3,4,5,6,7,8,)
** 会将溢出的关键字实参全部接收,然后保存成字典的形式赋值给kwargs
def foo(x,y,z,**kwargs): # kwargs={'c':3,'a':1,'b':2}
print(x,y,z)
print(kwargs)
foo(x=1,y=2,z=3,a=1,b=2,c=3)
2.实参里包含*与**
一旦碰到实参加*,就把该实参的值打散
def foo(x,y,z,*args): #args=([4,5,6,7,8],)
print(x,y,z)
print(args)
foo(1,2,3,*[4,5,6,7,8]) #foo(1,2,3,4,5,6,7,8)
foo(1,2,3,*(4,5,6,7,8)) #foo(1,2,3,4,5,6,7,8)
foo(1,2,3,*'hello') #foo(1,2,3,'h','e','l','l','o')
def foo(x,y,z):
print(x,y,z)
foo(*[1,2,3]) #foo(1,2,3)
foo(*[1,2,3,4]) #foo(1,2,3,4) #报错
foo(*[1,2,]) #foo(1,2,) #报错
一旦碰到实参加**,就把该实参的值打散
def foo(x,y,z,**kwargs):
print(x,y,z)
print(kwargs)
foo(1,2,3,**{'a':1,'b':2}) #foo(1,2,3,b=2,a=1)
def foo(x,y,z):
print(x,y,z)
foo(1,**{'z':3,'y':2}) #foo(1,z=3,y=2)
foo(1,**{'z':3,'y':2,'x':111}) #foo(1,z=3,y=2,x=111) # 报错,x重复赋值
*,** 组合使用
def index(name,age,gender):
print('welcome %s %s %s' %(name,age,gender))
def wrapper(*args,**kwargs): #args=(1,2,3),kwargs={'x':1,'y':2,'z':3}
print(args)
print(kwargs)
index(*args,**kwargs) # index(*(1,2,3), **{'x':1,'y':2,'z':3})
# index(1,2,3,z=3,y=2,x=2)
wrapper(1,2,3,x=1,y=2,z=3) # 报错
wrapper(name='egon',age=18,gender='male') # welcome egon 18 male
wrapper('egon',age=18,gender='male')
wrapper('egon',18,gender='male')
wrapper('egon',18,'male')
python 之 函数 基础的更多相关文章
- python 17 函数基础(一)
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- 【Python】函数基础简介
一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...
- python,day3,函数基础-3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...
- Python的函数基础
引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...
- python中函数基础
函数 什么是函数? 函数分为内置函数和自定义函数 定义:在程序中具备某一功能的工具.在使用之前需准备该工具(函数的定义),遇到应用场景拿来就用(后引用). 为什么要用函数? 1.代码冗余 程序组织结构 ...
- Python之函数——基础篇
函数 函数,在BASIC中,叫subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java中叫method. 定义: ...
- python 新手函数基础(函数定义调用值传递等)
1.编程的集中主要方式: 面向过程 >类 >>关键字class 面向函数>函数 >> 关键字def 面向过程> 过程 >> 关键字def 2.py ...
- python 之 函数 基础2
5.36 命名关键字 什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定 ...
- python之函数基础总结
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. def sayhi(name): print("Hello, %s, I', nobo ...
- Python:函数基础
概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...
随机推荐
- Windows10搭建FTP服务器
配置FTP服务器步骤: 第一步: 打开控制面板--->选择程序--->启动或关闭Windows功能--->勾选FTP服务器等.如下图: 第二步: 右键此电脑--->点击管理-- ...
- 前端面试常考知识点---CSS
前端面试常考知识点---js 1.CSS3的新特性有哪些 点我查看 CSS3选择器 . CSS3边框与圆角 CSS3圆角border-radius:属性值由两个参数值构成: value1 / valu ...
- platform_set_drvdata()/platform_get_drvdata()/container_of()【转】
本文转载自:http://blog.csdn.net/angle_birds/article/details/8443695 platform_set_drvdata(struct platform_ ...
- Linux 驱动面试题总结【转】
本文转载自:http://zkread.com/article/872291.html 1. Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备. 字符 ...
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- 通用方法解决UITextFiled输入的时候,键盘遮挡问题
我们在用键盘录入的时候,有可能会遮挡录入框,所以我们应调整UIView的位置,使其不被遮挡.我写了一个通用的方法可以解决这个问题:1. [代码][C/C++]代码 - (void) ...
- Python:递归
递归两个基本要素: (1) 边界条件:确定递归到何时终止,也称为递归出口. (n = 1)(2) 递归模式:大问题是如何分解为小问题的,也称为递归体.(n*(n-1)! n>1) 例:累加 ...
- CodeForces768B:Code For 1 (分治)
Jon fought bravely to rescue the wildlings who were attacked by the white-walkers at Hardhome. On hi ...
- su 和sudo 命令
一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用 ...
- 使用IIS Express调试网站的方法
如果不想安装IIS,可以直接使用IIS Express来运行网站. vs2012: 新建个文档,拷贝下面代码 taskkill /F /IM "WebDev.WebServer40.EXE& ...