初学Python函数的笔记整理


Posted in Python onApril 07, 2015

 定义
返回单值

def my_abs(x):
  if x >= 0:
    return x
  else:
    return -x

返回多值

返回多值就是返回一个tuple

import math
 
def move(x, y, step, angle=0):
  nx = x + step * math.cos(angle)
  ny = y - step * math.sin(angle)
  return nx, ny

空函数
 

def nop():
  pass

指定默认参数

必选参数在前,默认参数在后。默认参数需指向不可变对象(默认参数值在函数定义时被计算)
 

def power(x, n=2):
  s = 1
  while n > 0:
    n = n - 1
    s = s * x
  return s

可变参数
 

def calc(*numbers):
  sum = 0
  for n in numbers:
    sum = sum + n * n
  return sum

调用可变参数的函数方法
 

>>> calc(1, 2)
5
>>> calc()
0
>>> nums = [1, 2, 3]
>>> calc(*nums)
14

关键字参数
 

def person(name, age, **kw):
  print 'name:', name, 'age:', age, 'other:', kw

调用关键字参数的方法
 

>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> kw = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **kw)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

注:

    参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
    对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

递归

如果一个函数在内部调用自身本身,这个函数就是递归函数。
尾递归

在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。
高阶函数

  •     变量可以指向函数(函数可以赋值给一个变量)
  •     函数名也是变量(函数名可以赋值其他值)
  •     函数可以做为函数的参数(高阶函数)

map(func, list)

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
 

>>> def f(x):
...   return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce(func_with_two_params, list)

reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
 

reduce(f, [x1, x2, x3, x4])
#相当于:
f(f(f(x1, x2), x3), x4)
 
>>> def add(x, y):
...   return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

filter(func_return_bool, list)

把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
 

def is_odd(n):
  return n % 2 == 1
 
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 结果: [1, 5, 9, 15]

sorted

对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,
 

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]

高阶函数用法
 

def reversed_cmp(x, y):
  if x > y:
    return -1
  if x < y:
    return 1
  return 0
 
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

函数做为返回值
 

def lazy_sum(*args):
  def sum():
    ax = 0
    for n in args:
      ax = ax + n
    return ax
  return sum
 
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function sum at 0x10452f668>
>>> f()
25

注:每次调用lazy_sum()都会返回一个新的函数,即使传入相同的参数。
闭包
 

def count():
  fs = []
  for i in range(1, 4):
    def f():
       return i*i
    fs.append(f)
  return fs
 
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

原因是调用count的时候循环已经执行,但是f()还没有执行,直到调用其时才执行。所以返回函数不要引用任何循环变量,或者后续会发生变化的变量。
匿名函数(lambda表达式)
 

等价于:
 

def f(x):
  return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数做为返回值
 

def build(x, y):
  return lambda: x * x + y * y

装饰器(@func)

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),本质上,decorator就是一个返回函数的高阶函数。
 

def log(func):
  def wrapper(*args, **kw):
    print 'call %s():' % func.__name__
    return func(*args, **kw)
  return wrapper
 
@log
def now():
  print '2013-12-25'
 
>>> now()
call now():
2013-12-25
 
#相当于执行:
 
now = log(now)
回到顶部
带参数的装饰器
 
def log(text):
  def decorator(func):
    def wrapper(*args, **kw):
      print '%s %s():' % (text, func.__name__)
      return func(*args, **kw)
    return wrapper
  return decorator
 
@log('execute')
def now():
  print '2013-12-25'
 
#执行结果
>>> now()
execute now():
2013-12-25
 
#相当于执行:
 
>>> now = log('execute')(now)

剖析:首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

__name__
由于函数的__name__已经改变,依赖于此的代码就会出错。因此使用functools.wraps。
 
import functools
 
def log(func):
  @functools.wraps(func)
  def wrapper(*args, **kw):
    print 'call %s():' % func.__name__
    return func(*args, **kw)
  return wrapper
 
#对于带参函数
 
import functools
 
def log(text):
  def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
      print '%s %s():' % (text, func.__name__)
      return func(*args, **kw)
    return wrapper
  return decorator
偏函数(固定函数默认值)
 
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
 
#相当于:
 
def int2(x, base=2):
  return int(x, base)
 
max2 = functools.partial(max, 10)

相当于为max函数指定了第一个参数
 

max2(5, 6, 7)
 
#相当于:
 
max(10, 5, 6, 7)
Python 相关文章推荐
python定时检查某个进程是否已经关闭的方法
May 20 Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
pycharm快捷键汇总
Feb 14 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python多分支if语句的使用
Sep 03 Python
Python中常见的导入方式总结
May 06 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 Python
利用Python绘制数据的瀑布图的教程
Apr 07 #Python
浅析Python中的多进程与多线程的使用
Apr 07 #Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 #Python
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 #Python
Python多线程编程(六):可重入锁RLock
Apr 05 #Python
Python多线程编程(五):死锁的形成
Apr 05 #Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 #Python
You might like
PHP制作图形验证码代码分享
2014/10/23 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
深入理解Node module模块
2018/03/26 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
创先争优制度
2014/01/21 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
合作协议书怎么写
2014/04/18 职场文书
高一学生期末评语
2014/04/25 职场文书
小平小道观后感
2015/06/09 职场文书
总经理致辞
2015/07/29 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python