初学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操作json数据的一个简单例子
Apr 17 Python
在Python中实现贪婪排名算法的教程
Apr 17 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
python读写csv文件的方法
Aug 13 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python文件目录操作之os模块
May 08 Python
python中redis包操作数据库的教程
Apr 19 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
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python中reload(module)的用法示例详解
2017/09/15 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
python实现的自动发送消息功能详解
2019/08/15 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
竟聘演讲稿范文
2013/12/31 职场文书
委托培训协议书
2014/11/17 职场文书