为什么要有函数?什么是函数? 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 之 函数 基础的更多相关文章

  1. python 17 函数基础(一)

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

  2. 【Python】函数基础简介

    一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...

  3. python,day3,函数基础-3

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...

  4. Python的函数基础

    引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...

  5. python中函数基础

    函数 什么是函数? 函数分为内置函数和自定义函数 定义:在程序中具备某一功能的工具.在使用之前需准备该工具(函数的定义),遇到应用场景拿来就用(后引用). 为什么要用函数? 1.代码冗余 程序组织结构 ...

  6. Python之函数——基础篇

    函数 函数,在BASIC中,叫subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java中叫method. 定义: ...

  7. python 新手函数基础(函数定义调用值传递等)

    1.编程的集中主要方式: 面向过程 >类 >>关键字class 面向函数>函数 >> 关键字def 面向过程> 过程 >> 关键字def 2.py ...

  8. python 之 函数 基础2

    5.36 命名关键字 什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定 ...

  9. python之函数基础总结

    定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. def sayhi(name): print("Hello, %s, I', nobo ...

  10. Python:函数基础

    概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...

随机推荐

  1. shapes

    接口 shape package shape; public abstract interface shape { public abstract void Draw(); public abstra ...

  2. Struts多个文件上传

    Struts2多个文件上传 10级学员 韩晓爽课堂笔记 多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传.都大同小异. 一 介绍 1. 在struts2文件上传的时候要先导入 ...

  3. html video api控件总结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. shared SDK 微信开放平台遇到的问题

    shared sdk是用于集成到app中,方便快速社交化分享的组件,其使用方法比较简单,参考官网的快速集成步骤就能搞定.稍微麻烦一点的就是需要到各个开放平台去注册你的APP. 在各个开放平台注册好之后 ...

  5. DIY固件系列教程——实现开机LOGO三屏动画的完全替换【转】

    本文转载自:http://blog.csdn.net/sdgaojian/article/details/9192433 本教程需要用到如下工具:1,7Z压缩工具2,AddCrc32效验工具3,raw ...

  6. bzoj4486: [Jsoi2015]串分割

    肉丝哥哥钦定好题 话说我的blog现在为什么到处都是肉丝哥哥 先来想一个弱化版,假如能够n整除K怎么做? 把每个数字看成一个字符串,按字典序排名,这个可以后缀数组解决,然后暴力枚举每种情况,O(1)判 ...

  7. tensorflow 线性回归解决 iris 2分类

    # Combining Everything Together #---------------------------------- # This file will perform binary ...

  8. 使用MongoDB.NET 2.2.4驱动版本对 Mongodb3.3数据库中GridFS增删改查

    Program.cs代码如下: internal class Program { private static void Main(string[] args) { GridFSHelper help ...

  9. awk实现求和、平均、最大值和最小值的计算操作

    0.准备和数据文件 比如有一个数据文件,只有一列(在之前可以通过各种手段过滤出只有数字这一列),比如操作的响应时间 Txt代码  490898  1189235  20212  1494270  14 ...

  10. BZOJ_3781_小B的询问_莫队

    BZOJ_3781_小B的询问_莫队 Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值 ...