鱼C论坛

 找回密码
 立即注册
查看: 2189|回复: 0

[技术交流] 章节五:函数(19-20课时)

[复制链接]
发表于 2017-7-16 18:49:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 向西而笑 于 2017-7-22 17:19 编辑


这两节课时尤其是那个闭包实在不好理解,@醉酒青牛 写的笔记给了我很大的帮助,非常感谢

------------------------------------------------------------------------------------------------------
Python只有函数没有过程Python函数就算如果没有用return返回某个值,它还是有返回值的,返回值是none例如:

  1. >>> def cul():
  2. 1+2
  3. >>> cul()
  4. >>> type(cul)
  5. <class 'function'>
  6. >>> print(cul())
  7. None
复制代码



函数可以返回多个值利用列表元组可以返回多个值,例如:

  1. >>> def xxx():
  2.   return 1,4.14,'哈哈'

  3. >>> xxx()
  4. (1, 4.14, '哈哈')
复制代码



全局变量和局部变量局部变量就是函数内部定义的变量,出了这个函数外就不能调用,它的作用域是这个函数内部;全局变量就是作用域是整个代码段。例如:

  1. >>> def discount(price,rate):
  2.         print('在函数体内访问全局变量old_price的值',old_price)
  3.         new_price = price*rate
  4.         print('这里输出局部变量new_price的值',new_price)

  5.       
  6. >>> old_price = 100
  7. >>> discount_rate = 0.7
  8. >>> discount(old_price,discount_rate)
  9. 在函数体内访问全局变量old_price的值 100
  10. 这里输出局部变量new_price的值 70.0
  11. >>> print('这里试图访问函数内部变量',new_price)
  12. Traceback (most recent call last):
  13.   File "<pyshell#6>", line 1, in <module>
  14.     print('这里试图访问函数内部变量',new_price)
  15. NameError: name 'new_price' is not defined
复制代码



当要在函数体内改变全局变量时,会生成一个名字一样的局部变量,从而达到保护全局变量的作用。如:

  1. >>> def modify():
  2.         num = 50
  3.         print('输出全局变量letter的值',letter)
  4.         print('输出函数体内重新修改后的num的值',num)

  5.       
  6. >>> num = 100
  7. >>> letter = 'A'
  8. >>> modify()
  9. 输出全局变量letter的值 A
  10. 输出函数体内重新修改后的num的值 50
  11. >>> num
  12. 100
复制代码





global关键字:要想在函数体内修改全局变量,在该变量前加个global表明这个变量是全局变量,如:

  1. >>> def myfun():
  2.   num = 100
  3.   print(num)
  4. >>> num
  5. Traceback (most recent call last):
  6.   File "<pyshell#4>", line 1, in <module>
  7.     num
  8. NameError: name 'num' is not defined
  9. >>> num = 0
  10. >>> num
  11. 0
  12. >>> def myfun():
  13.   global num
  14.   num = 100
  15.   print(num)
  16.      
  17. >>> num = 0
  18. >>> myfun()
  19. 100
  20. >>> num
  21. 100
复制代码




内嵌函数
内嵌函数也可以叫内部函数,就是函数中的函数。内部函数作用域都在外部函数作用域之内,出了外部函数就不能调用内部函数


  1. >>> def fun1():
  2.   print('fun1正在被调用')
  3.   def fun2():
  4.        print('fun2正在被调用')
  5.   fun2()
  6. >>> fun1()
  7. fun1正在被调用
  8. fun2正在被调用
  9. >>> fun2()
  10. Traceback (most recent call last):
  11.   File "<pyshell#10>", line 1, in <module>
  12.     fun2()
  13. NameError: name 'fun2' is not defined
复制代码



闭包(closure)如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
例子1

  1. def fun1():
  2.         a = 2
  3.         def fun2(b):
  4.                 return (a*b)
  5.         return fun2
  6. >>> fun1()(5)
  7. 10
  8. >>> x = fun1()
  9. >>> x(5)
  10. 10
复制代码



例子2
  1. def fun1(a):
  2.         def fun2(b):
  3.                 return (a*b)
  4.         return fun2:
  5. >>> fun1(2)(5)
  6. 10
  7. >>> x = fun1(4)
  8. >>> x(5)
  9. 20
复制代码



nonlocal如果想要在内部函数修改外部函数内的变量就要用到nonlocal关键字,如:

  1. >>> def fun1():
  2.   num = 0
  3.   print('fun1中的值:',num)
  4.   def fun2():
  5.        nonlocal num
  6.        num = 100
  7.        print('fun2中的值:',num)
  8.   fun2()     
  9.   print('调用fun2后的值:',num)


  10. >>> fun1()
  11. fun1中的值: 0
  12. fun2中的值: 100
  13. 调用fun2后的值: 100
复制代码




评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 01:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表