自己的 习题 文件 false 声明 方式 关键字 true
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))
函数进阶(一)
来源: http://www.bubuko.com/infodetail-2229534.html