一.函数介绍

1、什么是函数
    函数就是盛放代码的容器,把实现某一功能的一组代码丢到一个函数中
    就做成了一个小工具
 
    具备某一功能的工具-》函数
    事先准备工具的过程-》函数的定义
    遇到应用场景拿来就用-》函数的调用
 
2、为何要用函数
    在没有用函数之前面临的问题:
        1、代码冗余,程序组织结构不清晰、可读性差
        2、扩展性差
 
3、如何用函数
    原则:先定义、后调用
 
    定义函数的语法:
        def 函数名(参数1,参数2,参数3,...):
            """
            文档注释
            """
            代码1
            代码2
            代码3
            return 返回值
 
    调用函数:
        函数名(1,2,3)

3:函数在定义阶段发生的什么事情

# 定义函数不执行函数体代码,但是会检测函数体语法
# x = 100
# # print(x)
#
# def func(): # func=函数的内存地址
# print("start...")
# x
# # if True
# # print('ok')
# print("xxx")
# print("stop...")
#
# # print(func)
#
# func()

  

4:函数在调用阶段发生的什么事情

# 先通过函数名找到函数的内存地址,然后函数的内存地址()会触发函数体代码的运行
# def func():  # func=函数的内存地址
# print("start...")
# print("xxx")
# print("stop...")
#
# func() # x = 10
# x()

二.定义与调用函数的三种形式

(一·)定义函数的三种形式

1.1 无参

# def func():
# print('=====')
# print('hello')
# print('=====')
# func()

1.2 有参

# def max2(x,y):
# if x > y:
# print(x)
# else:
# print(y)
# max2(10,11) # def login(user,pwd):
# # user = input("u>>>: ")
# # pwd = input("p>>>: ")
# if user == 'egon' and pwd == '123':
# print('ok')
# else:
# print('error')
# login('egon','123')

1.3 空函数

def func():
# pass

(二) 调用函数的三种形式

2.1 语句形式

# def login():
# user = input("u>>>: ")
# pwd = input("p>>>: ")
# if user == 'egon' and pwd == '123':
# print('ok')
# else:
# print('error')
# login()

2.2 表达式形式

# res = input(">>: ")

# def max2(x,y):
# if x > y:
# return x
# else:
# return y
# sal = max2(30,40) * 12

2.3 可以把函数调用当做参数传给另外一个函数

# def max2(x,y):
# if x > y:
# return x
# else:
# return y
#
# res = max2(max2(10,20),30)
# print(res)

三.函数的参数

(一) 函数参数分为两大类:
 1、形参:在函数定义阶段括号内定义的变量名,称之为形式参数,简称形参
 2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参
 
 形参与实参的关系是:
 在调用函数时,实参的值会绑定给形参名,然后可以在函数内使用,函数调用完毕后,解除绑定
# def func(x,y):
# # x=1
# # y=2
# print(x+y)
#
# m = 1
# n = 2
# func(m,n)

  

(二) 参数详解
 2.1 位置形参::在函数定义阶段按照从左到右的顺序依次定义的形参,称之为位置形参
     特点:必须被传值,多一个不行少一个也不行
# def func(x,y):
# print(x+y) # func(1,2)
# func(1,2,3) #报错
# func(1,) #报错
 2.2 默认形参:在函数定义阶段就已经为某个形参赋值了,称之为默认形参
     特点:在函数定义阶段就已经赋值了,意味着在调用阶段可以不用为其赋值
 
     ps: 可以混用位置形参与默认形参,但是位置形参必须在前
# def func(x,y=2):
# print(x)
# print(y) # func(1,3)
# func(1)

 *# 默认形参需要注意的问题是:

   1、默认形参的值只在函数定义阶段被赋值一次
   2、默认形参的值通常应该是不可变类型
# 案例1
# m = 100
# def func(x,y=m): # y -> 100的内存地址
# print(x,y)
#
# m = 200
# func(1) # 案例2
# m = [11,22,]
# def func(x,y=m): # y -> [11,22,]的内存地址
# print(x,y)
#
# # m = 200
# m.append(33)
# func(1) # def register(name,x,hobbies=None): # hobbies = []内地址
# if hobbies is None:
# hobbies = []
# hobbies.append(x)
# print("%s 的爱好是 %s" %(name,hobbies))
#
# register("egon",'read')
# register("liu",'chou')
# register("hxx",'tang')

  

2.3 位置实参:在函数调用阶段按照从左到右的顺序依次传入的值,称之为位置实参
     特点:按照顺序与形参一一对应
# def func(x,y):
# print(x)
# print(y)
#
# func(1,2)
# func(2,1)

  

2.4 关键字实参:在函数调用阶段按照key=value的格式传入的值,称之为关键字实参
     特点:可以打乱顺序,但是仍然能够为指定的形参赋值
 
     ps:可以混用位置实参与管家腻子实参,但是
         1、位置实参必须在关键字实参前
         2、不能为同一个形参重复赋值
# def func(x,y):
# print(x)
# print(y) # func(y=2,x=1)
# func(1,y=2)
# func(y=2,1) #报错
# func(1,2,y=3) #报错

  

2.5 *与**在形参与实参中的应用
 可变长的参数:可变长指的是在函数调用阶段,实参的个数不固定,而实参是为形参赋值的,所以对应着必须要有一种特殊格式的形参能用来接收溢出的实参
 
# 形参中带*:*会接收溢出的位置实参,然后将其存成元组,然后赋值给紧跟其后的变量名
# def func(x,*args):  # y=(2, 3, 4, 5, 6)
# print(x)
# print(args)
#
# func(1,2,3,4,5,6) # def my_sum(*args):
# res = 0
# for num in args:
# res += num
# print(res)
#
# my_sum(1,2,3,4,5)
# my_sum(1,2)

 # 形参中带**:**会接收溢出的关键字实参,然后将其存成字典,然后赋值给紧跟其后的变量名

# def func(x,**kwargs):  #y = {'a':1,'b':2,'c':3}
# print(x)
# print(kwargs) # func(1,a=1,b=2,c=3)
# func(1,2,3,a=1,b=2,c=3) # 报错

 # 实参中带*:*后跟的必须是一个可以被for循环遍历的类型,*会将实参打散成位置实参

# def func(x,y,z):
# print(x)
# print(y)
# print(z) # func(*[11,22,33]) # func(11,22,33)
# func(*"hello") # func("h","e","l","l","o") #报错

 # 实参中带**:**后跟的必须是一个字典,**会将实参打散成关键字实参

# def func(x,y,z):
# print(x)
# print(y)
# print(z)
#
# func(**{"x":1,"y":2,"z":3}) # func(z=3,x=1,y=2)

2.6命名关键字参数:

*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递可以保证,传入的参数中一定包含某些关键字

def foo(x,y,*args,a=1,b,**kwargs):
print(x,y)
print(args)
print(a)
print(b)
print(kwargs) foo(1,2,3,4,5,b=3,c=4,d=5)
结果:
1
2
(3, 4, 5)
1
3
{'c': 4, 'd': 5}

  

四.函数的返回值

  用return控制函数的返回值:
  函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值当做本次调用的结果返回,具体来说,函数的返回值又分为三类
 1、return 值:返回的就是该值本身
 2、return 值1,值2,值3:返回的是一个元组
 3、函数内可以没有return,或就一个return后没有值:返回的是None
# def func():
# print("start")
# # return 123,"aa",[1,2,3]
# # return
# print("end")
#
# res = func()
# print(res) # def max2(x,y):
# # x = 3.3
# # y = 5.5
# if x > y:
# return x
# else:
# return y
#
# res = max2(3.3,5.5)
# print(res * 12)

  

 

最新文章

  1. Enterprise Architect 学习 之 活动图
  2. Head First 设计模式--2 观察者模式 解耦
  3. Egret 摇一摇功能
  4. Select the best path in a matrix
  5. Java学习笔记--HashMap中使用object做key的问题【转】
  6. cf B. The Fibonacci Segment
  7. 4605 Magic Ball Game
  8. 转 [ javascript面向对象技术
  9. 字符编码笔记:ASCII,Unicode和UTF-8(转)
  10. PyQt5安装目录中找不到designer.exe与pyrcc5.exe
  11. Maven 学习笔记-maven属性
  12. tp5邮件发送
  13. AI学习吧-购物车-添加商品接口
  14. 2018年1月 attribute VS prop 动画渲染
  15. 算法-动态规划DP小记
  16. kafka 面试题 无答案
  17. Motan
  18. 关于C语言的几个考试编程题目
  19. IP层网络安全协议(IPSec)技术原理图解——转载图片
  20. centos总结linux下svn安装与使用

热门文章

  1. C#如何防止程序多次运行的技巧(精典)
  2. 1071 Speech Patterns——PAT甲级真题
  3. SpringCloud Stream
  4. LDAP + Samba 安装配置流程
  5. python进阶(12)闭包
  6. 死磕Spring之IoC篇 - Bean 的创建过程
  7. MySQL:逻辑库与表管理
  8. 学习版pytest内核测试平台开发万字长文入门篇
  9. java 给时间增加时间得到一个新的时间(日期)
  10. 掌握HTTP原理