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:函数基础
概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...
随机推荐
- Spring整合Struts2的方法
一.基本支持 通常我们整合Spring和struts2的目的是让Spring来管理struts2的控制器.也就是说把Action交由Spring来管理,利用IOC的特性把Action注入到业务逻辑中. ...
- 2018.11.22-day24 面向对象-继承
1.归一化设计 2.抽象类 3.钻石继承 4.C3算法 5.新式类中的super
- (转)live555学习笔记10-h264 RTP传输详解(2)
参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...
- 【bzoj2588】Count on a tree 主席树
这题给人开了个新思路. 原本构造一个序列的主席树,是这个位置用上个位置的信息来省空间,树上的主席树是继承父亲的信息来省空间. 此题若带修改怎么办? 若对某个点的权值做修改,则这个点的子树都会受影响,想 ...
- UEFI启动模式下安装Ubuntu 16.04教程【转】
本文转载自:http://blog.csdn.net/Jesse_Mx/article/details/61425361 前言 最近常帮人安装Ubuntu,也算积累了一些经验.这篇博文主要谈一谈如何在 ...
- Codeforces Round #373 (Div. 2) Anatoly and Cockroaches —— 贪心
题目链接:http://codeforces.com/contest/719/problem/B B. Anatoly and Cockroaches time limit per test 1 se ...
- Gym - 100676F Palindrome —— 并查集
题目链接:https://vjudge.net/contest/155789#problem/E 题解: 由于是回文串,所以可以先将在对称位置的字符放在同一个集合(如果期间有两个非‘?’,且不相等,则 ...
- [Vim 使用]vim 自动括号补全配置
打开Vim的配置文件,windows 上面的配置文件在vim 的安装目录下,_vimrc,使用记事本或vim打开 在下方加入如下代码 inoremap ( ()<ESC>i inorema ...
- 字符编码乱码问题(servlet底层 编码大揭秘)
好多初学者会遇到,请求过去的信息内包含中文(一般会是get方式提交过去的请求会出现).好郁闷,这是为什么呢.有下面分析下,说的不好可以吐槽 话说我们能遇到这种编码的问题,归根结底就是这 这 web开 ...
- 为什么要把页面放在 WEB-INF 路径下?
1.基于不同的功能 JSP 被放置在不同的目录下 这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用.某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患.用户可以绕过Strut ...