Python学习之路基础篇--10Python基础,函数进阶

1 命名空间git

  对于Python 来讲命名空间一共有三种闭包

  1 内置命名空间 —— Python 解释器函数

    就是Python 解释器一启动就可使用的名字,储存在内置命名空间中。内置的名字在启动解释器的时候被加载进内存里spa

  2 全局命名空间 —— 咱们所命名的,但不是函数中的代码code

    是在程序从上到下被执行的过程当中依次加载进内存中的,放置了咱们所设置的全部变量名和函数名对象

  3 局部命名空间 —— 函数 blog

    就是函数内部定义的名字,当调用函数时,才会产生这个名称空间,随着函数执行的结束,这个命名空间又消失索引

  PS:内存

    1 在局部中可使用全局、内置命名空间中的名字;在全局中可使用内置命名空间的名字,但不能使用局部中定义的名字;在内置中不能使用局部和全局的名字作用域

    2 正常状况下直接使用内置的名字,当在全局定义了和内置名字空间中同名的名字时,会使用全局的名字;本身有名字就用本身的,没有就一级级身上找,若是内置中尚未,就会报错;多个函数拥有多个独立的局部名字空间,不互相共享

 

2 函数名

def func():
    pass

  其中func 是函数的内存地址,函数名加(),是函数的调用,能够类比为:函数的内存地址() = 函数的调用

  函数名就是内存地址;函数名能够赋值;函数名能够做为容器类型(元组、列表和字典)的元素;函数名能够做为函数的返回值;函数名能够做为参数

 

3 函数的做用域

  函数的做用域能够分为两种

  全局做用域 —— 做用在全局 —— 内置和全局名字空间中的名字都属于全局做用域 —— globals()

  局部做用域 —— 做用在局部 —— 函数(局部名字空间中的名字属于局部做用域)—— locals()

 

  对于不可变的数据类型来讲,局部能够查看全局做用域中的变量,可是不能直接修改,若是想修改,须要在程序的一开始添加 global 声名,若是在一个局部(函数)内声名一个global 变量,那么这个变量在局部的全部操做将对全局的变量有效

a = 1
def func():
    global a
    a += 1
    print(a)
func()

  对于 globals() 和 loclas() 方法

a = 1
b = 2
def func():
    x = 'aaa'
    y = 'bbb'
    print(locals())    #1 打印当前
    print(globals())    #2 打印全局
func()
print(globals())    #3 打印全局
print(locals())    #4 打印当前

  二者打印的是,以字典的形式打印出命名。二、三、4 打印的内容一致,1 打印的是函数内命名的状况

 

4 函数的嵌套

  定义:就是内部函数可使用外部函数的变量

a = 1
def func1():
    a = 2
    def func2():
        nonlocal a #声明了一个上面第一层局部变量
        a += 1  # 对不可变数据类型进行了修改  
        print(a)
    func2()
    print(a)
func1()
print(a)

  nocolal 只能用于局部变量,找上层中离当前函数最近一层的局部变量;声明 noncolal 的内部函数的变量修改会影响到离当前函数最近一层的局部变量;对全局无效,对局部也只是最近的一层有影响。

 

5 闭包

  闭包就是内部函数调用外部函数的变量

def outer():
    a = 1
    def innner():
        print(a)
    return inner
inn = outer()
inn()

  目的是保护函数内定义的值,而且节省内存空间,不用每次都定义一个a,直接用便可~

 

  来个三元运算

# 取两个数的最大值
def func(a,b):
    return a if a > b else b
print(func(3, 5))

 

6 小做业

 # 1 写函数,接收 n 个数字,求这些参数数字的和
 def sun_func(*args):
     total = 0
     for i in args:
         total += i
     return total
# 2 读代码,回答:代码中打印出来的值 a、b 和 c 分别是什么?为何?
a = 10
b = 20
def test5(a, b):
    print(a, b)
c = test5(b, a)
print(c)
# 得出的结果为:
# 20 10 
# None 
# 3 写函数,检查获取传入列表或元组的对象的全部奇数位索引对应的元素,并将其做为新的列表返回给调用者
def func(lis):
    return lis[1::2]
print(func([1,2,3,4,5,6,]))
# 4 写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5
def func(x):
    return len(x) > 5
print(func('dfs'))
print(func([1,2,3,4,5,6,]))
print(func((1,2,3,4,5,)))
# 5 写函数,检查用户传入列表的长度是否大于2,若是大于,那么仅保留前两个长度的内容,并将新内容返回给调用者
def func(lis):return lis[:2] # 若是列表长度不够的话,是不会报错的
# 6 写函数,计算传入字符串中,数字、字母、空格以及其它 的个数 ,并返回结果
def func(s):
    dic = {'n_digist':0,'n_alphabet':0,'n_blank':0,'n_other':0}
    for i  in s:
        if i.isdigit():
            dic['n_digist'] += 1
        elif i.isalpha():
            dic['n_alphabet'] += 1
        elif i.isspace():
            dic['n_blank'] += 1
        else:dic['n_other'] += 1
    return dic
print(func('skjdfhwhihsdfjkh389fhsfhksf  [fahh=-=-'))
相关文章
相关标签/搜索