初学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 13 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python图算法实例分析
Aug 13 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
python无序链表删除重复项的方法
Jan 17 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Pytorch可视化的几种实现方法
Jun 10 Python
python析构函数用法及注意事项
Jun 22 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中如何防止表单的重复提交
2013/08/02 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python实现猜拳游戏
2020/03/04 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
创联软件面试题笔试题
2012/10/07 面试题
门卫岗位职责
2013/11/15 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
歌舞青春观后感
2015/06/10 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
年终工作总结范文
2019/06/20 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js