Python day8

#三元运算
# a = 20
# b = 10
# if a > b:
#     c = 5
# else:
#     c = 10

#if条件成立的结果 if 条件 else else条件成立的结果
# a = 20
# b = 10
# c = 5 if a>b else 10
# print(c)

#命名空间
#局部命名空间
#全局命名空间
#内置命名空间
def my_max(a,b):
    c = a if a > b else b
    return c

m = my_max(5,8)

#加载顺序  硬盘上——内存里
#内置-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)

a = 5
b = 8
def my_max():
    c = a if a > b else b
    return c

# m = my_max()
# print(m)

#作用域
#命名空间+作用域是分不开的
#两种
#全局作用域:全局命名空间、内置命名空间
#局部作用域:局部命名空间
def func():
    return max(1,2,3)
# print(func())

def max(a,b,c):
    return 2
# print(max(1,2,3))

#站在全局看:
#使用名字:
# 如果全局有:用全局的
# 如果全局没有:用内置的

#为什么要有作用域的概念:
#为了函数内的变量不会影响到全局
# def max():
#     a = 10
#     b = 20
#
# a = 2
# b = 3
# my_max(30,50)
#函数的嵌套调用
def f1():
    print('f1')

def f2():
    a = 10
    f1()

#函数的嵌套
#为了保护内部函数,确定内部函数只能在外部函数中被调用
def animal():
    def tiger():
        print('bark')
    print('eat')
    tiger()
# animal()

#函数名的本质
def func():
    print('func')
print(func)
# print(func)
# f = func
# print(f)
# f()
#
# l = [f]
# print(l)
# #l[0] == f
# l[0]()

#可以用作函数的参数
def func():
    print('func')

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

# func2(func)

#可以作为函数的返回值
def func():
    print('func')

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

fu = func2(func)
# print(fu)
# fu() #==>func()
# print(fu)
# print(func)
#如果我想在全局使用内部的函数


def func():
    print('func')

# print(func)
# f = func
# l = [f]
# f1 = l[0] #== f
# print(f1)
# print(f)
# print(func)
# func()
# f()
#f1()
#函数名做参数
# def func():
#     print('func')
# def func2(f):
#     f()
# func2(func)

#函数的名字可以做返回值
def func():
    def func2():
        print('hello')
    return func2

# f2 = func()
# f2()
# f = func

def heiheihei():
    ha = 10
    heng = 20
    def inner():
        print(ha)
        print(heng)
    inner()

# heiheihei()

#作用域:
#小范围的可以用大范围的
#但是大范围的不能用小范围的
#范围从大到小(图)
#在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
#如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
#如果都没有,报错

#作用域链
x = 1
def heihei():
    # x = 'h'
    def inner1():
        # x = 'i1'
        def inner2():
            print(x)
        inner2()
    inner1()

# heihei()

#闭包函数:内部函数,包含了对外部作用域中变量的引用
def hei():
    x = 20
    def inner():
        '''
        闭包函数
        '''
        print(x)


#闭包
#1.闭 内部的函数
#2.包 包含了对外部函数作用域中变量的引用

#闭包的常用形式
def hei():
    x = 20
    def inner():
        print(x)  #局部的
    return inner

# i = hei()
# i()  #全局

from urllib.request import urlopen
# def index():
#     url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
#     return urlopen(url).read()
# index()

def index():
    url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
    def inner():
        return urlopen(url).read()
    print(inner.__closure__)
    return inner
# u = "http://www.cnblogs.com/Eva-J/articles/7125925.html"
get = index()
print(get())


#作用域:
#小范围的可以用大范围的
#但是大范围的不能用小范围的
#范围从大到小(图)
#在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
#如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
#如果都没有,报错
a = 20
b = 50
def haha():
    x = 1
    y = 2
    print(globals())  #全局作用域中的名字
    print(locals())   #局部作用域中的名字

# haha()
# print(globals())  #全局作用域中的名字
# print(locals())   #全局的局部还是全局


a = 10
def heiheihei():
    global a
    a = 20

# heiheihei()
# print(a)
def f():
    a = 3
    def f1():
        a = 1
        def f2():
            nonlocal a
            # 1.外部必须有这个变量
            # 2.在内部函数声明nonlocal变量之前不能再出现同名变量
            # 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效

            a = 2
        f2()
        print('a in f1 : ', a)
    f1()
    print('a in f : ',a)

f()
# def f1(a):
#     print(a)
#     def f():
#         print(11111)
#         a = 2
# f1(None)

def f():
    a = 3
    def f1():
        a = 1
        def f2():
            nonlocal a
            a = 2
        f2()
        print('a in f1 : ', a)
    f1()
    print('a in f : ',a)

f()
print(1)

  

原文地址:https://www.cnblogs.com/jmblog/p/7241377.html