没有返回值
1.不写return 函数执行完毕自动结束
2.只写return 结束函数
3.return none
返回一个值
结束函数且返回一个值
返回多个值
多个值用逗号隔开,可以用一个变量(元祖)或等量的变量接收。
形参
位置参数(按顺序)
*args 动态参数,可以接收任意多个位置参数
默认参数 可以不传
**kwargs 动态参数,可以接收任意多个按关键字传入的参数
如果默认参数的值是一个可变数据类型,那么每次调用函数的时候,如果不传值就公用这个数据类型的资源
def func(l = []):
l.append('1')
print(l)
func()
func()
func()
实参
按照位置传参
按照关键字传参
是程序从上到下被执行的过程中依次加载到内存
放置了我们设置的所有变量名和函数名
函数内定义的名字
当调用函数时候才会产生此命名空间,当函数执行结束随之消失
就是python解释器一起动就可以使用,比如print()
内置的名字在启动解释器的时候加载到内存里
在局部可以使用全局命名空间和内置命名空间
在全局可以使用内置,但不可以使用局部
内置和全局都属于全局作用域
对于不可变数据类型,在局部可以查看全局,但不能直接修改,若要修改,需要在局部上加个global(global尽量少用,不安全)
a =1
def func():
global a
a += 1
print(a)
func()
或者
a =1
def func():
a = 2
return a
ret = func()
print(ret)
locals()可以查看局部中所有变量,也可以查看全局的
根据locals的位置输出,在全局输出全局,在局部输出局部
globals()可以查看全局和内置中所有变量
只显示全局
a =1
def func():
a = 1
b = 2
print(locals())
func()
函数嵌套调用
def max(a,b):
return a if a>b else b
def the_max(x, y, z):
c = max(x, y)
return max(c, z)
ret = the_max(1, 2, 3)
**print(ret)
函数嵌套定义
内部函数可以使用外部函数的变量
def outer():
a = 1
def inner():
print('inner')
print(a)
inner()
outer()
nolocal用法类似global 只能用于局部变量,找上层离当前函数最近一层的局部变量
函数可以放在列表中这么用:
def func1():
print(1, 3, 3)
func2 = func1
l = [func1, func2]
for i in l:
i()
函数名可以作为函数的参数
def func():
print(1, 3, 3)
def func1(f):
f()
func1(func)
函数名可以作为函数的返回值
def func():
print(1, 3, 3)
def func1(f):
f()
return f
addrss = func1(func)
addrss()
定义:是嵌套函数,内部函数调用外部函数的变量
验证:打印函数.closure,当结果前部分有cell就是闭包
def outer():
a = 1
def inner():
print(a)
print(inner.__closure__)
outer()
闭包最常用的形式
外部函数调用内部函数,不需要每次都重复生成外部函数的变量
def outer():
a = 1
def inner():
print(a)
return inner
address = outer()
address()
小例子:
from urllib.request import urlopen
def get_url():
url = urlopen('https://hao.360.cn/?a1004') # 打开网站
def inner():
ret = urlopen(url).read()
print(ret)
return inner
get_func = get_url()