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:函数基础
概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...
随机推荐
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- iOS信号量
引子: 在取本地联系人列表的时候看到同事用的这么一段代码: dispatch_semaphore_t sema = dispatch_semaphore_create(); ABAddressBook ...
- 学习c编程的第二天
函数又叫方法,是实现某项功能或完成某项任务的代码块 #include<stdio.h>void show(){ printf("I like c language"); ...
- ansible 文件模块,很实用
摘自: http://blog.csdn.net/kellyseeme/article/details/50545521
- 在Eclipse配置自动提示
1.我们打开eclipse,选择菜单栏的window选项 2.点击Windows,选择下拉菜单里面的preferences选项,之后在打开的对话框的左侧找到Java选项 3.之后点击Java选项,选择 ...
- C语言教学杂记——字母排序
一个人在被告诉一个问题应该怎么被解决后,而且亲身试验效果OK后,一旦遇到类似的问题,就会条件反射般直接拿这个方法来用了.很少会去想为什么要用这个方法,会不会有什么隐患,还有没有别的方法呢,等等这些问题 ...
- git学习笔记(上)
1 安装 win安装 地址 安装之后自报家门 $ git config --global user.name "Your Name" $ git config --global u ...
- 如何配置xmanager
步骤1:编辑/etc/X11/xdm/Xaccess,将下面的行: #* # any host can get a login window 改为: * # any host can get a ...
- 「BZOJ3083」遥远的国度(树剖换根
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 4859 Solved: 1372[Submit][Status][Discu ...
- 深入攻克c语言--day04
1.将包含字符数字的字符串分开,使得分开后的字符串前一部分是数字后一部分是字母.例 如“h1ell2o3” ->”123hello” #include<stdio.h> #inclu ...