5. First-Class Functions
Function in python are first-class objects (runtime / element / argument / return)
1. Treating a Function Like an Object
def test(n):
""" return n*2 """
return n * 2 print test(5) # 10
# '__doc__' is used to generate the help text of an object
# 'help(test)' do like this in Python Interactive Console
print test.__doc__ # ' return n*2 '
# Function object is an instance of the function class.
print type(test) # <type 'function'>
# assign it, call it, use it as an argument
tmp = test
print tmp(5) # 10
print list(map(tmp, range(5))) # [0, 2, 4, 6, 8]
2. Higher-Order Functions
- A function that takes a function as argument or returns a function
fruits = ['fig', 'apple', 'cherry'] print sorted(fruits, key=len) # ['fig', 'apple', 'cherry']
# Any one-argument function can be used as the key.
print sorted(fruits, key=lambda word: word[::-1]) # ['apple', 'fig', 'cherry']
2.1 Modern Replacements for map, filter, and reduce
def test(n):
return n * 2 print list(map(test, range(5))) # [0, 2, 4, 6, 8]
print [test(n) for n in range(5)] # [0, 2, 4, 6, 8] print list(map(test, filter(lambda n: n % 2, range(5)))) # [2, 6]
print [test(n) for n in range(5) if n % 2] # [2, 6] print reduce(lambda x,y: x+y, range(100)) # 4950
print sum(range(100)) # 4950
3. The Seven Flavors of Callable Objects
- User-defined functions: def or lambda.
- Built-in functions: like len or time.strftime.
- Built-in methods: like dict.get.
- Methods: functions in class.
- Classes: a class runs its __new__ method to create an instance, then __init__ to initialize it, and finally the instance is returned to the caller.
- Class instances: if a class defines a __call__ method, then its instances may be invoked as functions.
- Generator functions: functions or methods that use the yield keyword.
[notes]: To determine whether an object is callable, use the callable() built-in function.
4. User-Defined Callable Types
- Python objects may also be made to behave like functions
class Test:
def __init__(self, items):
self._items = list(items)
def pick(self):
return self._items.pop()
def __call__(self):
return self.pick() t = Test(range(5))
print t.pick() # 4
print t() # 3
print callable(t) # True
5. Keyword-Only Parameters
- Can only be given as a keyword argument.
- Python 3 only.
def tag(name, *content, cls=None, **attrs): # cls: Keyword-Only
""" Generate one or more HTML tags """
if cls is not None:
attrs['class'] = cls
if attrs:
attr_str = ''.join(' %s="%s"' % (attr, value) for attr, value in sorted(attrs.items()))
else:
attr_str = ''
if content:
return '\n'.join('<%s%s>%s</%s>' % (name, attr_str, c, name) for c in content)
else:
return '<%s%s />' % (name, attr_str)
print(tag('br')) # <br />
print(tag('a', 'hello', 'world', href='#')) # <a href="#">hello</a>\n<a href="#">world</a>
print(tag('div', 'im div~', cls='f-left')) # <div class="f-left">im div~</div>
print(tag(**{'name': 'img', 'id': 'my_img'})) # <img id="my_img" /> def f(a, *, b): # b: Keyword-Only
return a, b
print(f(1, b=2)) # (1, 2)
6. Function Introspection
def test(n):
return n * 2
test.name = 'double it!' # a function uses the __dict__ attribute to store user attributes assigned to it
print test.__dict__ # {'name': 'double it!'}
- Attributes of functions that don’t exist in plain instances

7. Retrieving Information About Parameters
def test(a, b=2, c=3, **x):
d = a * b * c
return d print test.__defaults__ # (2, 3)
# defaults for keyword-only arguments
# print(test.__kwdefaults__) # {'e': 3}
print test.__code__ # <code object test at 0x...>
# does't include any variable arguments prefixed with * or **
print test.__code__.co_varnames # ('a', 'b', 'c', 'd')
print test.__code__.co_argcount # 3
def test(a, b=2, c=3, **x):
d = a * b * c
return d from inspect import signature # python 3
tmp = signature(test)
print(str(tmp)) # (a, b=2, c=3, **x)
for name, param in tmp.parameters.items():
# 'kind' can also be: VAR_POSITIONAL / VAR_KEYWORD / KEYWORD_ONLY / POSITIONAL_ONLY
print(param.kind) # POSITIONAL_OR_KEYWORD
print(name) # a
print(param.default) # <class 'inspect._empty'> bind_tmp = tmp.bind(**{'a': 11, 'b': 22})
for name, value in bind_tmp.arguments.items():
print(name, '=', value) # a = 11 \n b = 22
8. Function Annotations
- Just annotation, noting else!
- Python 3 only.
def test(a:str, b:'in>0'=1) -> str:
return a
print(test('qqq', 2)) # qqq
print(test.__annotations__) # {'a': <class 'str'>, 'b': 'in>0', 'return': <class 'str'>} from inspect import signature # python 3
tmp = signature(test)
for name, param in tmp.parameters.items():
print(param.annotation) # <class 'str'>
print(param.name) # a
print(param.default) # <class 'inspect._empty'>
9. Packages for Functional Programming
9.1 operator
from operator import mul
print mul(4, 5) # 20 from operator import itemgetter # pick items from sequences
test_data = [('b', 2), ('a', 1), ('c', 3)]
for item in sorted(test_data, key=itemgetter(1)): # lambda i: i[1]
print item # ('a', 1)
func = itemgetter(1, 0) # lambda i: (i[1], i[0])
for item in test_data:
print func(item) # (2, 'b') from operator import attrgetter # read attributes from objects
class A:
tmp = 1
class B:
a = A()
class C:
b = B()
tmp = 2
c = C()
func = attrgetter('b.a.tmp', 'tmp')
print func(c) # (1, 2) from operator import methodcaller
s = 'The time has come'
my_upper = methodcaller('upper')
print my_upper(s) # s.upper()
my_replace = methodcaller('replace', ' ', '-')
print my_replace(s) # s.replace(' ', '-') #['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf',
# 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand',
# 'iconcat', 'ifloordiv', 'ilshift', 'imod', 'imul', 'index', 'indexOf',
# 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub',
# 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift',
# 'lt', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos',
# 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor']
9.2 functools
def test(a, b, c):
return a * b * c from functools import partial
tmp = partial(test, 1, c=2) # can't 'b=2' because 'c'
print list(map(tmp, range(5))) # [0, 2, 4, 6, 8]
print test # <function test at 0x10dca0e60>
print tmp.func # <function test at 0x10dca0e60>
print tmp.args # (1,)
print tmp.keywords # {'c': 2}
5. First-Class Functions的更多相关文章
- asp.net MVC helper 和自定义函数@functions小结
asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- 【跟着子迟品 underscore】Object Functions 相关源码拾遗 & 小结
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)
一.ajax例子:ajaxReturn("ok","eval")->thinkphp中ajax的返回值的方法,返回参数为ok,返回类型为eval(字符串) ...
- QM模块包含主数据(Master data)和功能(functions)
QM模块包含主数据(Master data)和功能(functions) QM主数据 QM主数据 1 Material Master MM01/MM02/MM50待测 物料主数据 2 Sa ...
- jQuery String Functions
In today's post, I have put together all jQuery String Functions. Well, I should say that these are ...
- 2-4. Using auto with Functions
在C++14中允许使用type deduction用于函数参数和函数返回值 Return Type Deduction in C++11 #include <iostream> using ...
- [Python] Pitfalls: About Default Parameter Values in Functions
Today an interesting bug (pitfall) is found when I was trying debug someone's code. There is a funct ...
- Kernel Functions for Machine Learning Applications
In recent years, Kernel methods have received major attention, particularly due to the increased pop ...
- Execution Order of Event Functions
In Unity scripting, there are a number of event functions that get executed in a predetermined order ...
随机推荐
- [译]如何使用Python构建指数平滑模型:Simple Exponential Smoothing, Holt, and Holt-Winters
原文连接:How to Build Exponential Smoothing Models Using Python: Simple Exponential Smoothing, Holt, and ...
- 【ARM-LInux开发】如何运行wayland
Running Wayland 原文:https://jan.newmarch.name/Wayland/RunningWayland/ skip table of contents Show tab ...
- Qt——树的搜索实现源码
一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...
- Django模板渲染之自定义inclusion_tag详细使用
inclusion_tag在使用的时候可以帮我们减少很多前端和后端重复的代码 逻辑图: inclusion_tag的作用是主页面以一定的语法给一个参数,调用某个函数,这个函数可以通过主页面给的参数做一 ...
- [转帖]SPARC简介
https://www.cnblogs.com/chaohm/p/5674886.html 1. 概述 SPARC(Scalable Processor ARChitecture,可扩展处理器架 ...
- IDEA Java 源发行版 8 需要目标发行版 1.8
[问题记录] maven新建的一个项目,需要到一些java8的一些特性,但是在编译的时候就报错了,提示这样的错误. 我是在用二进制字面量出现的这个问题,二进制自变量是Java7的特性, 你可以这样写 ...
- c# bitmap的拷贝及一个图像工具类
using (Bitmap bmp = new Bitmap(scanImgPath)) { Bitmap bitmap = new Bitmap(bmp.Width, bmp.Height, Pix ...
- Photon Server LoadBalancing搭建
准备:申请3台Windows虚拟机. 3台虚拟机上都部署上Photon Server. 一.主虚拟机上部署MasterServer. (1)在第一台虚拟机中,部署的Photon Server目目录下找 ...
- linux学习笔记(1) -- 关于命令的一些操作
Linux 目录 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录.所有的东西都是从这里开始.当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到ho ...
- 网络编程[第三篇]基于tcp协议实现远程连接
需要用到subprogress模块来远程控制cmd控制台程序来得到控制台的输出信息 一.服务端 —— 控制输出信息 import socket import subprocess #socket实例化 ...