鱼C论坛

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

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

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

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

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

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


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

------------------------------------------------------------------------------------------------------
Python只有函数没有过程Python函数就算如果没有用return返回某个值,它还是有返回值的,返回值是none例如:
>>> def cul():
1+2
>>> cul()
>>> type(cul)
<class 'function'>
>>> print(cul())
None


函数可以返回多个值利用列表元组可以返回多个值,例如:
>>> def xxx():
  return 1,4.14,'哈哈'
 
>>> xxx()
(1, 4.14, '哈哈')


全局变量和局部变量局部变量就是函数内部定义的变量,出了这个函数外就不能调用,它的作用域是这个函数内部;全局变量就是作用域是整个代码段。例如:
>>> def discount(price,rate):
        print('在函数体内访问全局变量old_price的值',old_price)
        new_price = price*rate
        print('这里输出局部变量new_price的值',new_price)
 
       
>>> old_price = 100
>>> discount_rate = 0.7
>>> discount(old_price,discount_rate)
在函数体内访问全局变量old_price的值 100
这里输出局部变量new_price的值 70.0
>>> print('这里试图访问函数内部变量',new_price)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print('这里试图访问函数内部变量',new_price)
NameError: name 'new_price' is not defined


当要在函数体内改变全局变量时,会生成一个名字一样的局部变量,从而达到保护全局变量的作用。如:
>>> def modify():
        num = 50
        print('输出全局变量letter的值',letter)
        print('输出函数体内重新修改后的num的值',num)
 
       
>>> num = 100
>>> letter = 'A'
>>> modify()
输出全局变量letter的值 A
输出函数体内重新修改后的num的值 50
>>> num
100




global关键字:要想在函数体内修改全局变量,在该变量前加个global表明这个变量是全局变量,如:
>>> def myfun():
  num = 100
  print(num)
>>> num
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    num
NameError: name 'num' is not defined
>>> num = 0
>>> num
0
>>> def myfun():
  global num
  num = 100
  print(num)
     
>>> num = 0
>>> myfun()
100
>>> num
100



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

>>> def fun1():
  print('fun1正在被调用')
  def fun2():
       print('fun2正在被调用')
  fun2()
>>> fun1()
fun1正在被调用
fun2正在被调用
>>> fun2()
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    fun2()
NameError: name 'fun2' is not defined


闭包(closure)如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
例子1
def fun1():
        a = 2
        def fun2(b):
                return (a*b)
        return fun2
>>> fun1()(5)
10
>>> x = fun1()
>>> x(5)
10


例子2
def fun1(a):
        def fun2(b):
                return (a*b)
        return fun2:
>>> fun1(2)(5)
10
>>> x = fun1(4)
>>> x(5)
20


nonlocal如果想要在内部函数修改外部函数内的变量就要用到nonlocal关键字,如:
>>> def fun1():
  num = 0
  print('fun1中的值:',num)
  def fun2():
       nonlocal num
       num = 100
       print('fun2中的值:',num)
  fun2()     
  print('调用fun2后的值:',num)
 
 
>>> fun1()
fun1中的值: 0
fun2中的值: 100
调用fun2后的值: 100



评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 10:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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