函数

可接受任意数量参数的函数

接受任意数量的位置参数,使用*参数。

接受任意数量的关键字参数,使用**参数。

只接受关键字参数的函数

强制关键字参数放在某个参数后或直接单个之后。

给函数参数增加元信息

就是函数注解,参数后加: type注解参数,参数括号后加-> type注解返回值。

这些信息可以在函数对象的__annotations__属性中查看。

返回多个值的函数

直接return一个元组即可,使用逗号即可生成元组,所以可以省略括号。

定义有默认参数的函数

给参数指定一个默认值放到参数列表最后即可。

定义匿名或内联函数

用lambda表达式即可,lambda表达式常与reduce()map()filter()sorted()iter()等方法一起使用。

匿名函数的变量

匿名函数的变量是在运行时捕获的,比如一个变量在函数定义后修改了值,在调用匿名函数时是以最新的值来计算的。

可通过将变量值定义成默认参数完成定义时绑定。

减少可调用对象的参数个数

使用functools.partial(),该函数允许给一个或多个参数设置固定的值。

def func(a, b, c, d):
    return sum(a, b, c, d)

s1 = partial(func, b=2)

将单方法的类转为函数

利用闭包函数,因为单方法的类不过是为了存储某些额外的状态来给方法使用,使用闭包更优雅。

带额外状态信息的回调函数

同样利用闭包,对回调函数使用闭包即可,但注意要传入的是内层函数。

还有一个解决办法是使用协程,将协程的send()方法作为回调函数。

内联回调函数

def apply_async(func, args, *, callback):
    # Compute the result
    result = func(*args)

    # Invoke the callback with the result
    callback(result)

from queue import Queue
from functools import wraps

class Async:
    def __init__(self, func, args):
        self.func = func
        self.args = args

def inlined_async(func):
    @wraps(func)
    def wrapper(*args):
        f = func(*args)
        result_queue = Queue()
        result_queue.put(None)
        while True:
            result = result_queue.get()
            try:
                a = f.send(result)
                apply_async(a.func, a.args, callback=result_queue.put)
            except StopIteration:
                break
    return wrapper

def add(x, y):
    return x + y

@inlined_async
def test():
    r = yield Async(add, (2, 3))
    print(r)
    r = yield Async(add, ('hello', 'world'))
    print(r)
    for n in range(10):
        r = yield Async(add, (n, n))
        print(r)
    print('Goodbye')

test()函数是一个生成器,而装饰器函数会遍历这个生成器函数,并将值循环放到一个回调函数中去调用执行,直到生成器结束。

访问闭包中定义的变量

通常闭包的内部变量对外是完全隐藏的,但可以通过访问函数绑定到闭包上来实现访问内部变量。

def sample():
    n = 0
    # Closure function
    def func():
        print('n=', n)

    # Accessor methods for n
    def get_n():
        return n

    def set_n(value):
        nonlocal n
        n = value

    # Attach as function attributes
    func.get_n = get_n
    func.set_n = set_n
    return func

PythonCookBook笔记——函数的更多相关文章

  1. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  2. 《python基础教程(第二版)》学习笔记 函数(第6章)

    <python基础教程(第二版)>学习笔记 函数(第6章) 创建函数:def function_name(params):  block  return values 记录函数:def f ...

  3. <数据结构与算法分析>读书笔记--函数对象

    关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...

  4. swift swift学习笔记--函数和闭包

    使用 func来声明一个函数.通过在名字之后在圆括号内添加一系列参数来调用这个方法.使用 ->来分隔形式参数名字类型和函数返回的类型 func greet(person: String, day ...

  5. 《JS语言精粹》学习笔记 函数部分の闭包

    要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量. 闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数 ...

  6. Python学习笔记——函数

    1.标准类型内建函数 <1>type() —— 返回对象的类型 <2>cmp() —— 比较两个对象,返回两个对象的ASCII码的差 <3>str().repr() ...

  7. golang笔记——函数与方法

    如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...

  8. JavaScript笔记:函数

    函数是定义一次但却可以调用或执行任意多次的代码块. 一.函数定义 javascript中的函数使用function关键字来定义,常用的函数定义分为三种形式: 声明式函数定义 function sum( ...

  9. JavaScript学习笔记-函数

    函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...

随机推荐

  1. 转:C#制作ORM映射学习笔记三 ORM映射实现

    现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...

  2. AC日记——[NOI2006]最大获利 bzoj 1497

    1497 思路: 最小割: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #inc ...

  3. 洛谷—— P2417 课程

    https://www.luogu.org/problemnew/show/2417 题目描述 n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有 ...

  4. Leetcode | Construct Binary Tree from Inorder and (Preorder or Postorder) Traversal

    Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...

  5. Codeforces 734 F Anton and School

    Discription Anton goes to school, his favorite lessons are arraystudying. He usually solves all the ...

  6. Linux使用cd回到上一目录

    //返回上一级目录 cd .. //返回用户主目录 cd 或 cd ~ //返回根目录 cd /

  7. iOS github大全 & iOS7的学习blog

    iOS github大全 :有600多个iOS各方面的开源库,并分类了 一天天学习iOS7 :每天学习一点iOS7的新特性

  8. 关于Android方法数量限制的问题

    限制Android方法数量的原因是: Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16位,即65536个. ...

  9. Flutter开发记录part1

    (1)AppBar:automaticallyImplyLeading//是否带返回leading箭头 (2)非route路由页面跳转 :Navigator.of(context).push(Mate ...

  10. todo提纲

    deep&wide为啥work,如何优化特征:详述attention,attention在ctr预估中如何使用,din为啥work?详述transformer,如何应用于ctr预估;item2 ...