Python学习

1、三元运算符

  三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
  格式:[on_true] if [expression] else [on_false]
  res = 值1 if 条件 else 值2
def my_max(x,y):
    m = x if x>y else y
    return m
bigger = my_max(10,20)
print(bigger)

2、命名空间

  1)三种命名空间

    内置命名空间 —— Python解释器

      就是Python解释器,一启动就可以使用的名字存储在内置命名空间中

      内置的名字在启动解释器的时候被加载进内存里

    全局命名空间 —— 我们写的代码但不是函数中的代码
      是在程序从上到下被执行的过程中依次加载进内存的
      放置了我们设置的所有变量名和函数名
    局部命名空间 —— 函数
      就是函数内部定义的名字
      当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
  2)三种命名空间之间的加载与取值顺序:
    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
    取值顺序:
      在局部调用:局部命名空间->全局命名空间->内置命名空间
x = 1
def f(x):
    print(x)
print(10)

      在全局调用:全局命名空间->内置命名空间

def max(l):
    print('in max func')
    return l
print(max([1,2,3]))

      在内置调用:不能使用局部命名空间和全局命名空间

    3)相同命名空间的处理机制
      在正常情况下,直接使用内置命名空间
      当我们在全局定义了和内置名字空间中同名的名字时,会使用全局命名空间
      多个函数应该拥有多个独立的局部命名空间,不互相共享
      当命名空间在本级找不到,就到上一级找,上一级没有再找上一级,如果连内置命名空间都没有,就报错
def func():
    input = 1
    print(input)
func()

3、作用域

  1)定义
    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
    全局作用域:包含内置命名空间、全局命名空间,在整个文件的任意位置都能被引用、全局有效
    局部作用域:局部命名空间,只能在局部范围生效
  2)globals和locals方法
print(globals())
print(locals())
#   打印出的内容相同
def func():
    a = 12
    b = 20
    print(locals())
    print(globals())
func()
#   locals()打印出局部函数的参量
#   globals()打印出全局函数的参量

  3)global关键字与nonlocal关键字

    global声明
      对于不可变数据类型,在局部可是查看全局作用域中的变量,但是不能直接修改
      如果想要修改,需要在程序的一开始添加global声明,如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
a = 10
def func():
    global a
    a = 20
print(a)
func()
print(a)

    nonlocal声明

      只能用于局部变量 找上层中离当前函数最近一层的局部变量
      声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量
      对全局无效,对局部 也只是对 最近的 一层 有影响
a = 0
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            nonlocal a
            a = 20
            print(a)
        inner2()
    inner()
    print(a)
outer()
print(a)

      注意:   1、外部必须有这个变量

          2、在内部函数声明nonlocal变量之前不能再出现同名变量

          3、内部修改这个变量如果想在外部有这个变量的一次层函数中生效

4、函数的嵌套与作用域链
  1)函数的嵌套调用
def max2(x,y):
    m  = x if x>y else y
    return m
def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3
num = max4(23,-7,31,11)
print(num)

  2)函数的嵌套定义

def f1():
    print("in f1")
    def f2():
        print("in f2")
    f2()
f1()
def f1():
    def f2():
        def f3():
            print("in f3")
        print("in f2")
        f3()
    print("in f1")
    f2()
f1()

  3)函数的作用域链

def f1():
    a = 1
    def f2():
        print(a)
    f2()
f1()
def f1():
    a = 1
    def f2():
        def f3():
            print(a)
        f3()
    f2()
f1()
def f1():
    a = 1
    def f2():
        a = 2
    f2()
    print('a in f1 : ',a)
f1()

5、函数名的本质

  函数名本质上就是函数的内存地址

  1)函数名可以被引用

def func():
    print('in func')
f = func
print(f)

  2)可以被当作容器类型的元素

def f1():
    print('f1')
def f2():
    print('f2')
def f3():
    print('f3')
l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

  3)可以当作函数的参数和返回值

    第一类对象(first-class object)指

    1、可在运行期创建

    2、可用作函数参数或返回值

    3、可存入变量的实体

6、闭包

  1)闭包函数

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

#   闭包模型函数
def func():
    name = 'eva'
    def inner():
        print(name)
    return inner
f = func()
f()

  2)判断闭包函数的方法_closure_

#   输出的__closure__有cell元素 :是闭包函数
def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner
f = func()
f()
#   输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner
f2 = func2()
f2()

  3)闭包嵌套

def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func
f = wrapper()
i = f()
i()

  4)闭包函数获取网页应用

from urllib.request import urlopen
def index():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read()
    return get
xiaohua = index()
content = xiaohua()
print(content)
原文地址:https://www.cnblogs.com/SharkJiao/p/9367617.html