zoukankan      html  css  js  c++  java
  • Python之函数进阶

    一、python命名空间:

    1.1 加载顺序:

    内置名称空间 ---> 全局名称空间 ----> 局部名称空间(执行函数时)
    1.2 取值顺序:
    先从局部名称空间找----> 全局名称空间找----->内置名称空间找

    二、python作用域

     

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
    局部作用域:局部名称空间,只能在局部范围内生效

    globals和locals方法:

    1 name = 'wusir'
    2 def func():
    3     name = 'alex'
    4     print(name)
    5     print(globals())
    6     print(locals())
    7 func()
    View Code

    global全局变量关键字,nonlocal 局部变量关键字:

    global:

    1,声明一个全局变量。

    2,在局部作用域想对全局作用域的全局变量进行修改,global(限于字符串,数字)

     1 def func():
     2     global a
     3     a = 2
     4     print(a)
     5 func()
     6 print(a)
     7 
     8 #####
     9 #可变的数据类型:list,dict,set,不需要加global
    10 l1 = [1,2,3]
    11 def func():
    12     l1.append(444)
    13 func()
    14 print(l1)
    View Code

    nonlocal:

    1,不能修改全局变量

    2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

     1 def add_b():
     2     b = 42
     3     def do_global():
     4         b = 10
     5         print(b)
     6         def dd_nonlocal():
     7             nonlocal b
     8             b = b + 20
     9             print(b)
    10         dd_nonlocal()
    11         print(b)
    12     do_global()
    13     print(b)
    14 add_b()
    View Code

    三、函数的嵌套

    函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,单向。

     1 def fun1():
     2     print(111)
     3 
     4 def fun2():
     5     print(222)
     6     fun1()
     7 fun2()
     8 print(111)
     9 ##########
    10 def fun2():
    11     print(222)
    12     def fun3():
    13         print(666)
    14     print(444)
    15     fun3()
    16     print(888)
    17 print(333)
    18 fun2()
    19 print(555)
    View Code

     四、函数名的本质

    函数名就是函数的内存地址,一个特殊的变量。

    1, 函数名的内存地址,print(func)
    2, 函数名可以赋值给其他变量
    3, 函数名可以当做容器类的元素
    4, 函数名可以当做函数的参数.
    5, 函数名可以当做函数的返回值.
    学名:第一对象

    五、闭包

    内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
    函数内部定义的函数称为内部函数

    用处:

    如果说你内存函数是个闭包,python内部有一个机制,遇到闭包,
    他会在内存中开启一个内存空间,不会随着函数的结束而关闭.

    5.1 判断闭包

    1 def wrapper():
    2     name = 'alex'
    3     def inner():
    4         print(name)
    5     inner()
    6     print(inner.__closure__) # 检测是不是闭包 cell 就是b包
    7 wrapper()
    View Code

    5.2 闭包嵌套

     1 def wrapper():
     2     money = 1000
     3     def func():
     4         name = 'eva'
     5         def inner():
     6             print(name,money)
     7         return inner
     8     return func
     9 
    10 f = wrapper()
    11 i = f()
    12 i()
    View Code

    5.3 爬虫

    1 from urllib.request import urlopen
    2 print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read())
    3 def index(url):
    4     content = urlopen(url).read()
    5     def get():
    6         with open('爬虫','a') as f1:
    7             f1.write(content.decode('utf-8'))
    8     return get
    View Code

     

  • 相关阅读:
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUp2
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUp1
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUpShape2
    zw版【转发·台湾nvp系列Delphi例程】HALCON DivImage2
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUpShape1
    zw版【转发·台湾nvp系列Delphi例程】HALCON DivImage1
    phpstorm10.0.1和webstorm11注册
    制作自己的Cydia发布源
    theos的makefile写法
    wdcp v3 Forbidden :You don't have permission to access /phpmyadmin on this server
  • 原文地址:https://www.cnblogs.com/xiaobin12126/p/8399765.html
Copyright © 2011-2022 走看看