码迷,mamicode.com
首页 > 其他好文 > 详细

函数进阶(一)

时间:2017-07-26 20:20:05      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:length   整合   思维   line   范围   返回   产生   加载   列表   

1.命名空间

本质:存放名字与值的绑定关系

命名空间的分类:(1)全局命名空间(变量)->位于函数体外

                               (2)局部命名空间(变量)->位于函数体内或函数体上

                               (3)内置命名空间 (变量)->python解释器自带

局部变量的使用:

       a.全局使用,可以用globals申明相当于全局变量,也可以通过return来返回,同时在函数外部接收就可以使用(闭包函数的引用)

       b.局部使用,直接内部调用即可

三种命名空间的加载与取值顺序:

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中,从上到下加载)->局部命名空间(程序运行时,调用时加载)

取值:

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

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

ps:在全局引用变量x

x=1
def func(x):
      print(x)

f(10)
print(x)

2.作用域

分类:

 a.局部作用域(globals)

 b.全局作用域(locals)

 

#小范围的可以用大范围的,但是大范围的不能用小范围的

#范围从大到小

#在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的;如果在小范围内没有,就用上一级的,如果上一级没有,就用上上级的,如果都没有,则报错。

函数嵌套(支持多层嵌套、多层并行):
(1)格式:def 外部函数名():
def 内部函数名1():
def 内部函数名2():
def 内部函数名3():
return 内部函数名1
return 内部函数名2,内部函数名3
(2)调用:
变量名1 = 外部函数名() 此时接收到return返回的内部函数名1(即变量名1 = 内部函数名1)可通过变量名1()来调用内部函数1
变量名2,变量名3 = 变量名1() 此时接收到return返回的内部函数名2,内部函数名3(即变量名2 = 内部函数名2,变量名3=内部函数名3)可通过变量名2()来调用内部函数2,变量名3()来调用内部函数3
(3)层级:函数内部可以嵌套多层函数
(4)个数:在同一层级可以有多个函数并行,返回值和多个变量的返回一致(可以以元祖形式进行返回,也可以通过解压缩的方式)


闭包函数(可以有多级包):
基础:闭包函数基于嵌套函数(闭包函数属于嵌套函数的一种)
产生条件:
a.必须为内部函数
b.对外部作用域的引用(外部作用域不包括全局作用域,只限于在本层函数之外最外层函数之内的作用空间)
特点:
a.延迟计算(惰性计算,不调用不计算)
b.自带作用域(作用域范围:本层函数之外全局作用域之内)
证明:
print(闭包函数的引用.__closure__)
访问闭包函数的元素(闭包函数的引用.__closure__[0].cell_contents)


两个关键字:
用法:关键字(global nonlocal) 变量名
变量名 = 新的变量值
global 全局声明,可以在函数内部将全局变量进行修改
nonlocal 函数内部声明,可以在函数内部对局部变量进行修改(只能是内层函数对本层函数之外最外层函数之内的作用域变量进行修改)


三目运算符:
res = if成立时的结果 if 条件 else else成立时的结果

练习题

1、整理今天的知识点、继续整合思维导图
2、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作

import os
def file_1(demo,i,j):
    with open(demo,r,encoding=utf-8) as read_f,          open(demo1.py,w,encoding=utf-8) as write_f:
        for line in read_f:
            write_f.write(line.replace(i,j))
    return read_f,write_f
file_11,file_l2=file_1(demo.py,def,haha)
os.remove(file_1.name)
os.rename(file_l2.name,file_11.name)

3、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

def func1(s):
    for i in s:
        if i.isspace():
            return False
        else:
            return True
s=hello world
print(func1(s))

4、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表

#方法一
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
def length(s):
    a=[]
    for i in dic:
        if len(dic[i])>2:
         a.append({i:dic[i][0:2]})
    return a
print(length(dic))
#方法二
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
def func1(dic):
    for i in dic:
        if len(dic[i])>2:
            dic[i]=dic[i][0:2]
    return dic
print(func1(dic))

 

函数进阶(一)

标签:length   整合   思维   line   范围   返回   产生   加载   列表   

原文地址:http://www.cnblogs.com/moning/p/7240746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!