一,函数的定义与调用

定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。

   def 是固定的,不能变,必须是连续的def三个字母,不能分开

def 函数名(参数):
"""注释:函数功能和参数说明"""
函数体
……
return 返回值

调用:函数名+()

函数的返回值:return+返回值 ,结束函数

       return不带返回值相当于None

无返回值,返回一个值,返回多个值

二,函数的参数

 三,函数对象

  函数是第一类对象,即函数可以当做数据传递

  1,可以被引用

  2,可以当做参数被传递

def func():
print('func')
def func2(f):
print(f)
f()
print('func2')

  3,返回值可以是函数

def func():
print('func') def func2(f):
print('func2')
return f fu = func2(func)

  4,可以当做容器类型的元素

四,函数的嵌套

为了保护内部函数,确定内部函数只能在外部函数中被调用

def animal():
def tiger():
print('bark')
print('eat')
tiger()
# animal()

函数名的本质:就是一个变量,保存了函数所在的内存地址

五,作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域

  全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

  局部作用域:局部名称空间,只能在局部范围内生效

闭包:内部函数包含了对外部作用域而非全局作用域名字的引用,该内部函数称为闭包函数

六,装饰器

  1,装饰器的本质 :闭包函数

 2,功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
 3,装饰器的固定格式
def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re = func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner

4,带参数的装饰器

def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer @outer(False)
def func():
print(111) func()

5,多个装饰器装饰同一个函数

def qqxing(func):  #func = pipixia_inner
def qqxing_inner(*args,**kwargs):
print('in qqxing:before')
ret = func(*args,**kwargs) #pipixia_inner
print('in qqxing:after')
return ret
return qqxing_inner def pipixia(func): #dapangxie
def pipixia_inner(*args,**kwargs):
print('in pipixia:before')
ret = func(*args,**kwargs) #dapangxie
print('in pipixia:after')
return ret
return pipixia_inner #qqxing(pipixia_inner) -->dapangxie = qqxing_inner()
@qqxing #dapangxie = qqxing(dapangxie) -->dapangxie = qqxing(pipixia(dapangxie)) -->
@pipixia #dapangxie = pipixia(dapangxie)
def dapangxie():
print("饿了么")
dapangxie()
 

最新文章

  1. 报错:Caused by: java.io.FileNotFoundException: d:\youTemprepository\upload_77faffc1_1580a9240ca__8000_00000001.tmp (系统找不到指定的路径。)
  2. <System.ServiceModel>
  3. 将表单数据转化为json数据
  4. css写法效率问题
  5. spring整合JMS - 基于ActiveMQ实现
  6. Git学习 -- 搭建Git服务器
  7. Posix消息队列实现机制
  8. Word Ladder II 2015年6月4日
  9. Scrapy架构及其组件之间的交互
  10. [JLOI2011]基因补全
  11. Oarcle之group by关键字与having关键字
  12. 关于JAVA-JS-JSP之间传值的各种方法
  13. 使用xshell连接服务器,数字键盘无法使用解决办法
  14. M斐波那契数列(矩阵快速幂+费马小定理)
  15. python 两个队列进行对比
  16. EnumSet基本用法
  17. WebApi和Andriod对接访问模式问题
  18. Python04 range()方法的使用、turtle.textinput()方法和write()的使用、turtle.numinput()的使用
  19. Map详解
  20. NYOJ-127 快速求幂,最小生成树

热门文章

  1. vue 声明响应式属性
  2. [转]成员函数指针与高性能的C++委托
  3. DataUml Design 教程4-代码生成
  4. Mysql 5.7 liunx 忘记密码的补救方法
  5. 模拟 Ajax 上传
  6. easyui data-options的使用
  7. apache+svn No installed service name 'Apache2' 【转载】
  8. poj 1270(dfs+拓扑排序)
  9. 跟上Java8 - 日期和时间实用技巧,转自知乎王爵nice
  10. Win MYSQL5.7.19压缩版安装