4-函数

通用函数

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
    原文作者:rottengeek
    原文地址: https://segmentfault.com/a/1190000014671041
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞