回顾:
函数:
可读性强,复用性强
定义方式:
def 函数名():
函数体
函数()
所有函数只定义不调用就不执行,需要先定义在调用
python3:
python3中新增了可以用中文作为函数名或变量名,不推荐使用
补充:
如果定义的参数时一个可变数据类型,那么每次调用函数会共享这个数据
代码:
def num1(a = []):# 定义一个函数,形参是一个空列表 a.append(1) print(a) # 每调用打印a列表 num1() # 调用函数 # 结果:[1] num1() # 结果:[1, 1] num1() # 结果:[1, 1, 1] # 说明每次调用时追加进去的值第二次会接着使用第一次追加过的列表接着执行追加
函数的进阶:
函数体内可以使用外边的变量,函数体外不能使用函数体内的变量
名字空间和作用域:
名字空间分为三个:
内置名字空间:
python解释器内置的名字,python解释器一启动就可以使用的名字储存在内存空 间中,启动时会被加载进内存
全局名字空间:
我们写代码是定义的命名,但是不是函数中的代码
是才程序从上到下被执行的过程中依次加载进内存的
放置了我们设置的所有变量名的函数
局部名字空间:
局部变量是定义在函数体内的
当调用函数的时候才会产生,函数结束也随着消失
三者关系:
在局部名字空间:局部命名空间可以调用往上层的变量
在全局名字空间:可是使用内置和本身的,不能使用局部变量的
在内置名字空间:不可以使用局部和全局的
函数名解释:
如果函数名使用了内置函数的名,那么在调用时就会调用自己定义的函数
函数之间不能共用命名空间,如果自己有就调用自己的,如果没有就往上找
函数的执行:
函数名() --> 函数的内存地址(),只是函数指向了函数的内存地址所以使用函数名加括 号来调用,我们得到的内存地址是物理内存地址所以不能自己使用内存地址加括号来 调用
作用域:
全局作用域:
作用在全局:内置的名字空间和全局的名字空间都属于全局作用域
局部作用域:
作用在局部:函数(局部名字空间中的名字属于局部作用域)
global的使用:(尽量避免使用)
对对于不可变数据类型,在局部变量中可以查看全局作用域的变量,但是不可直接改变
如果需要改变必须使用global关键字进行申明
申明方式:
global 变量名
变量名 = 新赋值
如果在局部变量声明了global那么在局部中的改变会影响到全局
方法:
globals:
可以查看全局的声明的名字和赋值,返回值是字典形式
locals(本地的):
可以查看本地的声明的名字和赋值,返回值是字典形式,
如果用在局部则会返回局部的如果用在全局则和globals一样
函数嵌套和作用域链:
函数的恰套就是函数之间的调用
定义:
在一个函数内再定义一个或多个函数
在调用时:如果只调用了外层函数没有调用内层函数则内层函数不会运行
内部函数可以使用外部定义的,外部函数不能使用内部函数定义的
在任何一个内函数中定义global只会对局部变量做出改变
nonlocal:
只能用于局部变量,只能找上级中离该级最近的局部变量
声明了nonlocal的内部函数的变量修改会影响到当前最近一层的局部变量
作用域:
pass
函数名就是内存地址:
函数名可以赋值
函数名可以作为容器类型的元素,接收名加括号可以调用函数
函数名可以作为函数的参数
函数名可以作为函数的返回值
闭包:
闭包一定是函数嵌套,且内部函数要调用外部函数的变量
_closure_:
如果打印出来cell说明是闭包
常用闭包形式:
return 函数名,然后调用外层是接收,使用接名()来调用
如果内部函数引用了外部函数的变量,外部函数的变量只有在函数结束才会消失
闭包的应用:
import(导入模块) urllib(模块,python文件) 这个模块是网络请求的
from(导入方式) urllib.repuest import urloprn
接收名 = urloprn('网站').read() 获取到结果,阅读的意思
print(接收名)
代码:
def find(): baidu = 'https://www.baidu.com/' # 注意事项:不能直接输入网址如:www.baidu.com,会报错 # 定义一个内函数,读取源码 def read_of(): s1 = urlopen(baidu).read() print(s1) return read_of s2 = find() s2()