三元运算

a = 1
b = 5
c = a if a>b else b  #变量 = 条件返回True的结果 if条件 else 条件返回False的结果
print(c)

必须要有结果。
必须要有if和else。
只能是简单的情况。

函数进阶

 

a = 1

def func():

    print(a)

func()

def func():

    a = 1

func()

print(a)

命名空间(三种)和作用域

内置命名空间: python解释器
      就是python解释器一启动就可以使用的名字存储在内置命名空间中
      内置的名字在启动解释器的时候被加载进内存里
全局命名空间:我们写的代码但不是函数中的代码
       是在程序从上到下被执行的过程中依次加载进内存的
       放置了我们设置的所有变量名和函数名
局部命名空间:函数
       就是函数内部定义的名字
       当调用函数的时候 才会产生这个名称空间
       随着函数执行的时候 这个命名空间就消失了

在局部:   可以使用全局、内置命名空间中的名字

在全局:可以使用内置命名空间中的名字,但是不能用局部使用

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

在正常情况下,直接使用内置的名字

意思就是在局部调用:局部命名空间->全局命名空间->内置命名空间

当我们在全局定义了和内置名字空间中同名时,会使用全局的名字

当自己有的时候,就不找上级要

如果自己没有就找上一级要 上一级没有再找上一级 如果内置在没有 就报错

多个函数应该拥有多个独立的局部命名空间,不互相共享

func ==> 函数的内存地址()

函数名()函数的调用

函数的内存地址()函数的调用

 

作用域

全局使用global
全局作用域 作用在全局 内置和全局都属于全局作用域
局部作用域 作用在局部 函数(局部名字空间属于局部作用域)
局部使用local
global 永远打印全局的名字(能不用就不用)
local 输出什么 根据local所在的位置

 

a = 1

def func():

    global a

    a += 1

func()

print(a)

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

a = 1
b = 2
def func():
x ='aaa'
y ='bbb'
print(locals())

func()
print(globals)


a = 1
b = 2
def func():
x ='aaa'
y ='bbb'
print(locals())
#print(globals)
#func()

print(globals)
print(locals) #本地的

函数的嵌套:最多三层

内部函数可以使用外部函数的变量

def outer():
    a = 1
    def inner():
        b = 2
        print(a)
        print('inner')
        def inner2():
            print(a,b)    #不可变数据类型的修改
            print('inner2')
        inner2()
    inner()
outer()


def outer():
    a = 1
    def inner():
        b = 2
        print(a)
        print('inner')
        def inner2():
            nonlocal a   #声明了一个上层局部变量
            a += 1
            print(a,b)    
            print('inner2')
        inner2()
    inner()
    print('**a**:',a)
outer()
print('全局:',a)
            

nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量

声明了nonlocal的1内部函数的变量修改会影响到 离当前函数最近一层的局部变量
对全局无效
对局部 也只是对最近的一层有影响

 

def func():
    print(123)
    
func()  #函数名就是内存地址

func2 =func   #函数名可以赋值
func2


l = [func,func2]   #函数名可以作为容器类型的元素
print(1)
for i in l:
    i()

def  func():
    print(123)
def  wahaha(f):
    f()

wahaha(func)   #函数名可作为函数的参数



def  func():
    print(123)
def  wahaha(f):
    f()
    return f    #函数名可以作为函数的返回值
qqxing = wahaha(func)
qqxing()

函数名就是第一类对象

闭包

嵌套函数,内部函数调用外部函数的变量

def outer():
    a = 1
    def inner():
        print(a)
    print(inner.__closure__)   有cell就是闭包
outer()
        

def outer():
    a = 1
    def inner():
    return inner
inn = outer()
inn()    #在外部使用内部的函数,就是闭包
#  闭包的使用方法
import urllib   #模块     
from urllib.request import urlopen
ret = urlopen('http://www.xiaohua100.cn/index.html').read()
print(ret)

def get_url():
    url = 'http://www.xiaohua100.cn/index.html'
    def inner():
        ret = urlopen(url).read()
        print(ret)
    return inner
get_func = get_url()
get_func()

 

posted on 2017-12-27 18:43  Kindergarten_Panda  阅读(234)  评论(0编辑  收藏  举报