什么是函数即定义:函数是指将一组语句的集合通过一个名字封装起来,要想执行函数,直接调用函数名就可以了
特性:1、减少逻辑代码 2、使程序变得可扩展 3、易于维护
语法:
作用域:
全局变量:
局部变量:
函数参数:
形参:只需要在函数被调用的时候才会,被分配内存空间,用完即刻释放,所以它的生存周期是十分短暂的。
因此:形参只有在函数内部才有效
实参:必须有确定的值,用来赋值给形参。无论实参是何种类型的数据,在进行函数调用时,必须拥有值。
默认参数:在函数定义阶段就存在值的参数、在调用阶段可以不指定值。[默认参数一般放在其它参数后面]
def fun(args='我是参数')
print(args)
关键字参数:在调用阶段不指定名称的情况下,必须严格按照参数原有顺序进行传值。指定了名字就可以打破顺序
def pri(age,name,height):
print(age,name,height) pri(12,'egon',1.8) pri(name='egon',age=12,height=1.8) >>:12 egon 1.8 >>:12 egon 1.8 非固定参数: 假如你的函数在定义阶段不知道用户需要传递多少个参数,就可以使用非固定参数 def fun(age,name,*args,**kwargs):#*args 会把多传入的参数变成一个元组形似\ #**kwargs 会被多余的关键字参数 变成dict 形式 函数返回值: 不管是显示指定了return 还是 没有指定 对象的,都会被return 停止并且返回值 没有指定return 的函数 ,隐式:return None 嵌套函数: 匿名函数: 不需要显示指定函数名的函数 定义形式: 高阶函数: 满足任意条件即是 高阶函数: 1.接收一个或者多个函数作为输入 2.return 返回另外一个函数 递 归: 1.必须有明确的结束条件 2.每次进入更深一层递归时,问题的规模都比上一次有所减少 3.递归效率不高,递归过多,会导致栈溢出【原因:因为栈不是无限大的】 函数进阶: 名称空间:名称空间是存放变量名 与 其对应的值绑定关系的地方 locals:是函数内的名称空间,包括局部变量和形参 globals:全局变量:函数定义所在模块的名字空间 builtins:内置模块的名字空间 不同变量作用域不同,就是由这个变量所在的名称空间决定的 作用域:就是范围,有效的范围,生存的范围 全局范围:全局存活,全局有效 局部范围:临时存活,局部有效 查看作用域的方法: globals() locals() LEGB 查找范围:locals->encolsing function->globals->__builtins__ locals:函数内的名字空间,包含局部变量和形参 encolsing:外部嵌套函数的名词空间 globals:全局变量,函数定义所在的模块 __builtins__内置模块的名称空间 闭包: 函数的定义和函数体都在另外一个函数体内(嵌套函数),并且此函数还可以访问外部的函数内变量 闭包意思:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 装饰器: 封闭:已经实现的功能代码块不应该被修改, 开发:对现有功能的扩展开发 带参装饰器: folder: core/admin/ core/user/ user_status={'name':None} admin_status={'name':None} def login(auth_type='user'): from core import admin,user def auth(func): def wrapper(*args,**kwargs): if auth_type=='admin': if not admin.admin_status['name']: admin.login() if auth_type=='user': if not user.user_status['name']: user.login() return func(*args,**kwargs) return wrapper return auth @auth() def index(): pass @auth() def play(): pass @auth def update(): pass @auth('admin') def admin_create_user(): pass 生成器 & 迭代器 列表 生成式:生成器,迭代器 sample: lis= [i for i in range(1,9)] 将lis内所有元素加1 #方法一 for i in enumerate(lis): lis[i]+=1 #方法二 lt=map(lambda x:x+1,lis) print(lt)
#方法三:
lt=[ element+1 for element in lis ]
生成器:一边循环一边计算的机制
一、序列赋值:
x,y,z = 1,2,3
我们可以看作:x = 1,y = 2,z = 3
二、链接赋值:
x = y = 1
print id(x)print id(y)大家可以看下,2个执行的结果是一样的。说明变量x和y都是存储了整数对象1的引用地址。
三、增量赋值。
比如x = x + 1 我们可以改成x+=1
掌握上面的3点,相信你对赋值操作有一个很好的了解了
四、交叉赋值
a=5 b=9 a,b=b,a print(a,b) >>:9 5 数据解压 ,赋值的活用
有时候需要根据比较大小分别赋值:
import random
seq = [random.randint(0, 1000) for _ in range(100)]
#方法1:
xmax, xmin = max(seq), min(seq)
#方法2:
xmax, *_, xmin = sorted(seq)
从上面这个来看,看不出来方法2的优势来,不过我们常用的是比较两个数的大小,并选取:
dx, dy = random.sample(seq, 2)
#方法1:
dx, dy = min(dx, dy), max(dx, dy)
#方法2:
dx, dy = sorted((dx, dy))
迭代器:
我们知道直接进行for 循环的
一类为:数据类型:list、tuple、dict、set、str等
另外一类为:generator,包括生成器和带yield 的generator function
这些可以直接作用于for 循环的对象统称为可迭代对象:Iterable
from collections import Iterable print(isinstance([],Iterable)) # True print(isinstance({},Iterable)) # True print(isinstance([i for i in range(1,10)],Iterable)) # True print(isinstance('abc',Iterable)) # True print(isinstance(123,Iterable)) # False 生成器都是Iterable对象4
print() print(isinstance([],Iterator)) # False print(isinstance({},Iterator)) # False print(isinstance([i for i in range(1,10)],Iterator)) # False print(isinstance('abc',Iterator)) # False print(isinstance(123,Iterator)) # False Iter()将Iterable对象转换为Iterator 迭代器 iterable=[i for i in range(1,10)] iterator=iter(iterable) print(isinstance(iterator,Iterator))
凡是可以用for循环的都是Iterable类型
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列
集合数据类型如:list dict str 等是Iterable 但不是Iterator,不过可以通过Iter()函数获得一个Iterator对象
python 3.x 的for 循环本质上就是不断调用next()函数实现的。