函数
定义
def mystr(): 定义函数名
注释 对函数执行内容说明,增强可读性
pass 函数体
mystr() 执行函数
函数返回值
return
返回值三种情况:
没有返回值:return不写返回None return后面不写也返回None
return后面不写 结束整个函数
return None也返回None,一般不这么写
返回一个值:return + 需要返回的内容
返回多个值:return + 任意多、任意数据类型的值 str、int、list...
返回的多个值为元组类型,可由一个变量接收,或者用多个变量接收
函数的参数:
def 函数名(形参[可以是多个用,隔开。][一个具体的形参只能赋值一次][位置参数必须传值否则报错]):
(形参中还可以定义默认参数,即不变的形参)
(形参定义还可以定义为动态参数 即:*args,**kwargs args接收除键值对以外的参数,kwargs接收键值对的参数,保存在字典中)
(在没有动态参数时,实参形参必须一一对应,必须一一对应)
pass
函数名(实参[位置参数(1,2)、关键字参数(a = 1, b = 2)][混合传参:1,b=2])
实参进行传参时,必须位置参数在前,关键字参数在后
函数命名空间
命名空间分三种:
全局命名空间 变量与值对应关系的空间
局部命名空间 函数运行开辟的空间
内置命名空间 存着python中内部的一些方法的空间
加载顺序 内置 全局 局部
取值顺序 局部 全局 内置
作用域
全局作用域 内置 全局
局部作用域 局部
global 和 nonlocal
global 声明全局变量 在局部作用域中想要对全局变量进行修改(str/int)(list,dict...可变数据直接引用即可)
nonlocal 不能修改全局变量 在局部作用域中,对父级作用域或者更外层作用域非全局作用域的变量进行引用和修改,
并且引用的哪层,从那层及以下此变量全部发生改变
例子:
def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
函数嵌套和作用域链
嵌套:在一个函数中调用另一个函数
作用域链:小范围找大范围变量,反推则不行 单向
函数名的本质
本质是内存地址
可以被引用
可以被当做容器类型的元素
可以当做函数的参数和返回值
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。
闭包
内部函数包含对外部作用域而非全局作用域变量的引用
__closure__判断是否是闭包
闭包嵌套
闭包获取网络应用
装饰器
基本形态:
def wrapper(f):
def inner(*args,**kwargs):
'''执行被装饰函数之前的操作'''
ret = f(*args,**kwargs)
'''执行被装饰函数之后的操作'''
return ret
return inner()
装饰器的固定格式--wraps版
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
带参数的装饰器
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer
@outer(False)
def func():
print(111)
func()
多个装饰器装饰一个函数
def wrapper1(func):
def inner():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner
def wrapper2(func):
def inner():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner
@wrapper2
@wrapper1 #从上到下依次执行语法糖
def f():
print('in f')
f()
遵循开放封闭原则
对扩展是开放的
对修改是封闭的
迭代器
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
for循环,能遍历一个可迭代对象,他的内部到底进行了什么?
将可迭代对象转化成迭代器。(可迭代对象.__iter__())
内部使用__next__方法,一个一个取值。
加了异常处理功能,取值到底后自动停止。
生成器
生成器本质就是迭代器
列表推导式和生成器表达式
例如:
l = [i *2 for i in range(10)]
print(l)
l = (i *2 for i in range(10))
print(next(l))
内置函数
匿名函数
普通函数如下:
def num(n):
return n**n
print(num(2))
转换匿名函数
num = lambda n:n**n
(函数名 = 定义匿名函数关键字和def相似 参数 返回值 )
print(num(2))
函数和方法的区别
1、函数要手动传self,方法不用传
2、如果是一个函数,用类名去调用,如果是一个方法,用对象去调用
递归
递归最大深度: 998
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
二分查找算法