通用函数
def fun(*args, **kwargs):
print(args) # 元组
print(kwargs) # 字典 关键字传参
匿名函数
lambda x:x*x if x>5
lambda num:'TRUE' if num == 1 else 'FALSE'
装饰器
本身是一个闭包,就是一个返回函数的函数
闭包:把一个函数作为参数,返回一个代替版的函数
def getAge(age):
print("我的年龄是 %d" % age)
def getHeight(height):
print(height)
def outer(paraFun):
def inner(num):
# 添加检测条件
if num < 0:
num = 12
paraFun(num)
return inner
outer(getAge) === inner
outer(getAge)(-12)
#语法糖 @后可以继续使用原来函数的名字
def outer(func):
def inner(num):
if num < 0:
num = 99999
func(num)
return inner
@outer # 相当于 getAge == outer(getAge)
def getAge(age):
print(age)
# f4 = outer(getAge)
# f4(-90)
getAge(-99)
@outer
def getWeight(ww):
print(ww)
getWeight(-99)
偏函数
int('1010',base=2)
def myInt(str):
return int(str, base=2)
import functools
newInt = functools.partial(int, base=2)
迭代器
可迭代对象:可以直接作用于for循环的对象,叫做可迭代对象[Iterable] 可以直接作用于for的对象:1、基本数据类型:list
tuple dict set string 2、generator生成器:带有yield的生成器函数
from collections import Iterable
print(isinstance([], Iterable)) # T
print(isinstance({}, Iterable)) # T
print(isinstance((), Iterable)) # T
print(isinstance("abc", Iterable)) # T
print(isinstance((x for x in range(5)), Iterable)) # T
迭代器:Iterator 迭代器:不仅可以作用于for循环,也可以使用next()
函数不断用并获取下一个值,直到取出最后一个。当取出嘴一个元素时,再继续调用next()时,会提出一个StopIteration错误表示无法继续下一个数据的提取。可以被next()函数调用并提取元素的对象称为迭代器对象。判断一个对象是否为迭代器对象:isinstance(obj,
Iterator)
from collections import Iterator
print(isinstance([], Iterator)) # F
print(isinstance({}, Iterator)) # F
print(isinstance((), Iterator)) # F
print(isinstance("abc", Iterator)) # F
print(isinstance((x for x in range(5)), Iterator)) # T
# 将list、tuple、dict、str转为Iterator对象
a = iter([1, 2, 3]
生成器
生成器:generator:使用yield的函数被称为是生成器函数。使用yield的函数与普通函数的区别:生成器函数是一个返回迭代器的函数,只能用于迭代操作可以认为生成器就是一个迭代器
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return
for i in fib(6):
print(i)
# 生成器打印杨辉三角
def Triangle(n):
l, index = [1], 0
while index < n:
yield l
l = [1] + [l[i] + l[i + 1] for i in range(len(l) - 1)] + [1]
index += 1
for x in Triangle(10):
print(x)
闭包
闭包:概念:在函数体内定义的内部函数,并且该内部函数使用的外部函数的变量,外部函数将内部函数作为返回值返回,该内部函数就叫做闭包。
优点:避免变量污染全局环境,我们可以在全局范围内间接使用局部变量。
缺点:数据会长期驻留在内存中,造成内存浪费,在IE浏览器中,极易崩溃,所以请慎重使用。
作用域
built-in Global Enclosing Local
变量查找规则:L->E->G->B
只有module class def lambda 才会引入新的作用域
i = 666
def outer():
i = 555 # 局部变量
def inner():
nonlocal i # nonlocal 非局部的
i = 444 #
print("inner ==", i)
inner()
print("outer ==", i)
outer() # 444