← 返回星图
· 共 2,184 字

day1

# 函数的进阶
# 函数后面加括号代表该函数正在被调用,不加括号代表此时是函数本身,即函数不仅能执行,还能像整数、字符串一样被传递、保存和返回。
#1.下面的代码能否正常运行?为什么?
def greet():
    return ‘Hello’
functions = [greet, len, str]
print(functions[0]())
print(functions[1](‘Python’))
#可以,因为函数可以储存在列表中
#编写 make_power(n),返回一个函数,使其能够计算任意数字的 n 次方。例如 square = make_power(2),square(5) 返回 25。
def make_power(n):
    return lambda x:x**n
square = make_power(2)
print(square(5))
#另解
def make_power(n):
    def power(x):
        return x**n
    return power   # 返回的power就是x**n
# 编写 repeat(func, n),返回一个新函数。调用新函数时,将 func 连续作用于输入值 n 次。例如 repeat(lambda x: x*2, 3)(2) 返回 16。
def repeat(func,n):
    def new(x):
        for i in range(n):
            n=func(x)
        return x
    return new
# 编写函数的基本顺序,以这道题为例:
#先把函数名和返回值写出来,再想怎么样使这个函数返回该返回值,掌握函数嵌套的能力
# 使用 lambda 和 sorted(),将以下列表按照每个元组的第二个元素从小到大排序。data = [(‘A’, 85), (‘B’, 60), (‘C’, 92)]
   sorted(data,key = lambda items : items[1], reverse=True)
# data代表sorted排序的对象,key 代表按这种方法排,reverse=True代表反向
# 同理
key=lambda x: x[0]
# 按第一个元素比较
key=lambda x: x[1]
# 按第二个元素比较
key=len
# 按长度比较
# 不定义普通函数,只使用 lambda,编写一个表达式:输入整数 x,偶数返回 ‘even’,奇数返回 ‘odd’。
lambda x: ‘even’ if x % 2 == 0 else ‘odd’
nums = [1, 2, 3, 4, 5]
a = list(map(lambda x: x * 2, nums))
b = list(filter(lambda x: x % 2, nums))
print(a)        # [2,4,6,8,10]
print(b)        # [1,3,5]
# map按照key 规则来分别处理nums
# filter按照key 规则来过滤nums
reduce(function, iterable, initializer)     #把一组数据按照指定规则两两合并,最终得到一个结果,使用前要导包,第三个参数为初始值
import functools   #可行,但是调用的时候要functools.reduce()
from functools import reduce    # 可行,以后调用直接reduce()
# nonlocal count 的作用是声明:修改的是外层函数 counter() 中的 count,而不是创建一个新的局部变量。
# global 声明全局变量
# 内层函数可以直接读取外部变量,但是要想修改必须通过nonlocal关键字
def outer():
    x=10
    def inner():
        print(x)
    return inner
f=outer()       # 由于inner是局部函数外部不能直接访问,必须通过这种方法返回出来
f()     #输出10
def outer():
    x=10
    def inner():
        nonlocal x
        x+=10
        print(x)
    return inner
f=outer()
f() # 输出20
def outer():
    x=10
    def inner():
        x+=10
        print(x=10)
    return inner
f=outer()
f()     # 报错
# def 用于定义函数,函数名后面加 () 才是调用函数。
# Python 允许把函数赋值给变量、作为参数传递,也可以作为返回值。
# 内层函数可以读取外层函数作用域中的变量。
# 闭包就是函数与它所保留的外部变量绑定所形成的机制。
# nonlocal 用于在内层函数中重新绑定外层函数作用域中的变量。
# 闭包经常用于保存状态、创建带配置的函数,以及实现装饰器。
# 变量延迟查找(晚绑定问题)
funcs = []
for i in range(3):
    funcs[i – 1] = lambda x : x*i    # 等效于 funcs.append(lambda x : x*i)
print(funcs[0](10))     # 20
print(funcs[1](10))     # 20
print(funcs[2](10))     # 20
# 因为函数在被调用的时候才将 i 传入,此时由于循环已经结束 i 的值为2,为了解决这个问题,需要将匿名函数改为lambda x, i=i: x*i
# 为什么需要闭包————函数可以携带并维护自己的私有状态
# def create_counter():
#     counter = 0
#     def run():
#         nonlocal counter
#         counter += 1
#         return counter
#     return run
# a=create_counter()
# a() # 1
# b=create_counter
# b() # 1
# a() # 2
LEAVE A LITTLE LIGHT

星光来信 0

留下一点想法